target/ppc: Implemented vector module quadword
Implement the following PowerISA v3.1 instructions: vmodsq: Vector Modulo Signed Quadword vmoduq: Vector Modulo Unsigned Quadword Signed-off-by: Lucas Mateus Castro (alqotel) <lucas.araujo@eldorado.org.br> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/744 Message-Id: <20220525134954.85056-9-lucas.araujo@eldorado.org.br> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
5adb27cd8f
commit
b80bec3a07
@ -181,6 +181,8 @@ DEF_HELPER_FLAGS_3(VDIVESD, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VDIVEUD, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VDIVESQ, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VDIVEUQ, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMODSQ, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(VMODUQ, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(vslo, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(vsro, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
DEF_HELPER_FLAGS_3(vsrv, TCG_CALL_NO_RWG, void, avr, avr, avr)
|
||||
|
@ -807,3 +807,5 @@ VMODSW 000100 ..... ..... ..... 11110001011 @VX
|
||||
VMODUW 000100 ..... ..... ..... 11010001011 @VX
|
||||
VMODSD 000100 ..... ..... ..... 11111001011 @VX
|
||||
VMODUD 000100 ..... ..... ..... 11011001011 @VX
|
||||
VMODSQ 000100 ..... ..... ..... 11100001011 @VX
|
||||
VMODUQ 000100 ..... ..... ..... 11000001011 @VX
|
||||
|
@ -1247,6 +1247,27 @@ void helper_VDIVEUQ(ppc_avr_t *t, ppc_avr_t *a, ppc_avr_t *b)
|
||||
}
|
||||
}
|
||||
|
||||
void helper_VMODSQ(ppc_avr_t *t, ppc_avr_t *a, ppc_avr_t *b)
|
||||
{
|
||||
Int128 neg1 = int128_makes64(-1);
|
||||
Int128 int128_min = int128_make128(0, INT64_MIN);
|
||||
if (likely(int128_nz(b->s128) &&
|
||||
(int128_ne(a->s128, int128_min) || int128_ne(b->s128, neg1)))) {
|
||||
t->s128 = int128_rems(a->s128, b->s128);
|
||||
} else {
|
||||
t->s128 = int128_zero(); /* Undefined behavior */
|
||||
}
|
||||
}
|
||||
|
||||
void helper_VMODUQ(ppc_avr_t *t, ppc_avr_t *a, ppc_avr_t *b)
|
||||
{
|
||||
if (likely(int128_nz(b->s128))) {
|
||||
t->s128 = int128_remu(a->s128, b->s128);
|
||||
} else {
|
||||
t->s128 = int128_zero(); /* Undefined behavior */
|
||||
}
|
||||
}
|
||||
|
||||
void helper_VPERM(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
||||
{
|
||||
ppc_avr_t result;
|
||||
|
@ -3381,6 +3381,8 @@ TRANS_FLAGS2(ISA310, VMODSW, do_vdiv_vmod, MO_32, do_modsw , NULL)
|
||||
TRANS_FLAGS2(ISA310, VMODUW, do_vdiv_vmod, MO_32, do_moduw, NULL)
|
||||
TRANS_FLAGS2(ISA310, VMODSD, do_vdiv_vmod, MO_64, NULL, do_modsd)
|
||||
TRANS_FLAGS2(ISA310, VMODUD, do_vdiv_vmod, MO_64, NULL, do_modud)
|
||||
TRANS_FLAGS2(ISA310, VMODSQ, do_vx_helper, gen_helper_VMODSQ)
|
||||
TRANS_FLAGS2(ISA310, VMODUQ, do_vx_helper, gen_helper_VMODUQ)
|
||||
|
||||
#undef DIVS32
|
||||
#undef DIVU32
|
||||
|
Loading…
Reference in New Issue
Block a user