Skip to content

Commit 9bca986

Browse files
committed
tcg/s390x: Implement TCG_TARGET_HAS_bitsel_vec
Signed-off-by: Richard Henderson <[email protected]>
1 parent 4223c9c commit 9bca986

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

tcg/s390x/tcg-target-con-set.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ C_O1_I2(r, r, ri)
2626
C_O1_I2(r, rZ, r)
2727
C_O1_I2(v, v, r)
2828
C_O1_I2(v, v, v)
29+
C_O1_I3(v, v, v, v)
2930
C_O1_I4(r, r, ri, r, 0)
3031
C_O1_I4(r, r, ri, rI, 0)
3132
C_O2_I2(b, a, 0, r)

tcg/s390x/tcg-target.c.inc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ typedef enum S390Opcode {
296296
VRRa_VUPH = 0xe7d7,
297297
VRRa_VUPL = 0xe7d6,
298298
VRRc_VX = 0xe76d,
299+
VRRe_VSEL = 0xe78d,
299300
VRRf_VLVGP = 0xe762,
300301

301302
VRSa_VERLL = 0xe733,
@@ -647,6 +648,18 @@ static void tcg_out_insn_VRRc(TCGContext *s, S390Opcode op,
647648
tcg_out16(s, (op & 0x00ff) | RXB(v1, v2, v3, 0) | (m4 << 12));
648649
}
649650

651+
static void tcg_out_insn_VRRe(TCGContext *s, S390Opcode op,
652+
TCGReg v1, TCGReg v2, TCGReg v3, TCGReg v4)
653+
{
654+
tcg_debug_assert(is_vector_reg(v1));
655+
tcg_debug_assert(is_vector_reg(v2));
656+
tcg_debug_assert(is_vector_reg(v3));
657+
tcg_debug_assert(is_vector_reg(v4));
658+
tcg_out16(s, (op & 0xff00) | ((v1 & 0xf) << 4) | (v2 & 0xf));
659+
tcg_out16(s, v3 << 12);
660+
tcg_out16(s, (op & 0x00ff) | RXB(v1, v2, v3, v4) | (v4 << 12));
661+
}
662+
650663
static void tcg_out_insn_VRRf(TCGContext *s, S390Opcode op,
651664
TCGReg v1, TCGReg r2, TCGReg r3)
652665
{
@@ -2787,6 +2800,10 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
27872800
tcg_out_insn(s, VRRc, VMXL, a0, a1, a2, vece);
27882801
break;
27892802

2803+
case INDEX_op_bitsel_vec:
2804+
tcg_out_insn(s, VRRe, VSEL, a0, a1, a2, args[3]);
2805+
break;
2806+
27902807
case INDEX_op_cmp_vec:
27912808
switch ((TCGCond)args[3]) {
27922809
case TCG_COND_EQ:
@@ -2827,6 +2844,7 @@ int tcg_can_emit_vec_op(TCGOpcode opc, TCGType type, unsigned vece)
28272844
case INDEX_op_add_vec:
28282845
case INDEX_op_and_vec:
28292846
case INDEX_op_andc_vec:
2847+
case INDEX_op_bitsel_vec:
28302848
case INDEX_op_neg_vec:
28312849
case INDEX_op_not_vec:
28322850
case INDEX_op_or_vec:
@@ -3168,6 +3186,8 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
31683186
case INDEX_op_shrs_vec:
31693187
case INDEX_op_sars_vec:
31703188
return C_O1_I2(v, v, r);
3189+
case INDEX_op_bitsel_vec:
3190+
return C_O1_I3(v, v, v, v);
31713191

31723192
default:
31733193
g_assert_not_reached();

tcg/s390x/tcg-target.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ extern uint64_t s390_facilities[3];
157157
#define TCG_TARGET_HAS_mul_vec 1
158158
#define TCG_TARGET_HAS_sat_vec 0
159159
#define TCG_TARGET_HAS_minmax_vec 1
160-
#define TCG_TARGET_HAS_bitsel_vec 0
160+
#define TCG_TARGET_HAS_bitsel_vec 1
161161
#define TCG_TARGET_HAS_cmpsel_vec 0
162162

163163
/* used for function call generation */

0 commit comments

Comments
 (0)