Skip to content

Commit 8fa7239

Browse files
committed
[RISCV] Intrinsic Support for XCVsimd
Add intrinsic support for XCVsimd extension. Documentation: https://docs.openhwgroup.org/projects/cv32e40p-user-manual/en/latest/instruction_set_extensions.html#simd Co-authored-by: @melonedo
1 parent 092a819 commit 8fa7239

File tree

4 files changed

+2639
-0
lines changed

4 files changed

+2639
-0
lines changed

llvm/include/llvm/IR/IntrinsicsRISCVXCV.td

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,70 @@ class ScalarCoreVMacGprGprGprImmIntrinsic
4242
: Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
4343
[IntrNoMem, IntrWillReturn, IntrSpeculatable, ImmArg<ArgIndex<3>>]>;
4444

45+
class ScalarCoreVSimdGprIntrinsic
46+
: Intrinsic<[llvm_i32_ty], [llvm_i32_ty],
47+
[IntrNoMem, IntrWillReturn, IntrSpeculatable]>;
48+
49+
class ScalarCoreVSimdGprGprIntrinsic
50+
: Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
51+
[IntrNoMem, IntrWillReturn, IntrSpeculatable]>;
52+
53+
class ScalarCoreVSimdGprImmIntrinsic
54+
: Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
55+
[IntrNoMem, IntrWillReturn, IntrSpeculatable, ImmArg<ArgIndex<1>>]>;
56+
57+
class ScalarCoreVSimdGprGprGprIntrinsic
58+
: Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
59+
[IntrNoMem, IntrWillReturn, IntrSpeculatable]>;
60+
61+
class ScalarCoreVSimdGprGprImmIntrinsic
62+
: Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
63+
[IntrNoMem, IntrWillReturn, IntrSpeculatable, ImmArg<ArgIndex<2>>]>;
64+
65+
class ScalarCoreVSimdGprGprGprImmIntrinsic
66+
: Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
67+
[IntrNoMem, IntrWillReturn, IntrSpeculatable, ImmArg<ArgIndex<3>>]>;
68+
69+
multiclass ScalarCoreVSimdGprIntrinsicHB {
70+
def int_riscv_cv_simd_ # NAME # _h : ScalarCoreVSimdGprIntrinsic;
71+
def int_riscv_cv_simd_ # NAME # _b : ScalarCoreVSimdGprIntrinsic;
72+
}
73+
74+
multiclass ScalarCoreVSimdGprGprIntrinsicHB {
75+
def int_riscv_cv_simd_ # NAME # _h : ScalarCoreVSimdGprGprIntrinsic;
76+
def int_riscv_cv_simd_ # NAME # _b : ScalarCoreVSimdGprGprIntrinsic;
77+
}
78+
79+
multiclass ScalarCoreVSimdGprGprGprIntrinsicHB {
80+
def int_riscv_cv_simd_ # NAME # _h : ScalarCoreVSimdGprGprGprIntrinsic;
81+
def int_riscv_cv_simd_ # NAME # _b : ScalarCoreVSimdGprGprGprIntrinsic;
82+
}
83+
84+
multiclass ScalarCoreVSimdGprGprIntrinsicDiv {
85+
def int_riscv_cv_simd_ # NAME # _div2 : ScalarCoreVSimdGprGprIntrinsic;
86+
def int_riscv_cv_simd_ # NAME # _div4 : ScalarCoreVSimdGprGprIntrinsic;
87+
def int_riscv_cv_simd_ # NAME # _div8 : ScalarCoreVSimdGprGprIntrinsic;
88+
}
89+
90+
multiclass ScalarCoreVSimdGprImmIntrinsicHB {
91+
def int_riscv_cv_simd_ # NAME # _h : ScalarCoreVSimdGprImmIntrinsic;
92+
def int_riscv_cv_simd_ # NAME # _b : ScalarCoreVSimdGprImmIntrinsic;
93+
}
94+
95+
multiclass CoreVSimdBinary <bit exclude_h = false> {
96+
if exclude_h then {
97+
def int_riscv_cv_simd_ # NAME # _b : ScalarCoreVSimdGprGprIntrinsic;
98+
} else {
99+
defm NAME : ScalarCoreVSimdGprGprIntrinsicHB;
100+
}
101+
defm NAME # _sc : ScalarCoreVSimdGprGprIntrinsicHB;
102+
}
103+
104+
multiclass CoreVSimdTernary {
105+
defm NAME : ScalarCoreVSimdGprGprGprIntrinsicHB;
106+
defm NAME # _sc : ScalarCoreVSimdGprGprGprIntrinsicHB;
107+
}
108+
45109
let TargetPrefix = "riscv" in {
46110
def int_riscv_cv_bitmanip_extract : ScalarCoreVBitManipGprGprIntrinsic;
47111
def int_riscv_cv_bitmanip_extractu : ScalarCoreVBitManipGprGprIntrinsic;
@@ -90,4 +154,64 @@ let TargetPrefix = "riscv" in {
90154
def int_riscv_cv_mac_machhuRN : ScalarCoreVMacGprGprGprImmIntrinsic;
91155
def int_riscv_cv_mac_macsRN : ScalarCoreVMacGprGprGprImmIntrinsic;
92156
def int_riscv_cv_mac_machhsRN : ScalarCoreVMacGprGprGprImmIntrinsic;
157+
158+
defm add : CoreVSimdBinary<true>;
159+
def int_riscv_cv_simd_add_h : ScalarCoreVSimdGprGprImmIntrinsic;
160+
defm sub : CoreVSimdBinary<true>;
161+
def int_riscv_cv_simd_sub_h : ScalarCoreVSimdGprGprImmIntrinsic;
162+
defm avg : CoreVSimdBinary;
163+
defm avgu : CoreVSimdBinary;
164+
defm min : CoreVSimdBinary;
165+
defm minu : CoreVSimdBinary;
166+
defm max : CoreVSimdBinary;
167+
defm maxu : CoreVSimdBinary;
168+
defm srl : CoreVSimdBinary;
169+
defm sra : CoreVSimdBinary;
170+
defm sll : CoreVSimdBinary;
171+
defm or : CoreVSimdBinary;
172+
defm xor : CoreVSimdBinary;
173+
defm and : CoreVSimdBinary;
174+
175+
defm abs : ScalarCoreVSimdGprIntrinsicHB;
176+
177+
defm dotup : CoreVSimdBinary;
178+
defm dotusp : CoreVSimdBinary;
179+
defm dotsp : CoreVSimdBinary;
180+
defm sdotup : CoreVSimdTernary;
181+
defm sdotusp : CoreVSimdTernary;
182+
defm sdotsp : CoreVSimdTernary;
183+
184+
defm extract : ScalarCoreVSimdGprImmIntrinsicHB;
185+
defm extractu : ScalarCoreVSimdGprImmIntrinsicHB;
186+
def int_riscv_cv_simd_insert_b : ScalarCoreVSimdGprGprImmIntrinsic;
187+
def int_riscv_cv_simd_insert_h : ScalarCoreVSimdGprGprImmIntrinsic;
188+
189+
190+
defm shuffle : ScalarCoreVSimdGprGprIntrinsicHB;
191+
def int_riscv_cv_simd_shuffle_sci_h : ScalarCoreVSimdGprImmIntrinsic;
192+
def int_riscv_cv_simd_shuffle_sci_b : ScalarCoreVSimdGprImmIntrinsic;
193+
defm shuffle2 : ScalarCoreVSimdGprGprGprIntrinsicHB;
194+
195+
def int_riscv_cv_simd_packhi_h : ScalarCoreVSimdGprGprIntrinsic;
196+
def int_riscv_cv_simd_packlo_h : ScalarCoreVSimdGprGprIntrinsic;
197+
def int_riscv_cv_simd_packhi_b : ScalarCoreVSimdGprGprGprIntrinsic;
198+
def int_riscv_cv_simd_packlo_b : ScalarCoreVSimdGprGprGprIntrinsic;
199+
200+
defm cmpeq : CoreVSimdBinary;
201+
defm cmpne : CoreVSimdBinary;
202+
defm cmpgt : CoreVSimdBinary;
203+
defm cmpge : CoreVSimdBinary;
204+
defm cmplt : CoreVSimdBinary;
205+
defm cmple : CoreVSimdBinary;
206+
defm cmpgtu : CoreVSimdBinary;
207+
defm cmpgeu : CoreVSimdBinary;
208+
defm cmpltu : CoreVSimdBinary;
209+
defm cmpleu : CoreVSimdBinary;
210+
211+
def int_riscv_cv_simd_cplxmul_r : ScalarCoreVSimdGprGprGprImmIntrinsic;
212+
def int_riscv_cv_simd_cplxmul_i : ScalarCoreVSimdGprGprGprImmIntrinsic;
213+
214+
def int_riscv_cv_simd_cplxconj : ScalarCoreVSimdGprIntrinsic;
215+
216+
def int_riscv_cv_simd_subrotmj : ScalarCoreVSimdGprGprImmIntrinsic;
93217
} // TargetPrefix = "riscv"

llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class RISCVExpandPseudo : public MachineFunctionPass {
5656
MachineBasicBlock::iterator MBBI);
5757
bool expandRV32ZdinxLoad(MachineBasicBlock &MBB,
5858
MachineBasicBlock::iterator MBBI);
59+
bool expandVendorXcvsimdShuffle(MachineBasicBlock &MBB,
60+
MachineBasicBlock::iterator MBBI);
5961
#ifndef NDEBUG
6062
unsigned getInstSizeInBytes(const MachineFunction &MF) const {
6163
unsigned Size = 0;
@@ -164,6 +166,8 @@ bool RISCVExpandPseudo::expandMI(MachineBasicBlock &MBB,
164166
case RISCV::PseudoVMSET_M_B64:
165167
// vmset.m vd => vmxnor.mm vd, vd, vd
166168
return expandVMSET_VMCLR(MBB, MBBI, RISCV::VMXNOR_MM);
169+
case RISCV::CV_SHUFFLE_SCI_B_PSEUDO:
170+
return expandVendorXcvsimdShuffle(MBB, MBBI);
167171
}
168172

169173
return false;
@@ -415,6 +419,24 @@ bool RISCVExpandPseudo::expandRV32ZdinxLoad(MachineBasicBlock &MBB,
415419
return true;
416420
}
417421

422+
bool RISCVExpandPseudo::expandVendorXcvsimdShuffle(MachineBasicBlock &MBB,
423+
MachineBasicBlock::iterator
424+
MBBI) {
425+
DebugLoc DL = MBBI->getDebugLoc();
426+
Register DstReg = MBBI->getOperand(0).getReg();
427+
Register SrcReg = MBBI->getOperand(1).getReg();
428+
uint8_t Imm = MBBI->getOperand(2).getImm();
429+
const unsigned Opcodes[] = {
430+
RISCV::CV_SHUFFLEI0_SCI_B, RISCV::CV_SHUFFLEI1_SCI_B,
431+
RISCV::CV_SHUFFLEI2_SCI_B, RISCV::CV_SHUFFLEI3_SCI_B};
432+
const MCInstrDesc &Desc = TII->get(Opcodes[Imm >> 6]);
433+
BuildMI(MBB, MBBI, DL, Desc, DstReg)
434+
.addReg(SrcReg)
435+
.addImm(APInt(6, Imm, true).getSExtValue());
436+
MBBI->eraseFromParent();
437+
return true;
438+
}
439+
418440
class RISCVPreRAExpandPseudo : public MachineFunctionPass {
419441
public:
420442
const RISCVSubtarget *STI;

0 commit comments

Comments
 (0)