Skip to content

Commit ae77bbe

Browse files
committed
tcg/s390x: Implement andc, orc, abs, neg, not vector operations
These logical and arithmetic operations are optional but trivial. Reviewed-by: David Hildenbrand <[email protected]> Signed-off-by: Richard Henderson <[email protected]>
1 parent a429ee2 commit ae77bbe

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ C_O0_I2(v, r)
1717
C_O1_I1(r, L)
1818
C_O1_I1(r, r)
1919
C_O1_I1(v, r)
20+
C_O1_I1(v, v)
2021
C_O1_I1(v, vr)
2122
C_O1_I2(r, 0, ri)
2223
C_O1_I2(r, 0, rI)

tcg/s390x/tcg-target.c.inc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,18 @@ typedef enum S390Opcode {
270270
VRIb_VGM = 0xe746,
271271
VRIc_VREP = 0xe74d,
272272

273+
VRRa_VLC = 0xe7de,
274+
VRRa_VLP = 0xe7df,
273275
VRRa_VLR = 0xe756,
274276
VRRc_VA = 0xe7f3,
275277
VRRc_VCEQ = 0xe7f8, /* we leave the m5 cs field 0 */
276278
VRRc_VCH = 0xe7fb, /* " */
277279
VRRc_VCHL = 0xe7f9, /* " */
278280
VRRc_VN = 0xe768,
281+
VRRc_VNC = 0xe769,
282+
VRRc_VNO = 0xe76b,
279283
VRRc_VO = 0xe76a,
284+
VRRc_VOC = 0xe76f,
280285
VRRc_VS = 0xe7f7,
281286
VRRc_VX = 0xe76d,
282287
VRRf_VLVGP = 0xe762,
@@ -2669,6 +2674,16 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
26692674
tcg_out_dupm_vec(s, type, vece, a0, a1, a2);
26702675
break;
26712676

2677+
case INDEX_op_abs_vec:
2678+
tcg_out_insn(s, VRRa, VLP, a0, a1, vece);
2679+
break;
2680+
case INDEX_op_neg_vec:
2681+
tcg_out_insn(s, VRRa, VLC, a0, a1, vece);
2682+
break;
2683+
case INDEX_op_not_vec:
2684+
tcg_out_insn(s, VRRc, VNO, a0, a1, a1, 0);
2685+
break;
2686+
26722687
case INDEX_op_add_vec:
26732688
tcg_out_insn(s, VRRc, VA, a0, a1, a2, vece);
26742689
break;
@@ -2678,9 +2693,15 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
26782693
case INDEX_op_and_vec:
26792694
tcg_out_insn(s, VRRc, VN, a0, a1, a2, 0);
26802695
break;
2696+
case INDEX_op_andc_vec:
2697+
tcg_out_insn(s, VRRc, VNC, a0, a1, a2, 0);
2698+
break;
26812699
case INDEX_op_or_vec:
26822700
tcg_out_insn(s, VRRc, VO, a0, a1, a2, 0);
26832701
break;
2702+
case INDEX_op_orc_vec:
2703+
tcg_out_insn(s, VRRc, VOC, a0, a1, a2, 0);
2704+
break;
26842705
case INDEX_op_xor_vec:
26852706
tcg_out_insn(s, VRRc, VX, a0, a1, a2, 0);
26862707
break;
@@ -2711,9 +2732,14 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
27112732
int tcg_can_emit_vec_op(TCGOpcode opc, TCGType type, unsigned vece)
27122733
{
27132734
switch (opc) {
2735+
case INDEX_op_abs_vec:
27142736
case INDEX_op_add_vec:
27152737
case INDEX_op_and_vec:
2738+
case INDEX_op_andc_vec:
2739+
case INDEX_op_neg_vec:
2740+
case INDEX_op_not_vec:
27162741
case INDEX_op_or_vec:
2742+
case INDEX_op_orc_vec:
27172743
case INDEX_op_sub_vec:
27182744
case INDEX_op_xor_vec:
27192745
return 1;
@@ -2943,10 +2969,16 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
29432969
return C_O1_I1(v, r);
29442970
case INDEX_op_dup_vec:
29452971
return C_O1_I1(v, vr);
2972+
case INDEX_op_abs_vec:
2973+
case INDEX_op_neg_vec:
2974+
case INDEX_op_not_vec:
2975+
return C_O1_I1(v, v);
29462976
case INDEX_op_add_vec:
29472977
case INDEX_op_sub_vec:
29482978
case INDEX_op_and_vec:
2979+
case INDEX_op_andc_vec:
29492980
case INDEX_op_or_vec:
2981+
case INDEX_op_orc_vec:
29502982
case INDEX_op_xor_vec:
29512983
case INDEX_op_cmp_vec:
29522984
return C_O1_I2(v, v, v);

tcg/s390x/tcg-target.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ typedef enum TCGReg {
6464
#define FACILITY_DISTINCT_OPS FACILITY_LOAD_ON_COND
6565
#define FACILITY_LOAD_ON_COND2 53
6666
#define FACILITY_VECTOR 129
67+
#define FACILITY_VECTOR_ENH1 135
6768

6869
extern uint64_t s390_facilities[3];
6970

@@ -142,11 +143,11 @@ extern uint64_t s390_facilities[3];
142143
#define TCG_TARGET_HAS_v128 HAVE_FACILITY(VECTOR)
143144
#define TCG_TARGET_HAS_v256 0
144145

145-
#define TCG_TARGET_HAS_andc_vec 0
146-
#define TCG_TARGET_HAS_orc_vec 0
147-
#define TCG_TARGET_HAS_not_vec 0
148-
#define TCG_TARGET_HAS_neg_vec 0
149-
#define TCG_TARGET_HAS_abs_vec 0
146+
#define TCG_TARGET_HAS_andc_vec 1
147+
#define TCG_TARGET_HAS_orc_vec HAVE_FACILITY(VECTOR_ENH1)
148+
#define TCG_TARGET_HAS_not_vec 1
149+
#define TCG_TARGET_HAS_neg_vec 1
150+
#define TCG_TARGET_HAS_abs_vec 1
150151
#define TCG_TARGET_HAS_roti_vec 0
151152
#define TCG_TARGET_HAS_rots_vec 0
152153
#define TCG_TARGET_HAS_rotv_vec 0

0 commit comments

Comments
 (0)