OLD | NEW |
1 ; This checks support for insertelement and extractelement. | 1 ; This checks support for insertelement and extractelement. |
2 | 2 |
3 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ | 3 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ |
4 ; RUN: | FileCheck %s | 4 ; RUN: | FileCheck %s |
5 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 \ | 5 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 \ |
6 ; RUN: | FileCheck %s | 6 ; RUN: | FileCheck %s |
7 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 -mattr=sse4.1 \ | 7 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 -mattr=sse4.1 \ |
8 ; RUN: | FileCheck --check-prefix=SSE41 %s | 8 ; RUN: | FileCheck --check-prefix=SSE41 %s |
9 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 -mattr=sse4.1 \ | 9 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 -mattr=sse4.1 \ |
10 ; RUN: | FileCheck --check-prefix=SSE41 %s | 10 ; RUN: | FileCheck --check-prefix=SSE41 %s |
11 | 11 |
| 12 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
| 13 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target mips32\ |
| 14 ; RUN: -i %s --args -O2 --skip-unimplemented \ |
| 15 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ |
| 16 ; RUN: --command FileCheck --check-prefix MIPS32 %s |
| 17 |
12 ; insertelement operations | 18 ; insertelement operations |
13 | 19 |
14 define internal <4 x float> @insertelement_v4f32_0(<4 x float> %vec, | 20 define internal <4 x float> @insertelement_v4f32_0(<4 x float> %vec, |
15 float %elt) { | 21 float %elt) { |
16 entry: | 22 entry: |
17 %res = insertelement <4 x float> %vec, float %elt, i32 0 | 23 %res = insertelement <4 x float> %vec, float %elt, i32 0 |
18 ret <4 x float> %res | 24 ret <4 x float> %res |
19 ; CHECK-LABEL: insertelement_v4f32_0 | 25 ; CHECK-LABEL: insertelement_v4f32_0 |
20 ; CHECK: movss | 26 ; CHECK: movss |
21 | 27 |
22 ; SSE41-LABEL: insertelement_v4f32_0 | 28 ; SSE41-LABEL: insertelement_v4f32_0 |
23 ; SSE41: insertps {{.*}},{{.*}},0x0 | 29 ; SSE41: insertps {{.*}},{{.*}},0x0 |
| 30 |
| 31 ; *** a0 - implicit return <4 x float> |
| 32 ; *** a1 - unused due to alignment of %vec |
| 33 ; *** a2:a3:sp[16]:s[20] - %vec |
| 34 ; *** sp[24] - %elt |
| 35 ; MIPS32-LABEL: insertelement_v4f32_0 |
| 36 ; *** Load element 2 and 3 of %vec |
| 37 ; MIPS32: lw [[BV_E2:.*]], |
| 38 ; MIPS32: lw [[BV_E3:.*]], |
| 39 ; *** Load %elt |
| 40 ; MIPS32: lwc1 [[ELT:.*]], |
| 41 ; *** Insert %elt at %vec[0] |
| 42 ; MIPS32: mfc1 [[RV_E0:.*]],[[ELT]] |
| 43 ; MIPS32: move [[RET_PTR:.*]],a0 |
| 44 ; MIPS32: sw [[RV_E0]],0([[RET_PTR]]) |
| 45 ; MIPS32: sw a3,4([[RET_PTR]]) |
| 46 ; MIPS32: sw [[BV_E2]],8([[RET_PTR]]) |
| 47 ; MIPS32: sw [[BV_E3]],12([[RET_PTR]]) |
24 } | 48 } |
25 | 49 |
26 define internal <4 x i32> @insertelement_v4i32_0(<4 x i32> %vec, i32 %elt) { | 50 define internal <4 x i32> @insertelement_v4i32_0(<4 x i32> %vec, i32 %elt) { |
27 entry: | 51 entry: |
28 %res = insertelement <4 x i32> %vec, i32 %elt, i32 0 | 52 %res = insertelement <4 x i32> %vec, i32 %elt, i32 0 |
29 ret <4 x i32> %res | 53 ret <4 x i32> %res |
30 ; CHECK-LABEL: insertelement_v4i32_0 | 54 ; CHECK-LABEL: insertelement_v4i32_0 |
31 ; CHECK: movd xmm{{.*}}, | 55 ; CHECK: movd xmm{{.*}}, |
32 ; CHECK: movss | 56 ; CHECK: movss |
33 | 57 |
34 ; SSE41-LABEL: insertelement_v4i32_0 | 58 ; SSE41-LABEL: insertelement_v4i32_0 |
35 ; SSE41: pinsrd {{.*}},{{.*}},0x0 | 59 ; SSE41: pinsrd {{.*}},{{.*}},0x0 |
| 60 |
| 61 ; *** a0:a1:a2:a3 - %vec |
| 62 ; *** sp[16] - %elt |
| 63 ; MIPS32-LABEL: insertelement_v4i32_0 |
| 64 ; *** Load %elt |
| 65 ; MIPS32: lw v0,16(sp) |
| 66 ; MIPS32: move v1,a1 |
| 67 ; MIPS32: move a0,a2 |
| 68 ; MIPS32: move a1,a3 |
36 } | 69 } |
37 | 70 |
38 | 71 |
39 define internal <4 x float> @insertelement_v4f32_1(<4 x float> %vec, | 72 define internal <4 x float> @insertelement_v4f32_1(<4 x float> %vec, |
40 float %elt) { | 73 float %elt) { |
41 entry: | 74 entry: |
42 %res = insertelement <4 x float> %vec, float %elt, i32 1 | 75 %res = insertelement <4 x float> %vec, float %elt, i32 1 |
43 ret <4 x float> %res | 76 ret <4 x float> %res |
44 ; CHECK-LABEL: insertelement_v4f32_1 | 77 ; CHECK-LABEL: insertelement_v4f32_1 |
45 ; CHECK: shufps | 78 ; CHECK: shufps |
46 ; CHECK: shufps | 79 ; CHECK: shufps |
47 | 80 |
48 ; SSE41-LABEL: insertelement_v4f32_1 | 81 ; SSE41-LABEL: insertelement_v4f32_1 |
49 ; SSE41: insertps {{.*}},{{.*}},0x10 | 82 ; SSE41: insertps {{.*}},{{.*}},0x10 |
| 83 |
| 84 ; MIPS32-LABEL: insertelement_v4f32_1 |
| 85 ; MIPS32: lw [[VEC_E2:.*]],16(sp) |
| 86 ; MIPS32: lw [[VEC_E3:.*]],20(sp) |
| 87 ; MIPS32: lwc1 [[ELT:.*]],24(sp) |
| 88 ; MIPS32: mfc1 [[R_E1:.*]],[[ELT]] |
| 89 ; MIPS32: move [[PTR:.*]],a0 |
| 90 ; MIPS32: sw a2,0([[PTR]]) |
| 91 ; MIPS32: sw [[R_E1]],4([[PTR]]) |
| 92 ; MIPS32: sw [[VEC_E2]],8([[PTR]]) |
| 93 ; MIPS32: sw [[VEC_E3]],12([[PTR]]) |
50 } | 94 } |
51 | 95 |
52 define internal <4 x i32> @insertelement_v4i32_1(<4 x i32> %vec, i32 %elt) { | 96 define internal <4 x i32> @insertelement_v4i32_1(<4 x i32> %vec, i32 %elt) { |
53 entry: | 97 entry: |
54 %res = insertelement <4 x i32> %vec, i32 %elt, i32 1 | 98 %res = insertelement <4 x i32> %vec, i32 %elt, i32 1 |
55 ret <4 x i32> %res | 99 ret <4 x i32> %res |
56 ; CHECK-LABEL: insertelement_v4i32_1 | 100 ; CHECK-LABEL: insertelement_v4i32_1 |
57 ; CHECK: shufps | 101 ; CHECK: shufps |
58 ; CHECK: shufps | 102 ; CHECK: shufps |
59 | 103 |
60 ; SSE41-LABEL: insertelement_v4i32_1 | 104 ; SSE41-LABEL: insertelement_v4i32_1 |
61 ; SSE41: pinsrd {{.*}},{{.*}},0x1 | 105 ; SSE41: pinsrd {{.*}},{{.*}},0x1 |
| 106 |
| 107 ; MIPS32-LABEL: insertelement_v4i32_1 |
| 108 ; MIPS32: lw [[ELT:.*]],16(sp) |
| 109 ; MIPS32: move v1,[[ELT]] |
| 110 ; MIPS32: move v0,a0 |
| 111 ; MIPS32: move a0,a2 |
| 112 ; MIPS32: move a1,a3 |
62 } | 113 } |
63 | 114 |
64 define internal <8 x i16> @insertelement_v8i16(<8 x i16> %vec, i32 %elt.arg) { | 115 define internal <8 x i16> @insertelement_v8i16(<8 x i16> %vec, i32 %elt.arg) { |
65 entry: | 116 entry: |
66 %elt = trunc i32 %elt.arg to i16 | 117 %elt = trunc i32 %elt.arg to i16 |
67 %res = insertelement <8 x i16> %vec, i16 %elt, i32 1 | 118 %res = insertelement <8 x i16> %vec, i16 %elt, i32 1 |
68 ret <8 x i16> %res | 119 ret <8 x i16> %res |
69 ; CHECK-LABEL: insertelement_v8i16 | 120 ; CHECK-LABEL: insertelement_v8i16 |
70 ; CHECK: pinsrw | 121 ; CHECK: pinsrw |
71 | 122 |
72 ; SSE41-LABEL: insertelement_v8i16 | 123 ; SSE41-LABEL: insertelement_v8i16 |
73 ; SSE41: pinsrw | 124 ; SSE41: pinsrw |
| 125 |
| 126 ; MIPS32-LABEL: insertelement_v8i16 |
| 127 ; MIPS32: lw [[ELT:.*]],16(sp) |
| 128 ; MIPS32: sll [[ELT]],[[ELT]],0x10 |
| 129 ; MIPS32: sll a0,a0,0x10 |
| 130 ; MIPS32: srl a0,a0,0x10 |
| 131 ; MIPS32: or v0,[[ELT]],a0 |
| 132 ; MIPS32: move v1,a1 |
| 133 ; MIPS32: move a0,a2 |
| 134 ; MIPS32: move a1,a3 |
74 } | 135 } |
75 | 136 |
76 define internal <16 x i8> @insertelement_v16i8(<16 x i8> %vec, i32 %elt.arg) { | 137 define internal <16 x i8> @insertelement_v16i8(<16 x i8> %vec, i32 %elt.arg) { |
77 entry: | 138 entry: |
78 %elt = trunc i32 %elt.arg to i8 | 139 %elt = trunc i32 %elt.arg to i8 |
79 %res = insertelement <16 x i8> %vec, i8 %elt, i32 1 | 140 %res = insertelement <16 x i8> %vec, i8 %elt, i32 1 |
80 ret <16 x i8> %res | 141 ret <16 x i8> %res |
81 ; CHECK-LABEL: insertelement_v16i8 | 142 ; CHECK-LABEL: insertelement_v16i8 |
82 ; CHECK: movups | 143 ; CHECK: movups |
83 ; CHECK: lea | 144 ; CHECK: lea |
84 ; CHECK: mov | 145 ; CHECK: mov |
85 | 146 |
86 ; SSE41-LABEL: insertelement_v16i8 | 147 ; SSE41-LABEL: insertelement_v16i8 |
87 ; SSE41: pinsrb | 148 ; SSE41: pinsrb |
| 149 |
| 150 ; MIPS32-LABEL: insertelement_v16i8 |
| 151 ; MIPS32: lw [[ELT:.*]],16(sp) |
| 152 ; MIPS32: andi [[ELT]],[[ELT]],0xff |
| 153 ; MIPS32: sll [[ELT]],[[ELT]],0x8 |
| 154 ; MIPS32: lui [[T:.*]],0xffff |
| 155 ; MIPS32: ori [[T]],[[T]],0xff |
| 156 ; MIPS32: and a0,a0,[[T]] |
| 157 ; MIPS32: or v0,v0,a0 |
| 158 ; MIPS32: move v1,a1 |
| 159 ; MIPS32: move a0,a2 |
| 160 ; MIPS32: move a1,a3 |
88 } | 161 } |
89 | 162 |
90 define internal <4 x i1> @insertelement_v4i1_0(<4 x i1> %vec, i32 %elt.arg) { | 163 define internal <4 x i1> @insertelement_v4i1_0(<4 x i1> %vec, i32 %elt.arg) { |
91 entry: | 164 entry: |
92 %elt = trunc i32 %elt.arg to i1 | 165 %elt = trunc i32 %elt.arg to i1 |
93 %res = insertelement <4 x i1> %vec, i1 %elt, i32 0 | 166 %res = insertelement <4 x i1> %vec, i1 %elt, i32 0 |
94 ret <4 x i1> %res | 167 ret <4 x i1> %res |
95 ; CHECK-LABEL: insertelement_v4i1_0 | 168 ; CHECK-LABEL: insertelement_v4i1_0 |
96 ; CHECK: movss | 169 ; CHECK: movss |
97 | 170 |
98 ; SSE41-LABEL: insertelement_v4i1_0 | 171 ; SSE41-LABEL: insertelement_v4i1_0 |
99 ; SSE41: pinsrd {{.*}},{{.*}},0x0 | 172 ; SSE41: pinsrd {{.*}},{{.*}},0x0 |
| 173 |
| 174 ; MIPS32-LABEL: insertelement_v4i1_0 |
| 175 ; MIPS32: lw v0,16(sp) |
| 176 ; MIPS32: move v1,a1 |
| 177 ; MIPS32: move a0,a2 |
| 178 ; MIPS32: move a1,a3 |
100 } | 179 } |
101 | 180 |
102 define internal <4 x i1> @insertelement_v4i1_1(<4 x i1> %vec, i32 %elt.arg) { | 181 define internal <4 x i1> @insertelement_v4i1_1(<4 x i1> %vec, i32 %elt.arg) { |
103 entry: | 182 entry: |
104 %elt = trunc i32 %elt.arg to i1 | 183 %elt = trunc i32 %elt.arg to i1 |
105 %res = insertelement <4 x i1> %vec, i1 %elt, i32 1 | 184 %res = insertelement <4 x i1> %vec, i1 %elt, i32 1 |
106 ret <4 x i1> %res | 185 ret <4 x i1> %res |
107 ; CHECK-LABEL: insertelement_v4i1_1 | 186 ; CHECK-LABEL: insertelement_v4i1_1 |
108 ; CHECK: shufps | 187 ; CHECK: shufps |
109 ; CHECK: shufps | 188 ; CHECK: shufps |
110 | 189 |
111 ; SSE41-LABEL: insertelement_v4i1_1 | 190 ; SSE41-LABEL: insertelement_v4i1_1 |
112 ; SSE41: pinsrd {{.*}},{{.*}},0x1 | 191 ; SSE41: pinsrd {{.*}},{{.*}},0x1 |
| 192 |
| 193 ; MIPS32-LABEL: insertelement_v4i1_1 |
| 194 ; MIPS32: lw [[ELT:.*]],16(sp) |
| 195 ; MIPS32: move v1,[[ELT]] |
| 196 ; MIPS32: move v0,a0 |
| 197 ; MIPS32: move a0,a2 |
| 198 ; MIPS32: move a1,a3 |
113 } | 199 } |
114 | 200 |
115 define internal <8 x i1> @insertelement_v8i1(<8 x i1> %vec, i32 %elt.arg) { | 201 define internal <8 x i1> @insertelement_v8i1(<8 x i1> %vec, i32 %elt.arg) { |
116 entry: | 202 entry: |
117 %elt = trunc i32 %elt.arg to i1 | 203 %elt = trunc i32 %elt.arg to i1 |
118 %res = insertelement <8 x i1> %vec, i1 %elt, i32 1 | 204 %res = insertelement <8 x i1> %vec, i1 %elt, i32 1 |
119 ret <8 x i1> %res | 205 ret <8 x i1> %res |
120 ; CHECK-LABEL: insertelement_v8i1 | 206 ; CHECK-LABEL: insertelement_v8i1 |
121 ; CHECK: pinsrw | 207 ; CHECK: pinsrw |
122 | 208 |
123 ; SSE41-LABEL: insertelement_v8i1 | 209 ; SSE41-LABEL: insertelement_v8i1 |
124 ; SSE41: pinsrw | 210 ; SSE41: pinsrw |
| 211 |
| 212 ; MIPS32-LABEL: insertelement_v8i1 |
| 213 ; MIPS32: lw [[ELT:.*]],16(sp) |
| 214 ; MIPS32: sll [[ELT]],[[ELT]],0x10 |
| 215 ; MIPS32: sll a0,a0,0x10 |
| 216 ; MIPS32: srl a0,a0,0x10 |
| 217 ; MIPS32: or v0,[[ELT]],a0 |
| 218 ; MIPS32: move v1,a1 |
| 219 ; MIPS32: move a0,a2 |
| 220 ; MIPS32: move a1,a3 |
125 } | 221 } |
126 | 222 |
127 define internal <16 x i1> @insertelement_v16i1(<16 x i1> %vec, i32 %elt.arg) { | 223 define internal <16 x i1> @insertelement_v16i1(<16 x i1> %vec, i32 %elt.arg) { |
128 entry: | 224 entry: |
129 %elt = trunc i32 %elt.arg to i1 | 225 %elt = trunc i32 %elt.arg to i1 |
130 %res = insertelement <16 x i1> %vec, i1 %elt, i32 1 | 226 %res = insertelement <16 x i1> %vec, i1 %elt, i32 1 |
131 ret <16 x i1> %res | 227 ret <16 x i1> %res |
132 ; CHECK-LABEL: insertelement_v16i1 | 228 ; CHECK-LABEL: insertelement_v16i1 |
133 ; CHECK: movups | 229 ; CHECK: movups |
134 ; CHECK: lea | 230 ; CHECK: lea |
135 ; CHECK: mov | 231 ; CHECK: mov |
136 | 232 |
137 ; SSE41-LABEL: insertelement_v16i1 | 233 ; SSE41-LABEL: insertelement_v16i1 |
138 ; SSE41: pinsrb | 234 ; SSE41: pinsrb |
| 235 |
| 236 ; MIPS32-LABEL: insertelement_v16i1 |
| 237 ; MIPS32: lw [[ELT:.*]],16(sp) |
| 238 ; MIPS32: andi [[ELT]],[[ELT]],0xff |
| 239 ; MIPS32: sll [[ELT]],[[ELT]],0x8 |
| 240 ; MIPS32: lui [[T:.*]],0xffff |
| 241 ; MIPS32: ori [[T]],[[T]],0xff |
| 242 ; MIPS32: and a0,a0,[[T]] |
| 243 ; MIPS32: or v0,[[ELT]],a0 |
| 244 ; MIPS32: move v1,a1 |
| 245 ; MIPS32: move a0,a2 |
| 246 ; MIPS32: move a1,a3 |
139 } | 247 } |
140 | 248 |
141 ; extractelement operations | 249 ; extractelement operations |
142 | 250 |
143 define internal float @extractelement_v4f32(<4 x float> %vec) { | 251 define internal float @extractelement_v4f32(<4 x float> %vec) { |
144 entry: | 252 entry: |
145 %res = extractelement <4 x float> %vec, i32 1 | 253 %res = extractelement <4 x float> %vec, i32 1 |
146 ret float %res | 254 ret float %res |
147 ; CHECK-LABEL: extractelement_v4f32 | 255 ; CHECK-LABEL: extractelement_v4f32 |
148 ; CHECK: pshufd | 256 ; CHECK: pshufd |
149 | 257 |
150 ; SSE41-LABEL: extractelement_v4f32 | 258 ; SSE41-LABEL: extractelement_v4f32 |
151 ; SSE41: pshufd | 259 ; SSE41: pshufd |
| 260 |
| 261 ; MIPS32-LABEL: extractelement_v4f32 |
| 262 ; MIPS32: mtc1 a1,$f0 |
152 } | 263 } |
153 | 264 |
154 define internal i32 @extractelement_v4i32(<4 x i32> %vec) { | 265 define internal i32 @extractelement_v4i32(<4 x i32> %vec) { |
155 entry: | 266 entry: |
156 %res = extractelement <4 x i32> %vec, i32 1 | 267 %res = extractelement <4 x i32> %vec, i32 1 |
157 ret i32 %res | 268 ret i32 %res |
158 ; CHECK-LABEL: extractelement_v4i32 | 269 ; CHECK-LABEL: extractelement_v4i32 |
159 ; CHECK: pshufd | 270 ; CHECK: pshufd |
160 ; CHECK: movd {{.*}},xmm | 271 ; CHECK: movd {{.*}},xmm |
161 | 272 |
162 ; SSE41-LABEL: extractelement_v4i32 | 273 ; SSE41-LABEL: extractelement_v4i32 |
163 ; SSE41: pextrd | 274 ; SSE41: pextrd |
| 275 |
| 276 ; MIPS32-LABEL: extractelement_v4i32 |
| 277 ; MIPS32L move v0,a1 |
164 } | 278 } |
165 | 279 |
166 define internal i32 @extractelement_v8i16(<8 x i16> %vec) { | 280 define internal i32 @extractelement_v8i16(<8 x i16> %vec) { |
167 entry: | 281 entry: |
168 %res = extractelement <8 x i16> %vec, i32 1 | 282 %res = extractelement <8 x i16> %vec, i32 1 |
169 %res.ext = zext i16 %res to i32 | 283 %res.ext = zext i16 %res to i32 |
170 ret i32 %res.ext | 284 ret i32 %res.ext |
171 ; CHECK-LABEL: extractelement_v8i16 | 285 ; CHECK-LABEL: extractelement_v8i16 |
172 ; CHECK: pextrw | 286 ; CHECK: pextrw |
173 | 287 |
174 ; SSE41-LABEL: extractelement_v8i16 | 288 ; SSE41-LABEL: extractelement_v8i16 |
175 ; SSE41: pextrw | 289 ; SSE41: pextrw |
| 290 |
| 291 ; MIPS32-LABEL: extractelement_v8i16 |
| 292 ; MIPS32: srl a0,a0,0x10 |
| 293 ; MIPS32: andi a0,a0,0xffff |
| 294 ; MIPS32: move v0,a0 |
176 } | 295 } |
177 | 296 |
178 define internal i32 @extractelement_v16i8(<16 x i8> %vec) { | 297 define internal i32 @extractelement_v16i8(<16 x i8> %vec) { |
179 entry: | 298 entry: |
180 %res = extractelement <16 x i8> %vec, i32 1 | 299 %res = extractelement <16 x i8> %vec, i32 1 |
181 %res.ext = zext i8 %res to i32 | 300 %res.ext = zext i8 %res to i32 |
182 ret i32 %res.ext | 301 ret i32 %res.ext |
183 ; CHECK-LABEL: extractelement_v16i8 | 302 ; CHECK-LABEL: extractelement_v16i8 |
184 ; CHECK: movups | 303 ; CHECK: movups |
185 ; CHECK: lea | 304 ; CHECK: lea |
186 ; CHECK: mov | 305 ; CHECK: mov |
187 | 306 |
188 ; SSE41-LABEL: extractelement_v16i8 | 307 ; SSE41-LABEL: extractelement_v16i8 |
189 ; SSE41: pextrb | 308 ; SSE41: pextrb |
| 309 |
| 310 ; MIPS32-LABEL: extractelement_v16i8 |
| 311 ; MIPS32: srl a0,a0,0x8 |
| 312 ; MIPS32: andi a0,a0,0xff |
| 313 ; MIPS32: andi a0,a0,0xff |
| 314 ; MIPS32: move v0,a0 |
190 } | 315 } |
191 | 316 |
192 define internal i32 @extractelement_v4i1(<4 x i1> %vec) { | 317 define internal i32 @extractelement_v4i1(<4 x i1> %vec) { |
193 entry: | 318 entry: |
194 %res = extractelement <4 x i1> %vec, i32 1 | 319 %res = extractelement <4 x i1> %vec, i32 1 |
195 %res.ext = zext i1 %res to i32 | 320 %res.ext = zext i1 %res to i32 |
196 ret i32 %res.ext | 321 ret i32 %res.ext |
197 ; CHECK-LABEL: extractelement_v4i1 | 322 ; CHECK-LABEL: extractelement_v4i1 |
198 ; CHECK: pshufd | 323 ; CHECK: pshufd |
199 | 324 |
200 ; SSE41-LABEL: extractelement_v4i1 | 325 ; SSE41-LABEL: extractelement_v4i1 |
201 ; SSE41: pextrd | 326 ; SSE41: pextrd |
| 327 |
| 328 ; MIPS32-LABEL: extractelement_v4i1 |
| 329 ; MIPS32: andi a1,a1,0x1 |
| 330 ; MIPS32: andi a1,a1,0x1 |
| 331 ; MIPS32: move v0,a1 |
202 } | 332 } |
203 | 333 |
204 define internal i32 @extractelement_v8i1(<8 x i1> %vec) { | 334 define internal i32 @extractelement_v8i1(<8 x i1> %vec) { |
205 entry: | 335 entry: |
206 %res = extractelement <8 x i1> %vec, i32 1 | 336 %res = extractelement <8 x i1> %vec, i32 1 |
207 %res.ext = zext i1 %res to i32 | 337 %res.ext = zext i1 %res to i32 |
208 ret i32 %res.ext | 338 ret i32 %res.ext |
209 ; CHECK-LABEL: extractelement_v8i1 | 339 ; CHECK-LABEL: extractelement_v8i1 |
210 ; CHECK: pextrw | 340 ; CHECK: pextrw |
211 | 341 |
212 ; SSE41-LABEL: extractelement_v8i1 | 342 ; SSE41-LABEL: extractelement_v8i1 |
213 ; SSE41: pextrw | 343 ; SSE41: pextrw |
| 344 |
| 345 ; MIPS32-LABEL: extractelement_v8i1 |
| 346 ; MIPS32: srl a0,a0,0x10 |
| 347 ; MIPS32: andi a0,a0,0x1 |
| 348 ; MIPS32: andi a0,a0,0x1 |
| 349 ; MIPS32: move v0,a0 |
214 } | 350 } |
215 | 351 |
216 define internal i32 @extractelement_v16i1(<16 x i1> %vec) { | 352 define internal i32 @extractelement_v16i1(<16 x i1> %vec) { |
217 entry: | 353 entry: |
218 %res = extractelement <16 x i1> %vec, i32 1 | 354 %res = extractelement <16 x i1> %vec, i32 1 |
219 %res.ext = zext i1 %res to i32 | 355 %res.ext = zext i1 %res to i32 |
220 ret i32 %res.ext | 356 ret i32 %res.ext |
221 ; CHECK-LABEL: extractelement_v16i1 | 357 ; CHECK-LABEL: extractelement_v16i1 |
222 ; CHECK: movups | 358 ; CHECK: movups |
223 ; CHECK: lea | 359 ; CHECK: lea |
224 ; CHECK: mov | 360 ; CHECK: mov |
225 | 361 |
226 ; SSE41-LABEL: extractelement_v16i1 | 362 ; SSE41-LABEL: extractelement_v16i1 |
227 ; SSE41: pextrb | 363 ; SSE41: pextrb |
| 364 |
| 365 ; MIPS32-LABEL: extractelement_v16i1 |
| 366 ; MIPS32: srl a0,a0,0x8 |
| 367 ; MIPS32: andi a0,a0,0xff |
| 368 ; MIPS32: andi a0,a0,0x1 |
| 369 ; MIPS32: andi a0,a0,0x1 |
| 370 ; MIPS32: move v0,a0 |
228 } | 371 } |
OLD | NEW |