On 12/24/22 00:16, Song Gao wrote:
+static void do_vmskltz(vec_t *Vd, vec_t *Vj, int bit, int n) +{ + switch (bit) { + case 8: + Vd->H[0] |= ((0x80 & Vj->B[n]) == 0) << n; + break; + case 16: + Vd->H[0] |= ((0x8000 & Vj->H[n]) == 0) << n; + break; + case 32: + Vd->H[0] |= ((0x80000000 & Vj->W[n]) == 0) << n; + break; + case 64: + Vd->H[0] |= ((0x8000000000000000 & Vj->D[n]) == 0) << n; + break; + default: + g_assert_not_reached(); + } +} + +static void do_vmskgez(vec_t *Vd, vec_t *Vj, int bit, int n) +{ + Vd->H[0] |= !((0x80 & Vj->B[n]) == 0) << n; +} + +static void do_vmsknz(vec_t *Vd, vec_t *Vj, int bit, int n) +{ + Vd->H[0] |= (Vj->B[n] == 0) << n; +}
The bit collection and compaction can be done with a set of integer shifts. E.g. helper_cmpbe0 in target/alpha/int_helper.c.
r~