mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-22 03:11:09 +00:00
tcg: Implement tcg_gen_extract2_{i32,i64}
Will be helpful for s390x. Input 128 bit and output 64 bit only, which is sufficient for now. Backports commit 2089fcc9e7b4174d1c351eaa7d277c02188a6dd2 from qemu
This commit is contained in:
parent
64f51949a7
commit
458942d94e
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_aarch64
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_aarch64
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_aarch64
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_aarch64
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_aarch64
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_aarch64
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_aarch64
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_aarch64
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_aarch64eb
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_aarch64eb
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_aarch64eb
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_aarch64eb
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_aarch64eb
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_aarch64eb
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_aarch64eb
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_aarch64eb
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_arm
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_arm
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_arm
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_arm
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_arm
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_arm
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_arm
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_arm
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_armeb
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_armeb
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_armeb
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_armeb
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_armeb
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_armeb
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_armeb
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_armeb
|
||||
|
|
|
@ -2832,6 +2832,8 @@ symbols = (
|
|||
'tcg_gen_extr_i64_i32',
|
||||
'tcg_gen_extract_i32',
|
||||
'tcg_gen_extract_i64',
|
||||
'tcg_gen_extract2_i32',
|
||||
'tcg_gen_extract2_i64',
|
||||
'tcg_gen_extrh_i64_i32',
|
||||
'tcg_gen_extrl_i64_i32',
|
||||
'tcg_gen_extu_i32_i64',
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_m68k
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_m68k
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_m68k
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_m68k
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_m68k
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_m68k
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_m68k
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_m68k
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_mips
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_mips
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_mips
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_mips
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_mips
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_mips
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_mips
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mips
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_mips64
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_mips64
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_mips64
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_mips64
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_mips64
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_mips64
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_mips64
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mips64
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_mips64el
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_mips64el
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_mips64el
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_mips64el
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_mips64el
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_mips64el
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_mips64el
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mips64el
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_mipsel
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_mipsel
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_mipsel
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_mipsel
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_mipsel
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_mipsel
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_mipsel
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mipsel
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_powerpc
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_powerpc
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_powerpc
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_powerpc
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_powerpc
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_powerpc
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_powerpc
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_powerpc
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_riscv32
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_riscv32
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_riscv32
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_riscv32
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_riscv32
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_riscv32
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_riscv32
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_riscv32
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_riscv64
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_riscv64
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_riscv64
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_riscv64
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_riscv64
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_riscv64
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_riscv64
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_riscv64
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_sparc
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_sparc
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_sparc
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_sparc
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_sparc
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_sparc
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_sparc
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_sparc
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_sparc64
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_sparc64
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_sparc64
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_sparc64
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_sparc64
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_sparc64
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_sparc64
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_sparc64
|
||||
|
|
|
@ -816,6 +816,28 @@ void tcg_gen_sextract_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg,
|
|||
tcg_gen_sari_i32(s, ret, ret, 32 - len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract 32-bits from a 64-bit input, ah:al, starting from ofs.
|
||||
* Unlike tcg_gen_extract_i32 above, len is fixed at 32.
|
||||
*/
|
||||
void tcg_gen_extract2_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 al, TCGv_i32 ah,
|
||||
unsigned int ofs)
|
||||
{
|
||||
tcg_debug_assert(ofs <= 32);
|
||||
if (ofs == 0) {
|
||||
tcg_gen_mov_i32(s, ret, al);
|
||||
} else if (ofs == 32) {
|
||||
tcg_gen_mov_i32(s, ret, ah);
|
||||
} else if (al == ah) {
|
||||
tcg_gen_rotri_i32(s, ret, al, ofs);
|
||||
} else {
|
||||
TCGv_i32 t0 = tcg_temp_new_i32(s);
|
||||
tcg_gen_shri_i32(s, t0, al, ofs);
|
||||
tcg_gen_deposit_i32(s, ret, t0, ah, 32 - ofs, ofs);
|
||||
tcg_temp_free_i32(s, t0);
|
||||
}
|
||||
}
|
||||
|
||||
void tcg_gen_movcond_i32(TCGContext *s, TCGCond cond, TCGv_i32 ret, TCGv_i32 c1,
|
||||
TCGv_i32 c2, TCGv_i32 v1, TCGv_i32 v2)
|
||||
{
|
||||
|
@ -2311,6 +2333,28 @@ void tcg_gen_sextract_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg,
|
|||
tcg_gen_sari_i64(s, ret, ret, 64 - len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract 64 bits from a 128-bit input, ah:al, starting from ofs.
|
||||
* Unlike tcg_gen_extract_i64 above, len is fixed at 64.
|
||||
*/
|
||||
void tcg_gen_extract2_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 al, TCGv_i64 ah,
|
||||
unsigned int ofs)
|
||||
{
|
||||
tcg_debug_assert(ofs <= 64);
|
||||
if (ofs == 0) {
|
||||
tcg_gen_mov_i64(s, ret, al);
|
||||
} else if (ofs == 64) {
|
||||
tcg_gen_mov_i64(s, ret, ah);
|
||||
} else if (al == ah) {
|
||||
tcg_gen_rotri_i64(s, ret, al, ofs);
|
||||
} else {
|
||||
TCGv_i64 t0 = tcg_temp_new_i64(s);
|
||||
tcg_gen_shri_i64(s, t0, al, ofs);
|
||||
tcg_gen_deposit_i64(s, ret, t0, ah, 64 - ofs, ofs);
|
||||
tcg_temp_free_i64(s, t0);
|
||||
}
|
||||
}
|
||||
|
||||
void tcg_gen_movcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret, TCGv_i64 c1,
|
||||
TCGv_i64 c2, TCGv_i64 v1, TCGv_i64 v2)
|
||||
{
|
||||
|
|
|
@ -326,6 +326,8 @@ void tcg_gen_extract_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg,
|
|||
unsigned int ofs, unsigned int len);
|
||||
void tcg_gen_sextract_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg,
|
||||
unsigned int ofs, unsigned int len);
|
||||
void tcg_gen_extract2_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 al, TCGv_i32 ah,
|
||||
unsigned int ofs);
|
||||
void tcg_gen_brcond_i32(TCGContext *s, TCGCond cond, TCGv_i32 arg1, TCGv_i32 arg2, TCGLabel *l);
|
||||
void tcg_gen_brcondi_i32(TCGContext *s, TCGCond cond, TCGv_i32 arg1, int32_t arg2, TCGLabel *l);
|
||||
void tcg_gen_setcond_i32(TCGContext *s, TCGCond cond, TCGv_i32 ret,
|
||||
|
@ -511,6 +513,8 @@ void tcg_gen_extract_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg,
|
|||
unsigned int ofs, unsigned int len);
|
||||
void tcg_gen_sextract_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg,
|
||||
unsigned int ofs, unsigned int len);
|
||||
void tcg_gen_extract2_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 al, TCGv_i64 ah,
|
||||
unsigned int ofs);
|
||||
void tcg_gen_brcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 arg1, TCGv_i64 arg2, TCGLabel *l);
|
||||
void tcg_gen_brcondi_i64(TCGContext *s, TCGCond cond, TCGv_i64 arg1, int64_t arg2, TCGLabel *l);
|
||||
void tcg_gen_setcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret,
|
||||
|
@ -1081,6 +1085,7 @@ void tcg_gen_stl_vec(TCGContext *, TCGv_vec r, TCGv_ptr base, TCGArg offset, TCG
|
|||
#define tcg_gen_deposit_z_tl tcg_gen_deposit_z_i64
|
||||
#define tcg_gen_extract_tl tcg_gen_extract_i64
|
||||
#define tcg_gen_sextract_tl tcg_gen_sextract_i64
|
||||
#define tcg_gen_extract2_tl tcg_gen_extract2_i64
|
||||
#define tcg_const_tl tcg_const_i64
|
||||
#define tcg_const_local_tl tcg_const_local_i64
|
||||
#define tcg_gen_movcond_tl tcg_gen_movcond_i64
|
||||
|
@ -1191,6 +1196,7 @@ void tcg_gen_stl_vec(TCGContext *, TCGv_vec r, TCGv_ptr base, TCGArg offset, TCG
|
|||
#define tcg_gen_deposit_z_tl tcg_gen_deposit_z_i32
|
||||
#define tcg_gen_extract_tl tcg_gen_extract_i32
|
||||
#define tcg_gen_sextract_tl tcg_gen_sextract_i32
|
||||
#define tcg_gen_extract2_tl tcg_gen_extract2_i32
|
||||
#define tcg_const_tl tcg_const_i32
|
||||
#define tcg_const_local_tl tcg_const_local_i32
|
||||
#define tcg_gen_movcond_tl tcg_gen_movcond_i32
|
||||
|
|
|
@ -2826,6 +2826,8 @@
|
|||
#define tcg_gen_extr_i64_i32 tcg_gen_extr_i64_i32_x86_64
|
||||
#define tcg_gen_extract_i32 tcg_gen_extract_i32_x86_64
|
||||
#define tcg_gen_extract_i64 tcg_gen_extract_i64_x86_64
|
||||
#define tcg_gen_extract2_i32 tcg_gen_extract2_i32_x86_64
|
||||
#define tcg_gen_extract2_i64 tcg_gen_extract2_i64_x86_64
|
||||
#define tcg_gen_extrh_i64_i32 tcg_gen_extrh_i64_i32_x86_64
|
||||
#define tcg_gen_extrl_i64_i32 tcg_gen_extrl_i64_i32_x86_64
|
||||
#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_x86_64
|
||||
|
|
Loading…
Reference in a new issue