1*67e74705SXin Li // REQUIRES: mips-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 -triple mips-unknown-linux-gnu -emit-llvm %s -o - \
3*67e74705SXin Li // RUN: | FileCheck %s
4*67e74705SXin Li
5*67e74705SXin Li typedef int q31;
6*67e74705SXin Li typedef int i32;
7*67e74705SXin Li typedef unsigned int ui32;
8*67e74705SXin Li typedef long long a64;
9*67e74705SXin Li
10*67e74705SXin Li typedef signed char v4i8 __attribute__ ((vector_size(4)));
11*67e74705SXin Li typedef signed char v4q7 __attribute__ ((vector_size(4)));
12*67e74705SXin Li typedef short v2i16 __attribute__ ((vector_size(4)));
13*67e74705SXin Li typedef short v2q15 __attribute__ ((vector_size(4)));
14*67e74705SXin Li
foo()15*67e74705SXin Li void foo() {
16*67e74705SXin Li v2q15 v2q15_r, v2q15_a, v2q15_b, v2q15_c;
17*67e74705SXin Li v2i16 v2i16_r, v2i16_a, v2i16_b, v2i16_c;
18*67e74705SXin Li v4q7 v4q7_r, v4q7_a, v4q7_b;
19*67e74705SXin Li v4i8 v4i8_r, v4i8_a, v4i8_b, v4i8_c;
20*67e74705SXin Li q31 q31_r, q31_a, q31_b, q31_c;
21*67e74705SXin Li i32 i32_r, i32_a, i32_b, i32_c;
22*67e74705SXin Li ui32 ui32_r, ui32_a, ui32_b, ui32_c;
23*67e74705SXin Li a64 a64_r, a64_a, a64_b;
24*67e74705SXin Li
25*67e74705SXin Li // MIPS DSP Rev 1
26*67e74705SXin Li
27*67e74705SXin Li v4i8_a = (v4i8) {1, 2, 3, 0xFF};
28*67e74705SXin Li v4i8_b = (v4i8) {2, 4, 6, 8};
29*67e74705SXin Li v4i8_r = __builtin_mips_addu_qb(v4i8_a, v4i8_b);
30*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.addu.qb
31*67e74705SXin Li v4i8_r = __builtin_mips_addu_s_qb(v4i8_a, v4i8_b);
32*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.addu.s.qb
33*67e74705SXin Li v4i8_r = __builtin_mips_subu_qb(v4i8_a, v4i8_b);
34*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.subu.qb
35*67e74705SXin Li v4i8_r = __builtin_mips_subu_s_qb(v4i8_a, v4i8_b);
36*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.subu.s.qb
37*67e74705SXin Li
38*67e74705SXin Li v2q15_a = (v2q15) {0x0000, 0x8000};
39*67e74705SXin Li v2q15_b = (v2q15) {0x8000, 0x8000};
40*67e74705SXin Li v2q15_r = __builtin_mips_addq_ph(v2q15_a, v2q15_b);
41*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.addq.ph
42*67e74705SXin Li v2q15_r = __builtin_mips_addq_s_ph(v2q15_a, v2q15_b);
43*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.addq.s.ph
44*67e74705SXin Li v2q15_r = __builtin_mips_subq_ph(v2q15_a, v2q15_b);
45*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.subq.ph
46*67e74705SXin Li v2q15_r = __builtin_mips_subq_s_ph(v2q15_a, v2q15_b);
47*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.subq.s.ph
48*67e74705SXin Li
49*67e74705SXin Li a64_a = 0x12345678;
50*67e74705SXin Li i32_b = 0x80000000;
51*67e74705SXin Li i32_c = 0x11112222;
52*67e74705SXin Li a64_r = __builtin_mips_madd(a64_a, i32_b, i32_c);
53*67e74705SXin Li // CHECK: call i64 @llvm.mips.madd
54*67e74705SXin Li a64_a = 0x12345678;
55*67e74705SXin Li ui32_b = 0x80000000;
56*67e74705SXin Li ui32_c = 0x11112222;
57*67e74705SXin Li a64_r = __builtin_mips_maddu(a64_a, ui32_b, ui32_c);
58*67e74705SXin Li // CHECK: call i64 @llvm.mips.maddu
59*67e74705SXin Li a64_a = 0x12345678;
60*67e74705SXin Li i32_b = 0x80000000;
61*67e74705SXin Li i32_c = 0x11112222;
62*67e74705SXin Li a64_r = __builtin_mips_msub(a64_a, i32_b, i32_c);
63*67e74705SXin Li // CHECK: call i64 @llvm.mips.msub
64*67e74705SXin Li a64_a = 0x12345678;
65*67e74705SXin Li ui32_b = 0x80000000;
66*67e74705SXin Li ui32_c = 0x11112222;
67*67e74705SXin Li a64_r = __builtin_mips_msubu(a64_a, ui32_b, ui32_c);
68*67e74705SXin Li // CHECK: call i64 @llvm.mips.msubu
69*67e74705SXin Li
70*67e74705SXin Li q31_a = 0x12345678;
71*67e74705SXin Li q31_b = 0x7FFFFFFF;
72*67e74705SXin Li q31_r = __builtin_mips_addq_s_w(q31_a, q31_b);
73*67e74705SXin Li // CHECK: call i32 @llvm.mips.addq.s.w
74*67e74705SXin Li q31_r = __builtin_mips_subq_s_w(q31_a, q31_b);
75*67e74705SXin Li // CHECK: call i32 @llvm.mips.subq.s.w
76*67e74705SXin Li
77*67e74705SXin Li i32_a = 0xFFFFFFFF;
78*67e74705SXin Li i32_b = 1;
79*67e74705SXin Li i32_r = __builtin_mips_addsc(i32_a, i32_b);
80*67e74705SXin Li // CHECK: call i32 @llvm.mips.addsc
81*67e74705SXin Li i32_a = 0;
82*67e74705SXin Li i32_b = 1;
83*67e74705SXin Li i32_r = __builtin_mips_addwc(i32_a, i32_b);
84*67e74705SXin Li // CHECK: call i32 @llvm.mips.addwc
85*67e74705SXin Li
86*67e74705SXin Li i32_a = 20;
87*67e74705SXin Li i32_b = 0x1402;
88*67e74705SXin Li i32_r = __builtin_mips_modsub(i32_a, i32_b);
89*67e74705SXin Li // CHECK: call i32 @llvm.mips.modsub
90*67e74705SXin Li
91*67e74705SXin Li v4i8_a = (v4i8) {1, 2, 3, 4};
92*67e74705SXin Li i32_r = __builtin_mips_raddu_w_qb(v4i8_a);
93*67e74705SXin Li // CHECK: call i32 @llvm.mips.raddu.w.qb
94*67e74705SXin Li
95*67e74705SXin Li v2q15_a = (v2q15) {0xFFFF, 0x8000};
96*67e74705SXin Li v2q15_r = __builtin_mips_absq_s_ph(v2q15_a);
97*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.absq.s.ph
98*67e74705SXin Li q31_a = 0x80000000;
99*67e74705SXin Li q31_r = __builtin_mips_absq_s_w(q31_a);
100*67e74705SXin Li // CHECK: call i32 @llvm.mips.absq.s.w
101*67e74705SXin Li
102*67e74705SXin Li v2q15_a = (v2q15) {0x1234, 0x5678};
103*67e74705SXin Li v2q15_b = (v2q15) {0x1111, 0x2222};
104*67e74705SXin Li v4i8_r = __builtin_mips_precrq_qb_ph(v2q15_a, v2q15_b);
105*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.precrq.qb.ph
106*67e74705SXin Li
107*67e74705SXin Li v2q15_a = (v2q15) {0x7F79, 0xFFFF};
108*67e74705SXin Li v2q15_b = (v2q15) {0x7F81, 0x2000};
109*67e74705SXin Li v4i8_r = __builtin_mips_precrqu_s_qb_ph(v2q15_a, v2q15_b);
110*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.precrqu.s.qb.ph
111*67e74705SXin Li q31_a = 0x12345678;
112*67e74705SXin Li q31_b = 0x11112222;
113*67e74705SXin Li v2q15_r = __builtin_mips_precrq_ph_w(q31_a, q31_b);
114*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precrq.ph.w
115*67e74705SXin Li q31_a = 0x7000FFFF;
116*67e74705SXin Li q31_b = 0x80000000;
117*67e74705SXin Li v2q15_r = __builtin_mips_precrq_rs_ph_w(q31_a, q31_b);
118*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precrq.rs.ph.w
119*67e74705SXin Li v2q15_a = (v2q15) {0x1234, 0x5678};
120*67e74705SXin Li q31_r = __builtin_mips_preceq_w_phl(v2q15_a);
121*67e74705SXin Li // CHECK: call i32 @llvm.mips.preceq.w.phl
122*67e74705SXin Li q31_r = __builtin_mips_preceq_w_phr(v2q15_a);
123*67e74705SXin Li // CHECK: call i32 @llvm.mips.preceq.w.phr
124*67e74705SXin Li v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
125*67e74705SXin Li v2q15_r = __builtin_mips_precequ_ph_qbl(v4i8_a);
126*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precequ.ph.qbl
127*67e74705SXin Li v2q15_r = __builtin_mips_precequ_ph_qbr(v4i8_a);
128*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precequ.ph.qbr
129*67e74705SXin Li v2q15_r = __builtin_mips_precequ_ph_qbla(v4i8_a);
130*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precequ.ph.qbla
131*67e74705SXin Li v2q15_r = __builtin_mips_precequ_ph_qbra(v4i8_a);
132*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precequ.ph.qbra
133*67e74705SXin Li v2q15_r = __builtin_mips_preceu_ph_qbl(v4i8_a);
134*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.preceu.ph.qbl
135*67e74705SXin Li v2q15_r = __builtin_mips_preceu_ph_qbr(v4i8_a);
136*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.preceu.ph.qbr
137*67e74705SXin Li v2q15_r = __builtin_mips_preceu_ph_qbla(v4i8_a);
138*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.preceu.ph.qbla
139*67e74705SXin Li v2q15_r = __builtin_mips_preceu_ph_qbra(v4i8_a);
140*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.preceu.ph.qbra
141*67e74705SXin Li
142*67e74705SXin Li v4i8_a = (v4i8) {1, 2, 3, 4};
143*67e74705SXin Li v4i8_r = __builtin_mips_shll_qb(v4i8_a, 2);
144*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.shll.qb
145*67e74705SXin Li v4i8_a = (v4i8) {128, 64, 32, 16};
146*67e74705SXin Li v4i8_r = __builtin_mips_shrl_qb(v4i8_a, 2);
147*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.shrl.qb
148*67e74705SXin Li v2q15_a = (v2q15) {0x0001, 0x8000};
149*67e74705SXin Li v2q15_r = __builtin_mips_shll_ph(v2q15_a, 2);
150*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.shll.ph
151*67e74705SXin Li v2q15_r = __builtin_mips_shll_s_ph(v2q15_a, 2);
152*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.shll.s.ph
153*67e74705SXin Li v2q15_a = (v2q15) {0x7FFF, 0x8000};
154*67e74705SXin Li v2q15_r = __builtin_mips_shra_ph(v2q15_a, 2);
155*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.shra.ph
156*67e74705SXin Li v2q15_r = __builtin_mips_shra_r_ph(v2q15_a, 2);
157*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.shra.r.ph
158*67e74705SXin Li q31_a = 0x70000000;
159*67e74705SXin Li q31_r = __builtin_mips_shll_s_w(q31_a, 2);
160*67e74705SXin Li // CHECK: call i32 @llvm.mips.shll.s.w
161*67e74705SXin Li q31_a = 0x7FFFFFFF;
162*67e74705SXin Li q31_r = __builtin_mips_shra_r_w(q31_a, 2);
163*67e74705SXin Li // CHECK: call i32 @llvm.mips.shra.r.w
164*67e74705SXin Li a64_a = 0x1234567887654321LL;
165*67e74705SXin Li a64_r = __builtin_mips_shilo(a64_a, -8);
166*67e74705SXin Li // CHECK: call i64 @llvm.mips.shilo
167*67e74705SXin Li
168*67e74705SXin Li v4i8_a = (v4i8) {0x1, 0x3, 0x5, 0x7};
169*67e74705SXin Li v2q15_b = (v2q15) {0x1234, 0x5678};
170*67e74705SXin Li v2q15_r = __builtin_mips_muleu_s_ph_qbl(v4i8_a, v2q15_b);
171*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.muleu.s.ph.qbl
172*67e74705SXin Li v2q15_r = __builtin_mips_muleu_s_ph_qbr(v4i8_a, v2q15_b);
173*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.muleu.s.ph.qbr
174*67e74705SXin Li v2q15_a = (v2q15) {0x7FFF, 0x8000};
175*67e74705SXin Li v2q15_b = (v2q15) {0x7FFF, 0x8000};
176*67e74705SXin Li v2q15_r = __builtin_mips_mulq_rs_ph(v2q15_a, v2q15_b);
177*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.mulq.rs.ph
178*67e74705SXin Li v2q15_a = (v2q15) {0x1234, 0x8000};
179*67e74705SXin Li v2q15_b = (v2q15) {0x5678, 0x8000};
180*67e74705SXin Li q31_r = __builtin_mips_muleq_s_w_phl(v2q15_a, v2q15_b);
181*67e74705SXin Li // CHECK: call i32 @llvm.mips.muleq.s.w.phl
182*67e74705SXin Li q31_r = __builtin_mips_muleq_s_w_phr(v2q15_a, v2q15_b);
183*67e74705SXin Li // CHECK: call i32 @llvm.mips.muleq.s.w.phr
184*67e74705SXin Li a64_a = 0;
185*67e74705SXin Li v2q15_a = (v2q15) {0x0001, 0x8000};
186*67e74705SXin Li v2q15_b = (v2q15) {0x0002, 0x8000};
187*67e74705SXin Li a64_r = __builtin_mips_mulsaq_s_w_ph(a64_a, v2q15_b, v2q15_c);
188*67e74705SXin Li // CHECK: call i64 @llvm.mips.mulsaq.s.w.ph
189*67e74705SXin Li a64_a = 0;
190*67e74705SXin Li v2q15_b = (v2q15) {0x0001, 0x8000};
191*67e74705SXin Li v2q15_c = (v2q15) {0x0002, 0x8000};
192*67e74705SXin Li a64_r = __builtin_mips_maq_s_w_phl(a64_a, v2q15_b, v2q15_c);
193*67e74705SXin Li // CHECK: call i64 @llvm.mips.maq.s.w.phl
194*67e74705SXin Li a64_r = __builtin_mips_maq_s_w_phr(a64_a, v2q15_b, v2q15_c);
195*67e74705SXin Li // CHECK: call i64 @llvm.mips.maq.s.w.phr
196*67e74705SXin Li a64_a = 0x7FFFFFF0;
197*67e74705SXin Li a64_r = __builtin_mips_maq_sa_w_phl(a64_a, v2q15_b, v2q15_c);
198*67e74705SXin Li // CHECK: call i64 @llvm.mips.maq.sa.w.phl
199*67e74705SXin Li a64_r = __builtin_mips_maq_sa_w_phr(a64_a, v2q15_b, v2q15_c);
200*67e74705SXin Li // CHECK: call i64 @llvm.mips.maq.sa.w.phr
201*67e74705SXin Li i32_a = 0x80000000;
202*67e74705SXin Li i32_b = 0x11112222;
203*67e74705SXin Li a64_r = __builtin_mips_mult(i32_a, i32_b);
204*67e74705SXin Li // CHECK: call i64 @llvm.mips.mult
205*67e74705SXin Li ui32_a = 0x80000000;
206*67e74705SXin Li ui32_b = 0x11112222;
207*67e74705SXin Li a64_r = __builtin_mips_multu(ui32_a, ui32_b);
208*67e74705SXin Li // CHECK: call i64 @llvm.mips.multu
209*67e74705SXin Li
210*67e74705SXin Li a64_a = 0;
211*67e74705SXin Li v4i8_b = (v4i8) {1, 2, 3, 4};
212*67e74705SXin Li v4i8_c = (v4i8) {4, 5, 6, 7};
213*67e74705SXin Li a64_r = __builtin_mips_dpau_h_qbl(a64_a, v4i8_b, v4i8_c);
214*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpau.h.qbl
215*67e74705SXin Li a64_r = __builtin_mips_dpau_h_qbr(a64_a, v4i8_b, v4i8_c);
216*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpau.h.qbr
217*67e74705SXin Li a64_r = __builtin_mips_dpsu_h_qbl(a64_a, v4i8_b, v4i8_c);
218*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpsu.h.qbl
219*67e74705SXin Li a64_r = __builtin_mips_dpsu_h_qbr(a64_a, v4i8_b, v4i8_c);
220*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpsu.h.qbr
221*67e74705SXin Li a64_a = 0;
222*67e74705SXin Li v2q15_b = (v2q15) {0x0001, 0x8000};
223*67e74705SXin Li v2q15_c = (v2q15) {0x0002, 0x8000};
224*67e74705SXin Li a64_r = __builtin_mips_dpaq_s_w_ph(a64_a, v2q15_b, v2q15_c);
225*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpaq.s.w.ph
226*67e74705SXin Li a64_r = __builtin_mips_dpsq_s_w_ph(a64_a, v2q15_b, v2q15_c);
227*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpsq.s.w.ph
228*67e74705SXin Li a64_a = 0;
229*67e74705SXin Li q31_b = 0x80000000;
230*67e74705SXin Li q31_c = 0x80000000;
231*67e74705SXin Li a64_r = __builtin_mips_dpaq_sa_l_w(a64_a, q31_b, q31_c);
232*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpaq.sa.l.w
233*67e74705SXin Li a64_r = __builtin_mips_dpsq_sa_l_w(a64_a, q31_b, q31_c);
234*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpsq.sa.l.w
235*67e74705SXin Li
236*67e74705SXin Li v4i8_a = (v4i8) {1, 4, 10, 8};
237*67e74705SXin Li v4i8_b = (v4i8) {1, 2, 100, 8};
238*67e74705SXin Li __builtin_mips_cmpu_eq_qb(v4i8_a, v4i8_b);
239*67e74705SXin Li // CHECK: call void @llvm.mips.cmpu.eq.qb
240*67e74705SXin Li __builtin_mips_cmpu_lt_qb(v4i8_a, v4i8_b);
241*67e74705SXin Li // CHECK: call void @llvm.mips.cmpu.lt.qb
242*67e74705SXin Li __builtin_mips_cmpu_le_qb(v4i8_a, v4i8_b);
243*67e74705SXin Li // CHECK: call void @llvm.mips.cmpu.le.qb
244*67e74705SXin Li i32_r = __builtin_mips_cmpgu_eq_qb(v4i8_a, v4i8_b);
245*67e74705SXin Li // CHECK: call i32 @llvm.mips.cmpgu.eq.qb
246*67e74705SXin Li i32_r = __builtin_mips_cmpgu_lt_qb(v4i8_a, v4i8_b);
247*67e74705SXin Li // CHECK: call i32 @llvm.mips.cmpgu.lt.qb
248*67e74705SXin Li i32_r = __builtin_mips_cmpgu_le_qb(v4i8_a, v4i8_b);
249*67e74705SXin Li // CHECK: call i32 @llvm.mips.cmpgu.le.qb
250*67e74705SXin Li v2q15_a = (v2q15) {0x1111, 0x1234};
251*67e74705SXin Li v2q15_b = (v2q15) {0x4444, 0x1234};
252*67e74705SXin Li __builtin_mips_cmp_eq_ph(v2q15_a, v2q15_b);
253*67e74705SXin Li // CHECK: call void @llvm.mips.cmp.eq.ph
254*67e74705SXin Li __builtin_mips_cmp_lt_ph(v2q15_a, v2q15_b);
255*67e74705SXin Li // CHECK: call void @llvm.mips.cmp.lt.ph
256*67e74705SXin Li __builtin_mips_cmp_le_ph(v2q15_a, v2q15_b);
257*67e74705SXin Li // CHECK: call void @llvm.mips.cmp.le.ph
258*67e74705SXin Li
259*67e74705SXin Li a64_a = 0xFFFFF81230000000LL;
260*67e74705SXin Li i32_r = __builtin_mips_extr_s_h(a64_a, 4);
261*67e74705SXin Li // CHECK: call i32 @llvm.mips.extr.s.h
262*67e74705SXin Li a64_a = 0x8123456712345678LL;
263*67e74705SXin Li i32_r = __builtin_mips_extr_w(a64_a, 31);
264*67e74705SXin Li // CHECK: call i32 @llvm.mips.extr.w
265*67e74705SXin Li i32_r = __builtin_mips_extr_rs_w(a64_a, 31);
266*67e74705SXin Li // CHECK: call i32 @llvm.mips.extr.rs.w
267*67e74705SXin Li i32_r = __builtin_mips_extr_r_w(a64_a, 31);
268*67e74705SXin Li // CHECK: call i32 @llvm.mips.extr.r.w
269*67e74705SXin Li a64_a = 0x1234567887654321LL;
270*67e74705SXin Li i32_r = __builtin_mips_extp(a64_a, 3);
271*67e74705SXin Li // CHECK: call i32 @llvm.mips.extp
272*67e74705SXin Li a64_a = 0x123456789ABCDEF0LL;
273*67e74705SXin Li i32_r = __builtin_mips_extpdp(a64_a, 7);
274*67e74705SXin Li // CHECK: call i32 @llvm.mips.extpdp
275*67e74705SXin Li
276*67e74705SXin Li __builtin_mips_wrdsp(2052, 3);
277*67e74705SXin Li // CHECK: call void @llvm.mips.wrdsp
278*67e74705SXin Li i32_r = __builtin_mips_rddsp(3);
279*67e74705SXin Li // CHECK: call i32 @llvm.mips.rddsp
280*67e74705SXin Li i32_a = 0xFFFFFFFF;
281*67e74705SXin Li i32_b = 0x12345678;
282*67e74705SXin Li __builtin_mips_wrdsp((16<<7) + 4, 3);
283*67e74705SXin Li // CHECK: call void @llvm.mips.wrdsp
284*67e74705SXin Li i32_r = __builtin_mips_insv(i32_a, i32_b);
285*67e74705SXin Li // CHECK: call i32 @llvm.mips.insv
286*67e74705SXin Li i32_a = 0x1234;
287*67e74705SXin Li i32_r = __builtin_mips_bitrev(i32_a);
288*67e74705SXin Li // CHECK: call i32 @llvm.mips.bitrev
289*67e74705SXin Li v2q15_a = (v2q15) {0x1111, 0x2222};
290*67e74705SXin Li v2q15_b = (v2q15) {0x3333, 0x4444};
291*67e74705SXin Li v2q15_r = __builtin_mips_packrl_ph(v2q15_a, v2q15_b);
292*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.packrl.ph
293*67e74705SXin Li i32_a = 100;
294*67e74705SXin Li v4i8_r = __builtin_mips_repl_qb(i32_a);
295*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.repl.qb
296*67e74705SXin Li i32_a = 0x1234;
297*67e74705SXin Li v2q15_r = __builtin_mips_repl_ph(i32_a);
298*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.repl.ph
299*67e74705SXin Li v4i8_a = (v4i8) {1, 4, 10, 8};
300*67e74705SXin Li v4i8_b = (v4i8) {1, 2, 100, 8};
301*67e74705SXin Li __builtin_mips_cmpu_eq_qb(v4i8_a, v4i8_b);
302*67e74705SXin Li // CHECK: call void @llvm.mips.cmpu.eq.qb
303*67e74705SXin Li v4i8_r = __builtin_mips_pick_qb(v4i8_a, v4i8_b);
304*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.pick.qb
305*67e74705SXin Li v2q15_a = (v2q15) {0x1111, 0x1234};
306*67e74705SXin Li v2q15_b = (v2q15) {0x4444, 0x1234};
307*67e74705SXin Li __builtin_mips_cmp_eq_ph(v2q15_a, v2q15_b);
308*67e74705SXin Li // CHECK: call void @llvm.mips.cmp.eq.ph
309*67e74705SXin Li v2q15_r = __builtin_mips_pick_ph(v2q15_a, v2q15_b);
310*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.pick.ph
311*67e74705SXin Li a64_a = 0x1234567887654321LL;
312*67e74705SXin Li i32_b = 0x11112222;
313*67e74705SXin Li __builtin_mips_wrdsp(0, 1);
314*67e74705SXin Li // CHECK: call void @llvm.mips.wrdsp
315*67e74705SXin Li a64_r = __builtin_mips_mthlip(a64_a, i32_b);
316*67e74705SXin Li // CHECK: call i64 @llvm.mips.mthlip
317*67e74705SXin Li i32_r = __builtin_mips_bposge32();
318*67e74705SXin Li // CHECK: call i32 @llvm.mips.bposge32
319*67e74705SXin Li char array_a[100];
320*67e74705SXin Li i32_r = __builtin_mips_lbux(array_a, 20);
321*67e74705SXin Li // CHECK: call i32 @llvm.mips.lbux
322*67e74705SXin Li short array_b[100];
323*67e74705SXin Li i32_r = __builtin_mips_lhx(array_b, 20);
324*67e74705SXin Li // CHECK: call i32 @llvm.mips.lhx
325*67e74705SXin Li int array_c[100];
326*67e74705SXin Li i32_r = __builtin_mips_lwx(array_c, 20);
327*67e74705SXin Li // CHECK: call i32 @llvm.mips.lwx
328*67e74705SXin Li
329*67e74705SXin Li // MIPS DSP Rev 2
330*67e74705SXin Li
331*67e74705SXin Li v4q7_a = (v4q7) {0x81, 0xff, 0x80, 0x23};
332*67e74705SXin Li v4q7_r = __builtin_mips_absq_s_qb (v4q7_a);
333*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.absq.s.qb
334*67e74705SXin Li
335*67e74705SXin Li v2q15_a = (v2q15) {0x3334, 0x4444};
336*67e74705SXin Li v2q15_b = (v2q15) {0x1111, 0x2222};
337*67e74705SXin Li v2q15_r = __builtin_mips_addqh_ph(v2q15_a, v2q15_b);
338*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.addqh.ph
339*67e74705SXin Li v2q15_a = (v2q15) {0x3334, 0x4444};
340*67e74705SXin Li v2q15_b = (v2q15) {0x1111, 0x2222};
341*67e74705SXin Li v2q15_r = __builtin_mips_addqh_r_ph(v2q15_a, v2q15_b);
342*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.addqh.r.ph
343*67e74705SXin Li q31_a = 0x11111112;
344*67e74705SXin Li q31_b = 0x99999999;
345*67e74705SXin Li q31_r = __builtin_mips_addqh_w(q31_a, q31_b);
346*67e74705SXin Li // CHECK: call i32 @llvm.mips.addqh.w
347*67e74705SXin Li q31_a = 0x11111112;
348*67e74705SXin Li q31_b = 0x99999999;
349*67e74705SXin Li q31_r = __builtin_mips_addqh_r_w(q31_a, q31_b);
350*67e74705SXin Li // CHECK: call i32 @llvm.mips.addqh.r.w
351*67e74705SXin Li
352*67e74705SXin Li v2i16_a = (v2i16) {0xffff, 0x2468};
353*67e74705SXin Li v2i16_b = (v2i16) {0x1234, 0x1111};
354*67e74705SXin Li v2i16_r = __builtin_mips_addu_ph(v2i16_a, v2i16_b);
355*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.addu.ph
356*67e74705SXin Li v2i16_a = (v2i16) {0xffff, 0x2468};
357*67e74705SXin Li v2i16_b = (v2i16) {0x1234, 0x1111};
358*67e74705SXin Li v2i16_r = __builtin_mips_addu_s_ph(v2i16_a, v2i16_b);
359*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.addu.s.ph
360*67e74705SXin Li v4i8_a = (v4i8) {0x11, 0x22, 0x33, 0xff};
361*67e74705SXin Li v4i8_b = (v4i8) {0x11, 0x33, 0x99, 0xff};
362*67e74705SXin Li v4i8_r = __builtin_mips_adduh_qb(v4i8_a, v4i8_b);
363*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.adduh.qb
364*67e74705SXin Li v4i8_a = (v4i8) {0x11, 0x22, 0x33, 0xff};
365*67e74705SXin Li v4i8_b = (v4i8) {0x11, 0x33, 0x99, 0xff};
366*67e74705SXin Li v4i8_r = __builtin_mips_adduh_r_qb(v4i8_a, v4i8_b);
367*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.adduh.r.qb
368*67e74705SXin Li
369*67e74705SXin Li i32_a = 0x12345678;
370*67e74705SXin Li i32_b = 0x87654321;
371*67e74705SXin Li i32_r = __builtin_mips_append(i32_a, i32_b, 16);
372*67e74705SXin Li // CHECK: call i32 @llvm.mips.append
373*67e74705SXin Li i32_a = 0x12345678;
374*67e74705SXin Li i32_b = 0x87654321;
375*67e74705SXin Li i32_r = __builtin_mips_balign(i32_a, i32_b, 3);
376*67e74705SXin Li // CHECK: call i32 @llvm.mips.balign
377*67e74705SXin Li
378*67e74705SXin Li v4i8_a = (v4i8) {0x11, 0x22, 0x33, 0x44};
379*67e74705SXin Li v4i8_b = (v4i8) {0x11, 0x33, 0x33, 0x44};
380*67e74705SXin Li i32_r = __builtin_mips_cmpgdu_eq_qb(v4i8_a, v4i8_b);
381*67e74705SXin Li // CHECK: call i32 @llvm.mips.cmpgdu.eq.qb
382*67e74705SXin Li v4i8_a = (v4i8) {0x11, 0x22, 0x33, 0x44};
383*67e74705SXin Li v4i8_b = (v4i8) {0x11, 0x33, 0x33, 0x44};
384*67e74705SXin Li i32_r = __builtin_mips_cmpgdu_lt_qb(v4i8_a, v4i8_b);
385*67e74705SXin Li // CHECK: call i32 @llvm.mips.cmpgdu.lt.qb
386*67e74705SXin Li v4i8_a = (v4i8) {0x11, 0x22, 0x33, 0x54};
387*67e74705SXin Li v4i8_b = (v4i8) {0x11, 0x33, 0x33, 0x44};
388*67e74705SXin Li i32_r = __builtin_mips_cmpgdu_le_qb(v4i8_a, v4i8_b);
389*67e74705SXin Li // CHECK: call i32 @llvm.mips.cmpgdu.le.qb
390*67e74705SXin Li
391*67e74705SXin Li a64_a = 0x12345678;
392*67e74705SXin Li v2i16_b = (v2i16) {0xffff, 0x1555};
393*67e74705SXin Li v2i16_c = (v2i16) {0x1234, 0x3322};
394*67e74705SXin Li a64_r = __builtin_mips_dpa_w_ph(a64_a, v2i16_b, v2i16_c);
395*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpa.w.ph
396*67e74705SXin Li a64_a = 0x12345678;
397*67e74705SXin Li v2i16_b = (v2i16) {0xffff, 0x1555};
398*67e74705SXin Li v2i16_c = (v2i16) {0x1234, 0x3322};
399*67e74705SXin Li a64_r = __builtin_mips_dps_w_ph(a64_a, v2i16_b, v2i16_c);
400*67e74705SXin Li // CHECK: call i64 @llvm.mips.dps.w.ph
401*67e74705SXin Li
402*67e74705SXin Li a64_a = 0x70000000;
403*67e74705SXin Li v2q15_b = (v2q15) {0x4000, 0x2000};
404*67e74705SXin Li v2q15_c = (v2q15) {0x2000, 0x4000};
405*67e74705SXin Li a64_r = __builtin_mips_dpaqx_s_w_ph(a64_a, v2q15_b, v2q15_c);
406*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpaqx.s.w.ph
407*67e74705SXin Li a64_a = 0x70000000;
408*67e74705SXin Li v2q15_b = (v2q15) {0x4000, 0x2000};
409*67e74705SXin Li v2q15_c = (v2q15) {0x2000, 0x4000};
410*67e74705SXin Li a64_r = __builtin_mips_dpaqx_sa_w_ph(a64_a, v2q15_b, v2q15_c);
411*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpaqx.sa.w.ph
412*67e74705SXin Li a64_a = 0x1111222212345678LL;
413*67e74705SXin Li v2i16_b = (v2i16) {0x1, 0x2};
414*67e74705SXin Li v2i16_c = (v2i16) {0x3, 0x4};
415*67e74705SXin Li a64_r = __builtin_mips_dpax_w_ph(a64_a, v2i16_b, v2i16_c);
416*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpax.w.ph
417*67e74705SXin Li a64_a = 0x9999111112345678LL;
418*67e74705SXin Li v2i16_b = (v2i16) {0x1, 0x2};
419*67e74705SXin Li v2i16_c = (v2i16) {0x3, 0x4};
420*67e74705SXin Li a64_r = __builtin_mips_dpsx_w_ph(a64_a, v2i16_b, v2i16_c);
421*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpsx.w.ph
422*67e74705SXin Li a64_a = 0x70000000;
423*67e74705SXin Li v2q15_b = (v2q15) {0x4000, 0x2000};
424*67e74705SXin Li v2q15_c = (v2q15) {0x2000, 0x4000};
425*67e74705SXin Li a64_r = __builtin_mips_dpsqx_s_w_ph(a64_a, v2q15_b, v2q15_c);
426*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpsqx.s.w.ph
427*67e74705SXin Li a64_a = 0xFFFFFFFF80000000LL;
428*67e74705SXin Li v2q15_b = (v2q15) {0x4000, 0x2000};
429*67e74705SXin Li v2q15_c = (v2q15) {0x2000, 0x4000};
430*67e74705SXin Li a64_r = __builtin_mips_dpsqx_sa_w_ph(a64_a, v2q15_b, v2q15_c);
431*67e74705SXin Li // CHECK: call i64 @llvm.mips.dpsqx.sa.w.ph
432*67e74705SXin Li
433*67e74705SXin Li v2i16_a = (v2i16) {0xffff, 0x2468};
434*67e74705SXin Li v2i16_b = (v2i16) {0x1234, 0x1111};
435*67e74705SXin Li v2i16_r = __builtin_mips_mul_ph(v2i16_a, v2i16_b);
436*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.mul.ph
437*67e74705SXin Li v2i16_a = (v2i16) {0x8000, 0x7fff};
438*67e74705SXin Li v2i16_b = (v2i16) {0x1234, 0x1111};
439*67e74705SXin Li v2i16_r = __builtin_mips_mul_s_ph(v2i16_a, v2i16_b);
440*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.mul.s.ph
441*67e74705SXin Li
442*67e74705SXin Li q31_a = 0x80000000;
443*67e74705SXin Li q31_b = 0x80000000;
444*67e74705SXin Li q31_r = __builtin_mips_mulq_rs_w(q31_a, q31_b);
445*67e74705SXin Li // CHECK: call i32 @llvm.mips.mulq.rs.w
446*67e74705SXin Li v2q15_a = (v2q15) {0xffff, 0x8000};
447*67e74705SXin Li v2q15_b = (v2q15) {0x1111, 0x8000};
448*67e74705SXin Li v2q15_r = __builtin_mips_mulq_s_ph(v2q15_a, v2q15_b);
449*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.mulq.s.ph
450*67e74705SXin Li q31_a = 0x00000002;
451*67e74705SXin Li q31_b = 0x80000000;
452*67e74705SXin Li q31_r = __builtin_mips_mulq_s_w(q31_a, q31_b);
453*67e74705SXin Li // CHECK: call i32 @llvm.mips.mulq.s.w
454*67e74705SXin Li a64_a = 0x19848419;
455*67e74705SXin Li v2i16_b = (v2i16) {0xffff, 0x8000};
456*67e74705SXin Li v2i16_c = (v2i16) {0x1111, 0x8000};
457*67e74705SXin Li a64_r = __builtin_mips_mulsa_w_ph(a64_a, v2i16_b, v2i16_c);
458*67e74705SXin Li // CHECK: call i64 @llvm.mips.mulsa.w.ph
459*67e74705SXin Li
460*67e74705SXin Li v2i16_a = (v2i16) {0x1234, 0x5678};
461*67e74705SXin Li v2i16_b = (v2i16) {0x2233, 0x5566};
462*67e74705SXin Li v4i8_r = __builtin_mips_precr_qb_ph(v2i16_a, v2i16_b);
463*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.precr.qb.ph
464*67e74705SXin Li i32_a = 0x12345678;
465*67e74705SXin Li i32_b = 0x33334444;
466*67e74705SXin Li v2i16_r = __builtin_mips_precr_sra_ph_w(i32_a, i32_b, 4);
467*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precr.sra.ph.w
468*67e74705SXin Li i32_a = 0x12345678;
469*67e74705SXin Li i32_b = 0x33334444;
470*67e74705SXin Li v2i16_r = __builtin_mips_precr_sra_r_ph_w(i32_a, i32_b, 4);
471*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.precr.sra.r.ph.w
472*67e74705SXin Li
473*67e74705SXin Li i32_a = 0x12345678;
474*67e74705SXin Li i32_b = 0x87654321;
475*67e74705SXin Li i32_r = __builtin_mips_prepend(i32_a, i32_b, 16);
476*67e74705SXin Li // CHECK: call i32 @llvm.mips.prepend
477*67e74705SXin Li
478*67e74705SXin Li v4i8_a = (v4i8) {0x12, 0x45, 0x77, 0x99};
479*67e74705SXin Li v4i8_r = __builtin_mips_shra_qb(v4i8_a, 1);
480*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.shra.qb
481*67e74705SXin Li v4i8_a = (v4i8) {0x12, 0x45, 0x77, 0x99};
482*67e74705SXin Li i32_b = 1;
483*67e74705SXin Li v4i8_r = __builtin_mips_shra_qb(v4i8_a, i32_b);
484*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.shra.qb
485*67e74705SXin Li v4i8_a = (v4i8) {0x12, 0x45, 0x77, 0x99};
486*67e74705SXin Li v4i8_r = __builtin_mips_shra_r_qb(v4i8_a, 1);
487*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.shra.r.qb
488*67e74705SXin Li v4i8_a = (v4i8) {0x12, 0x45, 0x77, 0x99};
489*67e74705SXin Li i32_b = 1;
490*67e74705SXin Li v4i8_r = __builtin_mips_shra_r_qb(v4i8_a, i32_b);
491*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.shra.r.qb
492*67e74705SXin Li v2i16_a = (v2i16) {0x1357, 0x2468};
493*67e74705SXin Li v2i16_r = __builtin_mips_shrl_ph(v2i16_a, 4);
494*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.shrl.ph
495*67e74705SXin Li v2i16_a = (v2i16) {0x1357, 0x2468};
496*67e74705SXin Li i32_b = 8;
497*67e74705SXin Li v2i16_r = __builtin_mips_shrl_ph (v2i16_a, i32_b);
498*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.shrl.ph
499*67e74705SXin Li
500*67e74705SXin Li v2q15_a = (v2q15) {0x3334, 0x4444};
501*67e74705SXin Li v2q15_b = (v2q15) {0x1111, 0x2222};
502*67e74705SXin Li v2q15_r = __builtin_mips_subqh_ph(v2q15_a, v2q15_b);
503*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.subqh.ph
504*67e74705SXin Li v2q15_a = (v2q15) {0x3334, 0x4444};
505*67e74705SXin Li v2q15_b = (v2q15) {0x1111, 0x2222};
506*67e74705SXin Li v2q15_r = __builtin_mips_subqh_r_ph(v2q15_a, v2q15_b);
507*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.subqh.r.ph
508*67e74705SXin Li q31_a = 0x11111112;
509*67e74705SXin Li q31_b = 0x99999999;
510*67e74705SXin Li q31_r = __builtin_mips_subqh_w(q31_a, q31_b);
511*67e74705SXin Li // CHECK: call i32 @llvm.mips.subqh.w
512*67e74705SXin Li q31_a = 0x11111112;
513*67e74705SXin Li q31_b = 0x99999999;
514*67e74705SXin Li q31_r = __builtin_mips_subqh_r_w(q31_a, q31_b);
515*67e74705SXin Li // CHECK: call i32 @llvm.mips.subqh.r.w
516*67e74705SXin Li
517*67e74705SXin Li v2i16_a = (v2i16) {0x1357, 0x4455};
518*67e74705SXin Li v2i16_b = (v2i16) {0x3333, 0x4444};
519*67e74705SXin Li v2i16_r = __builtin_mips_subu_ph(v2i16_a, v2i16_b);
520*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.subu.ph
521*67e74705SXin Li v2i16_a = (v2i16) {0x1357, 0x4455};
522*67e74705SXin Li v2i16_b = (v2i16) {0x3333, 0x4444};
523*67e74705SXin Li v2i16_r = __builtin_mips_subu_s_ph(v2i16_a, v2i16_b);
524*67e74705SXin Li // CHECK: call <2 x i16> @llvm.mips.subu.s.ph
525*67e74705SXin Li
526*67e74705SXin Li v4i8_a = (v4i8) {0x33 ,0x44, 0x55, 0x66};
527*67e74705SXin Li v4i8_b = (v4i8) {0x99 ,0x15, 0x85, 0xff};
528*67e74705SXin Li v4i8_r = __builtin_mips_subuh_qb(v4i8_a, v4i8_b);
529*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.subuh.qb
530*67e74705SXin Li v4i8_a = (v4i8) {0x33 ,0x44, 0x55, 0x66};
531*67e74705SXin Li v4i8_b = (v4i8) {0x99 ,0x15, 0x85, 0xff};
532*67e74705SXin Li v4i8_r = __builtin_mips_subuh_r_qb(v4i8_a, v4i8_b);
533*67e74705SXin Li // CHECK: call <4 x i8> @llvm.mips.subuh.r.qb
534*67e74705SXin Li }
535*67e74705SXin Li
test_eh_return_data_regno()536*67e74705SXin Li void test_eh_return_data_regno()
537*67e74705SXin Li {
538*67e74705SXin Li volatile int res;
539*67e74705SXin Li res = __builtin_eh_return_data_regno(0); // CHECK: store volatile i32 4
540*67e74705SXin Li res = __builtin_eh_return_data_regno(1); // CHECK: store volatile i32 5
541*67e74705SXin Li }
542