Skip to content

Commit b3e26b3

Browse files
committed
[AArch64][SVE2] Generate XAR
Bitwise exclusive OR and rotate right by immediate Added a new ISD node for XAR and lower the following rotate pattern to XAR for appropriate types: rotr (xor(x, y), imm) -> xar1 (x, y, imm) Change-Id: If1f649b1bf5365b575dc9fa3e6618e97dc19a066
1 parent def4253 commit b3e26b3

File tree

5 files changed

+260
-1
lines changed

5 files changed

+260
-1
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,6 +1648,11 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
16481648
setOperationAction(ISD::FLDEXP, MVT::f16, Custom);
16491649
}
16501650

1651+
if (Subtarget->hasSVE2orSME()) {
1652+
for (auto VT : {MVT::nxv16i8, MVT::nxv8i16, MVT::nxv4i32, MVT::nxv2i64})
1653+
setOperationAction(ISD::ROTL, VT, Custom);
1654+
}
1655+
16511656
PredictableSelectIsExpensive = Subtarget->predictableSelectIsExpensive();
16521657

16531658
IsStrictFPEnabled = true;
@@ -2645,6 +2650,7 @@ const char *AArch64TargetLowering::getTargetNodeName(unsigned Opcode) const {
26452650
MAKE_CASE(AArch64ISD::MSRR)
26462651
MAKE_CASE(AArch64ISD::RSHRNB_I)
26472652
MAKE_CASE(AArch64ISD::CTTZ_ELTS)
2653+
MAKE_CASE(AArch64ISD::XAR_I)
26482654
}
26492655
#undef MAKE_CASE
26502656
return nullptr;
@@ -3741,6 +3747,30 @@ getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
37413747
return std::make_pair(Value, Overflow);
37423748
}
37433749

3750+
SDValue AArch64TargetLowering::LowerROTL(SDValue Op, SelectionDAG &DAG) const {
3751+
EVT VT = Op.getValueType();
3752+
assert(VT.isScalableVector() && "Expected a scalable vector.");
3753+
assert(Subtarget->hasSVE2orSME() && "Custom lowering only for SVE2.");
3754+
3755+
// rotr (xor(x, y), imm) -> xar1 (x, y, imm)
3756+
SDValue Xor = Op.getOperand(0);
3757+
SDValue RotlValue = Op.getOperand(1);
3758+
3759+
if (Xor.getOpcode() != ISD::XOR || RotlValue.getOpcode() != ISD::SPLAT_VECTOR)
3760+
return SDValue();
3761+
if (!isa<ConstantSDNode>(RotlValue.getOperand(0).getNode()))
3762+
return SDValue();
3763+
3764+
uint64_t RotrAmt =
3765+
(VT.getScalarSizeInBits() - RotlValue->getConstantOperandVal(0)) %
3766+
VT.getScalarSizeInBits();
3767+
3768+
SDLoc DL(Op);
3769+
SDValue Ops[] = {Xor.getOperand(0), Xor.getOperand(1),
3770+
DAG.getTargetConstant(RotrAmt, DL, MVT::i32)};
3771+
return DAG.getNode(AArch64ISD::XAR_I, DL, VT, Ops);
3772+
}
3773+
37443774
SDValue AArch64TargetLowering::LowerXOR(SDValue Op, SelectionDAG &DAG) const {
37453775
if (useSVEForFixedLengthVectorVT(Op.getValueType(),
37463776
!Subtarget->isNeonAvailable()))
@@ -6414,6 +6444,8 @@ SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
64146444
return LowerFunnelShift(Op, DAG);
64156445
case ISD::FLDEXP:
64166446
return LowerFLDEXP(Op, DAG);
6447+
case ISD::ROTL:
6448+
return LowerROTL(Op, DAG);
64176449
}
64186450
}
64196451

