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:
David Hildenbrand 2019-04-30 09:20:02 -04:00 committed by Lioncash
parent 64f51949a7
commit 458942d94e
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
18 changed files with 82 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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',

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)
{

View file

@ -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

View file

@ -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