[mips][msa] Implemented fill.d intrinsic.
[oota-llvm.git] / test / CodeGen / Mips / msa / 3rf_4rf_q.ll
1 ; Test the MSA intrinsics that are encoded with the 3RF instruction format and
2 ; use the result as a third operand and perform fixed-point operations.
3
4 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s
5
6 @llvm_mips_madd_q_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
7 @llvm_mips_madd_q_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
8 @llvm_mips_madd_q_h_ARG3 = global <8 x i16> <i16 16, i16 17, i16 18, i16 19, i16 20, i16 21, i16 22, i16 23>, align 16
9 @llvm_mips_madd_q_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
10
11 define void @llvm_mips_madd_q_h_test() nounwind {
12 entry:
13   %0 = load <8 x i16>* @llvm_mips_madd_q_h_ARG1
14   %1 = load <8 x i16>* @llvm_mips_madd_q_h_ARG2
15   %2 = load <8 x i16>* @llvm_mips_madd_q_h_ARG3
16   %3 = tail call <8 x i16> @llvm.mips.madd.q.h(<8 x i16> %0, <8 x i16> %1, <8 x i16> %2)
17   store <8 x i16> %3, <8 x i16>* @llvm_mips_madd_q_h_RES
18   ret void
19 }
20
21 declare <8 x i16> @llvm.mips.madd.q.h(<8 x i16>, <8 x i16>, <8 x i16>) nounwind
22
23 ; CHECK: llvm_mips_madd_q_h_test:
24 ; CHECK: ld.h
25 ; CHECK: ld.h
26 ; CHECK: ld.h
27 ; CHECK: madd_q.h
28 ; CHECK: st.h
29 ; CHECK: .size llvm_mips_madd_q_h_test
30 ;
31 @llvm_mips_madd_q_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
32 @llvm_mips_madd_q_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
33 @llvm_mips_madd_q_w_ARG3 = global <4 x i32> <i32 8, i32 9, i32 10, i32 11>, align 16
34 @llvm_mips_madd_q_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
35
36 define void @llvm_mips_madd_q_w_test() nounwind {
37 entry:
38   %0 = load <4 x i32>* @llvm_mips_madd_q_w_ARG1
39   %1 = load <4 x i32>* @llvm_mips_madd_q_w_ARG2
40   %2 = load <4 x i32>* @llvm_mips_madd_q_w_ARG3
41   %3 = tail call <4 x i32> @llvm.mips.madd.q.w(<4 x i32> %0, <4 x i32> %1, <4 x i32> %2)
42   store <4 x i32> %3, <4 x i32>* @llvm_mips_madd_q_w_RES
43   ret void
44 }
45
46 declare <4 x i32> @llvm.mips.madd.q.w(<4 x i32>, <4 x i32>, <4 x i32>) nounwind
47
48 ; CHECK: llvm_mips_madd_q_w_test:
49 ; CHECK: ld.w
50 ; CHECK: ld.w
51 ; CHECK: ld.w
52 ; CHECK: madd_q.w
53 ; CHECK: st.w
54 ; CHECK: .size llvm_mips_madd_q_w_test
55 ;
56 @llvm_mips_maddr_q_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
57 @llvm_mips_maddr_q_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
58 @llvm_mips_maddr_q_h_ARG3 = global <8 x i16> <i16 16, i16 17, i16 18, i16 19, i16 20, i16 21, i16 22, i16 23>, align 16
59 @llvm_mips_maddr_q_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
60
61 define void @llvm_mips_maddr_q_h_test() nounwind {
62 entry:
63   %0 = load <8 x i16>* @llvm_mips_maddr_q_h_ARG1
64   %1 = load <8 x i16>* @llvm_mips_maddr_q_h_ARG2
65   %2 = load <8 x i16>* @llvm_mips_maddr_q_h_ARG3
66   %3 = tail call <8 x i16> @llvm.mips.maddr.q.h(<8 x i16> %0, <8 x i16> %1, <8 x i16> %2)
67   store <8 x i16> %3, <8 x i16>* @llvm_mips_maddr_q_h_RES
68   ret void
69 }
70
71 declare <8 x i16> @llvm.mips.maddr.q.h(<8 x i16>, <8 x i16>, <8 x i16>) nounwind
72
73 ; CHECK: llvm_mips_maddr_q_h_test:
74 ; CHECK: ld.h
75 ; CHECK: ld.h
76 ; CHECK: ld.h
77 ; CHECK: maddr_q.h
78 ; CHECK: st.h
79 ; CHECK: .size llvm_mips_maddr_q_h_test
80 ;
81 @llvm_mips_maddr_q_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
82 @llvm_mips_maddr_q_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
83 @llvm_mips_maddr_q_w_ARG3 = global <4 x i32> <i32 8, i32 9, i32 10, i32 11>, align 16
84 @llvm_mips_maddr_q_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
85
86 define void @llvm_mips_maddr_q_w_test() nounwind {
87 entry:
88   %0 = load <4 x i32>* @llvm_mips_maddr_q_w_ARG1
89   %1 = load <4 x i32>* @llvm_mips_maddr_q_w_ARG2
90   %2 = load <4 x i32>* @llvm_mips_maddr_q_w_ARG3
91   %3 = tail call <4 x i32> @llvm.mips.maddr.q.w(<4 x i32> %0, <4 x i32> %1, <4 x i32> %2)
92   store <4 x i32> %3, <4 x i32>* @llvm_mips_maddr_q_w_RES
93   ret void
94 }
95
96 declare <4 x i32> @llvm.mips.maddr.q.w(<4 x i32>, <4 x i32>, <4 x i32>) nounwind
97
98 ; CHECK: llvm_mips_maddr_q_w_test:
99 ; CHECK: ld.w
100 ; CHECK: ld.w
101 ; CHECK: ld.w
102 ; CHECK: maddr_q.w
103 ; CHECK: st.w
104 ; CHECK: .size llvm_mips_maddr_q_w_test
105 ;
106 @llvm_mips_msub_q_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
107 @llvm_mips_msub_q_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
108 @llvm_mips_msub_q_h_ARG3 = global <8 x i16> <i16 16, i16 17, i16 18, i16 19, i16 20, i16 21, i16 22, i16 23>, align 16
109 @llvm_mips_msub_q_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
110
111 define void @llvm_mips_msub_q_h_test() nounwind {
112 entry:
113   %0 = load <8 x i16>* @llvm_mips_msub_q_h_ARG1
114   %1 = load <8 x i16>* @llvm_mips_msub_q_h_ARG2
115   %2 = load <8 x i16>* @llvm_mips_msub_q_h_ARG3
116   %3 = tail call <8 x i16> @llvm.mips.msub.q.h(<8 x i16> %0, <8 x i16> %1, <8 x i16> %2)
117   store <8 x i16> %3, <8 x i16>* @llvm_mips_msub_q_h_RES
118   ret void
119 }
120
121 declare <8 x i16> @llvm.mips.msub.q.h(<8 x i16>, <8 x i16>, <8 x i16>) nounwind
122
123 ; CHECK: llvm_mips_msub_q_h_test:
124 ; CHECK: ld.h
125 ; CHECK: ld.h
126 ; CHECK: ld.h
127 ; CHECK: msub_q.h
128 ; CHECK: st.h
129 ; CHECK: .size llvm_mips_msub_q_h_test
130 ;
131 @llvm_mips_msub_q_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
132 @llvm_mips_msub_q_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
133 @llvm_mips_msub_q_w_ARG3 = global <4 x i32> <i32 8, i32 9, i32 10, i32 11>, align 16
134 @llvm_mips_msub_q_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
135
136 define void @llvm_mips_msub_q_w_test() nounwind {
137 entry:
138   %0 = load <4 x i32>* @llvm_mips_msub_q_w_ARG1
139   %1 = load <4 x i32>* @llvm_mips_msub_q_w_ARG2
140   %2 = load <4 x i32>* @llvm_mips_msub_q_w_ARG3
141   %3 = tail call <4 x i32> @llvm.mips.msub.q.w(<4 x i32> %0, <4 x i32> %1, <4 x i32> %2)
142   store <4 x i32> %3, <4 x i32>* @llvm_mips_msub_q_w_RES
143   ret void
144 }
145
146 declare <4 x i32> @llvm.mips.msub.q.w(<4 x i32>, <4 x i32>, <4 x i32>) nounwind
147
148 ; CHECK: llvm_mips_msub_q_w_test:
149 ; CHECK: ld.w
150 ; CHECK: ld.w
151 ; CHECK: ld.w
152 ; CHECK: msub_q.w
153 ; CHECK: st.w
154 ; CHECK: .size llvm_mips_msub_q_w_test
155 ;
156 @llvm_mips_msubr_q_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
157 @llvm_mips_msubr_q_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
158 @llvm_mips_msubr_q_h_ARG3 = global <8 x i16> <i16 16, i16 17, i16 18, i16 19, i16 20, i16 21, i16 22, i16 23>, align 16
159 @llvm_mips_msubr_q_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
160
161 define void @llvm_mips_msubr_q_h_test() nounwind {
162 entry:
163   %0 = load <8 x i16>* @llvm_mips_msubr_q_h_ARG1
164   %1 = load <8 x i16>* @llvm_mips_msubr_q_h_ARG2
165   %2 = load <8 x i16>* @llvm_mips_msubr_q_h_ARG3
166   %3 = tail call <8 x i16> @llvm.mips.msubr.q.h(<8 x i16> %0, <8 x i16> %1, <8 x i16> %2)
167   store <8 x i16> %3, <8 x i16>* @llvm_mips_msubr_q_h_RES
168   ret void
169 }
170
171 declare <8 x i16> @llvm.mips.msubr.q.h(<8 x i16>, <8 x i16>, <8 x i16>) nounwind
172
173 ; CHECK: llvm_mips_msubr_q_h_test:
174 ; CHECK: ld.h
175 ; CHECK: ld.h
176 ; CHECK: ld.h
177 ; CHECK: msubr_q.h
178 ; CHECK: st.h
179 ; CHECK: .size llvm_mips_msubr_q_h_test
180 ;
181 @llvm_mips_msubr_q_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
182 @llvm_mips_msubr_q_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
183 @llvm_mips_msubr_q_w_ARG3 = global <4 x i32> <i32 8, i32 9, i32 10, i32 11>, align 16
184 @llvm_mips_msubr_q_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
185
186 define void @llvm_mips_msubr_q_w_test() nounwind {
187 entry:
188   %0 = load <4 x i32>* @llvm_mips_msubr_q_w_ARG1
189   %1 = load <4 x i32>* @llvm_mips_msubr_q_w_ARG2
190   %2 = load <4 x i32>* @llvm_mips_msubr_q_w_ARG3
191   %3 = tail call <4 x i32> @llvm.mips.msubr.q.w(<4 x i32> %0, <4 x i32> %1, <4 x i32> %2)
192   store <4 x i32> %3, <4 x i32>* @llvm_mips_msubr_q_w_RES
193   ret void
194 }
195
196 declare <4 x i32> @llvm.mips.msubr.q.w(<4 x i32>, <4 x i32>, <4 x i32>) nounwind
197
198 ; CHECK: llvm_mips_msubr_q_w_test:
199 ; CHECK: ld.w
200 ; CHECK: ld.w
201 ; CHECK: ld.w
202 ; CHECK: msubr_q.w
203 ; CHECK: st.w
204 ; CHECK: .size llvm_mips_msubr_q_w_test
205 ;