Skip to content

Commit 841e2c5

Browse files
committed
tcg/riscv64: Fold the ext{8,16,32}[us] cases into {s}extract
Accept byte and word extensions with the extract opcodes. This is preparatory to removing the specialized extracts. Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Signed-off-by: Richard Henderson <[email protected]>
1 parent 94d5939 commit 841e2c5

File tree

2 files changed

+69
-4
lines changed

2 files changed

+69
-4
lines changed

tcg/riscv/tcg-target-has.h

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
#define TCG_TARGET_HAS_div2_i32 0
1717
#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
1818
#define TCG_TARGET_HAS_deposit_i32 0
19-
#define TCG_TARGET_HAS_extract_i32 0
20-
#define TCG_TARGET_HAS_sextract_i32 0
19+
#define TCG_TARGET_HAS_extract_i32 1
20+
#define TCG_TARGET_HAS_sextract_i32 1
2121
#define TCG_TARGET_HAS_extract2_i32 0
2222
#define TCG_TARGET_HAS_add2_i32 1
2323
#define TCG_TARGET_HAS_sub2_i32 1
@@ -50,8 +50,8 @@
5050
#define TCG_TARGET_HAS_div2_i64 0
5151
#define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB)
5252
#define TCG_TARGET_HAS_deposit_i64 0
53-
#define TCG_TARGET_HAS_extract_i64 0
54-
#define TCG_TARGET_HAS_sextract_i64 0
53+
#define TCG_TARGET_HAS_extract_i64 1
54+
#define TCG_TARGET_HAS_sextract_i64 1
5555
#define TCG_TARGET_HAS_extract2_i64 0
5656
#define TCG_TARGET_HAS_extr_i64_i32 1
5757
#define TCG_TARGET_HAS_ext8s_i64 1
@@ -109,4 +109,35 @@
109109

110110
#define TCG_TARGET_HAS_tst_vec 0
111111

112+
static inline bool
113+
tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
114+
{
115+
if (ofs == 0) {
116+
switch (len) {
117+
case 16:
118+
return cpuinfo & CPUINFO_ZBB;
119+
case 32:
120+
return (cpuinfo & CPUINFO_ZBA) && type == TCG_TYPE_I64;
121+
}
122+
}
123+
return false;
124+
}
125+
#define TCG_TARGET_extract_valid tcg_target_extract_valid
126+
127+
static inline bool
128+
tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
129+
{
130+
if (ofs == 0) {
131+
switch (len) {
132+
case 8:
133+
case 16:
134+
return cpuinfo & CPUINFO_ZBB;
135+
case 32:
136+
return type == TCG_TYPE_I64;
137+
}
138+
}
139+
return false;
140+
}
141+
#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
142+
112143
#endif

tcg/riscv/tcg-target.c.inc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2343,6 +2343,36 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
23432343
tcg_out_mb(s, a0);
23442344
break;
23452345

2346+
case INDEX_op_extract_i64:
2347+
if (a2 == 0 && args[3] == 32) {
2348+
tcg_out_ext32u(s, a0, a1);
2349+
break;
2350+
}
2351+
/* FALLTHRU */
2352+
case INDEX_op_extract_i32:
2353+
if (a2 == 0 && args[3] == 16) {
2354+
tcg_out_ext16u(s, a0, a1);
2355+
} else {
2356+
g_assert_not_reached();
2357+
}
2358+
break;
2359+
2360+
case INDEX_op_sextract_i64:
2361+
if (a2 == 0 && args[3] == 32) {
2362+
tcg_out_ext32s(s, a0, a1);
2363+
break;
2364+
}
2365+
/* FALLTHRU */
2366+
case INDEX_op_sextract_i32:
2367+
if (a2 == 0 && args[3] == 8) {
2368+
tcg_out_ext8s(s, TCG_TYPE_REG, a0, a1);
2369+
} else if (a2 == 0 && args[3] == 16) {
2370+
tcg_out_ext16s(s, TCG_TYPE_REG, a0, a1);
2371+
} else {
2372+
g_assert_not_reached();
2373+
}
2374+
break;
2375+
23462376
case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */
23472377
case INDEX_op_mov_i64:
23482378
case INDEX_op_call: /* Always emitted via tcg_out_call. */
@@ -2620,6 +2650,10 @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
26202650
case INDEX_op_extrl_i64_i32:
26212651
case INDEX_op_extrh_i64_i32:
26222652
case INDEX_op_ext_i32_i64:
2653+
case INDEX_op_extract_i32:
2654+
case INDEX_op_extract_i64:
2655+
case INDEX_op_sextract_i32:
2656+
case INDEX_op_sextract_i64:
26232657
case INDEX_op_bswap16_i32:
26242658
case INDEX_op_bswap32_i32:
26252659
case INDEX_op_bswap16_i64:

0 commit comments

Comments
 (0)