@@ -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+
45109let 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"
0 commit comments