On 3/27/23 20:06, Song Gao wrote:
+void HELPER(vmskltz_b)(CPULoongArchState *env, uint32_t vd, uint32_t vj) +{ + VReg temp; + VReg *Vd = &(env->fpr[vd].vreg); + VReg *Vj = &(env->fpr[vj].vreg); + + temp.D(0) = 0; + temp.D(1) = 0; + temp.H(0) = do_vmskltz_b(Vj->D(0)); + temp.H(0) |= (do_vmskltz_b(Vj->D(1)) << 8); + Vd->D(0) = temp.D(0); + Vd->D(1) = 0; +}
Better as uint16_t temp, instead of a full VReg.
+static uint64_t do_vmskltz_d(int64_t val) +{ + uint64_t m = 0x8000000000000000ULL; + uint64_t c = val & m; + c |= c << 63; + return c >> 63; +}
No mask or shift left required. r~