llvm/lib/Target/AArch64/AArch64ISelLowering.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ enum NodeType : unsigned {
215215
// Vector narrowing shift by immediate (bottom)
216216
RSHRNB_I,
217217

218+
// Vector bitwise xor and rotate right by immediate
219+
XAR_I,
220+
218221
// Vector shift by constant and insert
219222
VSLI,
220223
VSRI,
@@ -1143,6 +1146,7 @@ class AArch64TargetLowering : public TargetLowering {
11431146
SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
11441147
SDValue LowerVectorINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
11451148
SDValue LowerVectorOR(SDValue Op, SelectionDAG &DAG) const;
1149+
SDValue LowerROTL(SDValue Op, SelectionDAG &DAG) const;
11461150
SDValue LowerXOR(SDValue Op, SelectionDAG &DAG) const;
11471151
SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
11481152
SDValue LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const;

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,15 @@ def AArch64eor3 : PatFrags<(ops node:$op1, node:$op2, node:$op3),
454454
[(int_aarch64_sve_eor3 node:$op1, node:$op2, node:$op3),
455455
(xor node:$op1, (xor node:$op2, node:$op3))]>;
456456

457+
def SDT_AArch64xar_Imm : SDTypeProfile<1, 3, [
458+
SDTCisVec<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisInt<3>,
459+
SDTCisSameAs<0,1>, SDTCisSameAs<1,2>]>;
460+
def AArch64xar_node : SDNode<"AArch64ISD::XAR_I", SDT_AArch64xar_Imm>;
461+
def AArch64xar : PatFrags<(ops node:$op1, node:$op2, node:$op3),
462+
[(int_aarch64_sve_xar node:$op1, node:$op2, node:$op3),
463+
(AArch64xar_node node:$op1, node:$op2, node:$op3)]>;
464+
465+
457466
def AArch64fmla_m1 : PatFrags<(ops node:$pg, node:$za, node:$zn, node:$zm),
458467
[(int_aarch64_sve_fmla node:$pg, node:$za, node:$zn, node:$zm),
459468
(vselect node:$pg, (AArch64fadd_p_contract (SVEAllActive), node:$za, (AArch64fmul_p_oneuse (SVEAllActive), node:$zn, node:$zm)), node:$za),
@@ -3721,7 +3730,7 @@ let Predicates = [HasSVE2orSME] in {
37213730
defm NBSL_ZZZZ : sve2_int_bitwise_ternary_op<0b111, "nbsl", int_aarch64_sve_nbsl>;
37223731

37233732
// SVE2 bitwise xor and rotate right by immediate
3724-
defm XAR_ZZZI : sve2_int_rotate_right_imm<"xar", int_aarch64_sve_xar>;
3733+
defm XAR_ZZZI : sve2_int_rotate_right_imm<"xar", AArch64xar>;
37253734

37263735
// SVE2 extract vector (immediate offset, constructive)
37273736
def EXT_ZZI_B : sve2_int_perm_extract_i_cons<"ext">;

llvm/lib/Target/AArch64/AArch64Subtarget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ class AArch64Subtarget final : public AArch64GenSubtargetInfo {
394394
void mirFileLoaded(MachineFunction &MF) const override;
395395

396396
bool hasSVEorSME() const { return hasSVE() || hasSME(); }
397+
bool hasSVE2orSME() const { return hasSVE2() || hasSME(); }
397398

398399
// Return the known range for the bit length of SVE data registers. A value
399400
// of 0 means nothing is known about that particular limit beyong what's

llvm/test/CodeGen/AArch64/sve2-xar.ll

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=aarch64 -mattr=+sve < %s -o - | FileCheck --check-prefix=SVE %s
3+
; RUN: llc -mtriple=aarch64 -mattr=+sve2 < %s -o - | FileCheck --check-prefix=SVE2 %s
4+
5+
define <vscale x 2 x i64> @xar_nxv2i64_l(<vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
6+
; SVE-LABEL: xar_nxv2i64_l:
7+
; SVE: // %bb.0:
8+
; SVE-NEXT: eor z0.d, z0.d, z1.d
9+
; SVE-NEXT: lsr z1.d, z0.d, #4
10+
; SVE-NEXT: lsl z0.d, z0.d, #60
11+
; SVE-NEXT: orr z0.d, z0.d, z1.d
12+
; SVE-NEXT: ret
13+
;
14+
; SVE2-LABEL: xar_nxv2i64_l:
15+
; SVE2: // %bb.0:
16+
; SVE2-NEXT: xar z0.d, z0.d, z1.d, #4
17+
; SVE2-NEXT: ret
18+
%a = xor <vscale x 2 x i64> %x, %y
19+
%b = call <vscale x 2 x i64> @llvm.fshl.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> shufflevector (<vscale x 2 x i64> insertelement (<vscale x 2 x i64> poison, i64 60, i32 0), <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer))
20+
ret <vscale x 2 x i64> %b
21+
}
22+
23+
define <vscale x 2 x i64> @xar_nxv2i64_r(<vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
24+
; SVE-LABEL: xar_nxv2i64_r:
25+
; SVE: // %bb.0:
26+
; SVE-NEXT: eor z0.d, z0.d, z1.d
27+
; SVE-NEXT: lsl z1.d, z0.d, #60
28+
; SVE-NEXT: lsr z0.d, z0.d, #4
29+
; SVE-NEXT: orr z0.d, z0.d, z1.d
30+
; SVE-NEXT: ret
31+
;
32+
; SVE2-LABEL: xar_nxv2i64_r:
33+
; SVE2: // %bb.0:
34+
; SVE2-NEXT: xar z0.d, z0.d, z1.d, #4
35+
; SVE2-NEXT: ret
36+
%a = xor <vscale x 2 x i64> %x, %y
37+
%b = call <vscale x 2 x i64> @llvm.fshr.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> shufflevector (<vscale x 2 x i64> insertelement (<vscale x 2 x i64> poison, i64 4, i32 0), <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer))
38+
ret <vscale x 2 x i64> %b
39+
}
40+
41+
42+
define <vscale x 4 x i32> @xar_nxv4i32_l(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
43+
; SVE-LABEL: xar_nxv4i32_l:
44+
; SVE: // %bb.0:
45+
; SVE-NEXT: eor z0.d, z0.d, z1.d
46+
; SVE-NEXT: lsr z1.s, z0.s, #4
47+
; SVE-NEXT: lsl z0.s, z0.s, #28
48+
; SVE-NEXT: orr z0.d, z0.d, z1.d
49+
; SVE-NEXT: ret
50+
;
51+
; SVE2-LABEL: xar_nxv4i32_l:
52+
; SVE2: // %bb.0:
53+
; SVE2-NEXT: xar z0.s, z0.s, z1.s, #4
54+
; SVE2-NEXT: ret
55+
%a = xor <vscale x 4 x i32> %x, %y
56+
%b = call <vscale x 4 x i32> @llvm.fshl.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> shufflevector (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> poison, i32 28, i32 0), <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer))
57+
ret <vscale x 4 x i32> %b
58+
}
59+
60+
define <vscale x 4 x i32> @xar_nxv4i32_r(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
61+
; SVE-LABEL: xar_nxv4i32_r:
62+
; SVE: // %bb.0:
63+
; SVE-NEXT: eor z0.d, z0.d, z1.d
64+
; SVE-NEXT: lsl z1.s, z0.s, #28
65+
; SVE-NEXT: lsr z0.s, z0.s, #4
66+
; SVE-NEXT: orr z0.d, z0.d, z1.d
67+
; SVE-NEXT: ret
68+
;
69+
; SVE2-LABEL: xar_nxv4i32_r:
70+
; SVE2: // %bb.0:
71+
; SVE2-NEXT: xar z0.s, z0.s, z1.s, #4
72+
; SVE2-NEXT: ret
73+
%a = xor <vscale x 4 x i32> %x, %y
74+
%b = call <vscale x 4 x i32> @llvm.fshr.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> shufflevector (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> poison, i32 4, i32 0), <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer))
75+
ret <vscale x 4 x i32> %b
76+
}
77+
78+
define <vscale x 8 x i16> @xar_nxv8i16_l(<vscale x 8 x i16> %x, <vscale x 8 x i16> %y) {
79+
; SVE-LABEL: xar_nxv8i16_l:
80+
; SVE: // %bb.0:
81+
; SVE-NEXT: eor z0.d, z0.d, z1.d
82+
; SVE-NEXT: lsr z1.h, z0.h, #4
83+
; SVE-NEXT: lsl z0.h, z0.h, #12
84+
; SVE-NEXT: orr z0.d, z0.d, z1.d
85+
; SVE-NEXT: ret
86+
;
87+
; SVE2-LABEL: xar_nxv8i16_l:
88+
; SVE2: // %bb.0:
89+
; SVE2-NEXT: xar z0.h, z0.h, z1.h, #4
90+
; SVE2-NEXT: ret
91+
%a = xor <vscale x 8 x i16> %x, %y
92+
%b = call <vscale x 8 x i16> @llvm.fshl.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %a, <vscale x 8 x i16> shufflevector (<vscale x 8 x i16> insertelement (<vscale x 8 x i16> poison, i16 12, i32 0), <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer))
93+
ret <vscale x 8 x i16> %b
94+
}
95+
96+
define <vscale x 8 x i16> @xar_nxv8i16_r(<vscale x 8 x i16> %x, <vscale x 8 x i16> %y) {
97+
; SVE-LABEL: xar_nxv8i16_r:
98+
; SVE: // %bb.0:
99+
; SVE-NEXT: eor z0.d, z0.d, z1.d
100+
; SVE-NEXT: lsl z1.h, z0.h, #12
101+
; SVE-NEXT: lsr z0.h, z0.h, #4
102+
; SVE-NEXT: orr z0.d, z0.d, z1.d
103+
; SVE-NEXT: ret
104+
;
105+
; SVE2-LABEL: xar_nxv8i16_r:
106+
; SVE2: // %bb.0:
107+
; SVE2-NEXT: xar z0.h, z0.h, z1.h, #4
108+
; SVE2-NEXT: ret
109+
%a = xor <vscale x 8 x i16> %x, %y
110+
%b = call <vscale x 8 x i16> @llvm.fshr.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %a, <vscale x 8 x i16> shufflevector (<vscale x 8 x i16> insertelement (<vscale x 8 x i16> poison, i16 4, i32 0), <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer))
111+
ret <vscale x 8 x i16> %b
112+
}
113+
114+
define <vscale x 16 x i8> @xar_nxv16i8_l(<vscale x 16 x i8> %x, <vscale x 16 x i8> %y) {
115+
; SVE-LABEL: xar_nxv16i8_l:
116+
; SVE: // %bb.0:
117+
; SVE-NEXT: eor z0.d, z0.d, z1.d
118+
; SVE-NEXT: lsr z1.b, z0.b, #4
119+
; SVE-NEXT: lsl z0.b, z0.b, #4
120+
; SVE-NEXT: orr z0.d, z0.d, z1.d
121+
; SVE-NEXT: ret
122+
;
123+
; SVE2-LABEL: xar_nxv16i8_l:
124+
; SVE2: // %bb.0:
125+
; SVE2-NEXT: xar z0.b, z0.b, z1.b, #4
126+
; SVE2-NEXT: ret
127+
%a = xor <vscale x 16 x i8> %x, %y
128+
%b = call <vscale x 16 x i8> @llvm.fshl.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %a, <vscale x 16 x i8> shufflevector (<vscale x 16 x i8> insertelement (<vscale x 16 x i8> poison, i8 4, i32 0), <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer))
129+
ret <vscale x 16 x i8> %b
130+
}
131+
132+
define <vscale x 16 x i8> @xar_nxv16i8_r(<vscale x 16 x i8> %x, <vscale x 16 x i8> %y) {
133+
; SVE-LABEL: xar_nxv16i8_r:
134+
; SVE: // %bb.0:
135+
; SVE-NEXT: eor z0.d, z0.d, z1.d
136+
; SVE-NEXT: lsl z1.b, z0.b, #4
137+
; SVE-NEXT: lsr z0.b, z0.b, #4
138+
; SVE-NEXT: orr z0.d, z0.d, z1.d
139+
; SVE-NEXT: ret
140+
;
141+
; SVE2-LABEL: xar_nxv16i8_r:
142+
; SVE2: // %bb.0:
143+
; SVE2-NEXT: xar z0.b, z0.b, z1.b, #4
144+
; SVE2-NEXT: ret
145+
%a = xor <vscale x 16 x i8> %x, %y
146+
%b = call <vscale x 16 x i8> @llvm.fshr.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %a, <vscale x 16 x i8> shufflevector (<vscale x 16 x i8> insertelement (<vscale x 16 x i8> poison, i8 4, i32 0), <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer))
147+
ret <vscale x 16 x i8> %b
148+
}
149+
150+
151+
define <vscale x 2 x i64> @xar_nxv2i64_l_neg1(<vscale x 2 x i64> %x, <vscale x 2 x i64> %y, <vscale x 2 x i64> %z) {
152+
; SVE-LABEL: xar_nxv2i64_l_neg1:
153+
; SVE: // %bb.0:
154+
; SVE-NEXT: mov z3.d, z2.d
155+
; SVE-NEXT: ptrue p0.d
156+
; SVE-NEXT: subr z2.d, z2.d, #0 // =0x0
157+
; SVE-NEXT: eor z0.d, z0.d, z1.d
158+
; SVE-NEXT: and z2.d, z2.d, #0x3f
159+
; SVE-NEXT: and z3.d, z3.d, #0x3f
160+
; SVE-NEXT: movprfx z1, z0
161+
; SVE-NEXT: lsl z1.d, p0/m, z1.d, z3.d
162+
; SVE-NEXT: lsr z0.d, p0/m, z0.d, z2.d
163+
; SVE-NEXT: orr z0.d, z1.d, z0.d
164+
; SVE-NEXT: ret
165+
;
166+
; SVE2-LABEL: xar_nxv2i64_l_neg1:
167+
; SVE2: // %bb.0:
168+
; SVE2-NEXT: mov z3.d, z2.d
169+
; SVE2-NEXT: ptrue p0.d
170+
; SVE2-NEXT: subr z2.d, z2.d, #0 // =0x0
171+
; SVE2-NEXT: eor z0.d, z0.d, z1.d
172+
; SVE2-NEXT: and z2.d, z2.d, #0x3f
173+
; SVE2-NEXT: and z3.d, z3.d, #0x3f
174+
; SVE2-NEXT: movprfx z1, z0
175+
; SVE2-NEXT: lsl z1.d, p0/m, z1.d, z3.d
176+
; SVE2-NEXT: lsr z0.d, p0/m, z0.d, z2.d
177+
; SVE2-NEXT: orr z0.d, z1.d, z0.d
178+
; SVE2-NEXT: ret
179+
%a = xor <vscale x 2 x i64> %x, %y
180+
%b = call <vscale x 2 x i64> @llvm.fshl.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> %z)
181+
ret <vscale x 2 x i64> %b
182+
}
183+
184+
; TODO: We could use usra instruction here.
185+
define <vscale x 2 x i64> @xar_nxv2i64_l_neg2(<vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
186+
; SVE-LABEL: xar_nxv2i64_l_neg2:
187+
; SVE: // %bb.0:
188+
; SVE-NEXT: orr z0.d, z0.d, z1.d
189+
; SVE-NEXT: lsr z1.d, z0.d, #4
190+
; SVE-NEXT: lsl z0.d, z0.d, #60
191+
; SVE-NEXT: orr z0.d, z0.d, z1.d
192+
; SVE-NEXT: ret
193+
;
194+
; SVE2-LABEL: xar_nxv2i64_l_neg2:
195+
; SVE2: // %bb.0:
196+
; SVE2-NEXT: orr z0.d, z0.d, z1.d
197+
; SVE2-NEXT: lsr z1.d, z0.d, #4
198+
; SVE2-NEXT: lsl z0.d, z0.d, #60
199+
; SVE2-NEXT: orr z0.d, z0.d, z1.d
200+
; SVE2-NEXT: ret
201+
%a = or <vscale x 2 x i64> %x, %y
202+
%b = call <vscale x 2 x i64> @llvm.fshl.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> shufflevector (<vscale x 2 x i64> insertelement (<vscale x 2 x i64> poison, i64 60, i32 0), <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer))
203+
ret <vscale x 2 x i64> %b
204+
}
205+
206+
declare <vscale x 2 x i64> @llvm.fshl.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
207+
declare <vscale x 4 x i32> @llvm.fshl.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
208+
declare <vscale x 8 x i16> @llvm.fshl.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
209+
declare <vscale x 16 x i8> @llvm.fshl.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
210+
declare <vscale x 2 x i64> @llvm.fshr.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
211+
declare <vscale x 4 x i32> @llvm.fshr.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
212+
declare <vscale x 8 x i16> @llvm.fshr.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
213+
declare <vscale x 16 x i8> @llvm.fshr.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)

0 commit comments

Comments
 (0)