target/i386: AVX pclmulqdq prep

Make the pclmulqdq helper AVX ready

Signed-off-by: Paul Brook <paul@nowt.org>
Message-Id: <20220424220204.2493824-21-paul@nowt.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paul Brook 2022-04-24 23:01:42 +01:00 committed by Paolo Bonzini
parent 0e29cea589
commit 5a09df21f7

View File

@ -2211,14 +2211,14 @@ target_ulong helper_crc32(uint32_t crc1, target_ulong msg, uint32_t len)
#endif
void glue(helper_pclmulqdq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
uint32_t ctrl)
#if SHIFT == 1
static void clmulq(uint64_t *dest_l, uint64_t *dest_h,
uint64_t a, uint64_t b)
{
uint64_t ah, al, b, resh, resl;
uint64_t al, ah, resh, resl;
ah = 0;
al = d->Q((ctrl & 1) != 0);
b = s->Q((ctrl & 16) != 0);
al = a;
resh = resl = 0;
while (b) {
@ -2231,8 +2231,23 @@ void glue(helper_pclmulqdq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
b >>= 1;
}
d->Q(0) = resl;
d->Q(1) = resh;
*dest_l = resl;
*dest_h = resh;
}
#endif
void glue(helper_pclmulqdq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
uint32_t ctrl)
{
Reg *v = d;
uint64_t a, b;
int i;
for (i = 0; i < 1 << SHIFT; i += 2) {
a = v->Q(((ctrl & 1) != 0) + i);
b = s->Q(((ctrl & 16) != 0) + i);
clmulq(&d->Q(i), &d->Q(i + 1), a, b);
}
}
void glue(helper_aesdec, SUFFIX)(CPUX86State *env, Reg *d, Reg *s)