[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / ARM / and-load-combine.ll
blob1bc90ba1b81636a4cbf7313905a8320a211e80b9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=armv7 %s -o - | FileCheck %s --check-prefix=ARM
3 ; RUN: llc -mtriple=armv7eb %s -o - | FileCheck %s --check-prefix=ARMEB
4 ; RUN: llc -mtriple=armv6m %s -o - | FileCheck %s --check-prefix=THUMB1
5 ; RUN: llc -mtriple=thumbv8m.main %s -o - | FileCheck %s --check-prefix=THUMB2
7 define arm_aapcscc zeroext i1 @cmp_xor8_short_short(i16* nocapture readonly %a, i16* nocapture readonly %b) {
8 ; ARM-LABEL: cmp_xor8_short_short:
9 ; ARM:       @ %bb.0: @ %entry
10 ; ARM-NEXT:    ldrb r0, [r0]
11 ; ARM-NEXT:    ldrb r1, [r1]
12 ; ARM-NEXT:    eor r0, r1, r0
13 ; ARM-NEXT:    clz r0, r0
14 ; ARM-NEXT:    lsr r0, r0, #5
15 ; ARM-NEXT:    bx lr
17 ; ARMEB-LABEL: cmp_xor8_short_short:
18 ; ARMEB:       @ %bb.0: @ %entry
19 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
20 ; ARMEB-NEXT:    ldrb r1, [r1, #1]
21 ; ARMEB-NEXT:    eor r0, r1, r0
22 ; ARMEB-NEXT:    clz r0, r0
23 ; ARMEB-NEXT:    lsr r0, r0, #5
24 ; ARMEB-NEXT:    bx lr
26 ; THUMB1-LABEL: cmp_xor8_short_short:
27 ; THUMB1:       @ %bb.0: @ %entry
28 ; THUMB1-NEXT:    ldrb r0, [r0]
29 ; THUMB1-NEXT:    ldrb r1, [r1]
30 ; THUMB1-NEXT:    eors r1, r0
31 ; THUMB1-NEXT:    rsbs r0, r1, #0
32 ; THUMB1-NEXT:    adcs r0, r1
33 ; THUMB1-NEXT:    bx lr
35 ; THUMB2-LABEL: cmp_xor8_short_short:
36 ; THUMB2:       @ %bb.0: @ %entry
37 ; THUMB2-NEXT:    ldrb r0, [r0]
38 ; THUMB2-NEXT:    ldrb r1, [r1]
39 ; THUMB2-NEXT:    eors r0, r1
40 ; THUMB2-NEXT:    clz r0, r0
41 ; THUMB2-NEXT:    lsrs r0, r0, #5
42 ; THUMB2-NEXT:    bx lr
43 entry:
44   %0 = load i16, i16* %a, align 2
45   %1 = load i16, i16* %b, align 2
46   %xor2 = xor i16 %1, %0
47   %2 = and i16 %xor2, 255
48   %cmp = icmp eq i16 %2, 0
49   ret i1 %cmp
52 define arm_aapcscc zeroext i1 @cmp_xor8_short_int(i16* nocapture readonly %a, i32* nocapture readonly %b) {
53 ; ARM-LABEL: cmp_xor8_short_int:
54 ; ARM:       @ %bb.0: @ %entry
55 ; ARM-NEXT:    ldrb r0, [r0]
56 ; ARM-NEXT:    ldrb r1, [r1]
57 ; ARM-NEXT:    eor r0, r1, r0
58 ; ARM-NEXT:    clz r0, r0
59 ; ARM-NEXT:    lsr r0, r0, #5
60 ; ARM-NEXT:    bx lr
62 ; ARMEB-LABEL: cmp_xor8_short_int:
63 ; ARMEB:       @ %bb.0: @ %entry
64 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
65 ; ARMEB-NEXT:    ldrb r1, [r1, #3]
66 ; ARMEB-NEXT:    eor r0, r1, r0
67 ; ARMEB-NEXT:    clz r0, r0
68 ; ARMEB-NEXT:    lsr r0, r0, #5
69 ; ARMEB-NEXT:    bx lr
71 ; THUMB1-LABEL: cmp_xor8_short_int:
72 ; THUMB1:       @ %bb.0: @ %entry
73 ; THUMB1-NEXT:    ldrb r0, [r0]
74 ; THUMB1-NEXT:    ldrb r1, [r1]
75 ; THUMB1-NEXT:    eors r1, r0
76 ; THUMB1-NEXT:    rsbs r0, r1, #0
77 ; THUMB1-NEXT:    adcs r0, r1
78 ; THUMB1-NEXT:    bx lr
80 ; THUMB2-LABEL: cmp_xor8_short_int:
81 ; THUMB2:       @ %bb.0: @ %entry
82 ; THUMB2-NEXT:    ldrb r0, [r0]
83 ; THUMB2-NEXT:    ldrb r1, [r1]
84 ; THUMB2-NEXT:    eors r0, r1
85 ; THUMB2-NEXT:    clz r0, r0
86 ; THUMB2-NEXT:    lsrs r0, r0, #5
87 ; THUMB2-NEXT:    bx lr
88 entry:
89   %0 = load i16, i16* %a, align 2
90   %conv = zext i16 %0 to i32
91   %1 = load i32, i32* %b, align 4
92   %xor = xor i32 %1, %conv
93   %and = and i32 %xor, 255
94   %cmp = icmp eq i32 %and, 0
95   ret i1 %cmp
98 define arm_aapcscc zeroext i1 @cmp_xor8_int_int(i32* nocapture readonly %a, i32* nocapture readonly %b) {
99 ; ARM-LABEL: cmp_xor8_int_int:
100 ; ARM:       @ %bb.0: @ %entry
101 ; ARM-NEXT:    ldrb r0, [r0]
102 ; ARM-NEXT:    ldrb r1, [r1]
103 ; ARM-NEXT:    eor r0, r1, r0
104 ; ARM-NEXT:    clz r0, r0
105 ; ARM-NEXT:    lsr r0, r0, #5
106 ; ARM-NEXT:    bx lr
108 ; ARMEB-LABEL: cmp_xor8_int_int:
109 ; ARMEB:       @ %bb.0: @ %entry
110 ; ARMEB-NEXT:    ldrb r0, [r0, #3]
111 ; ARMEB-NEXT:    ldrb r1, [r1, #3]
112 ; ARMEB-NEXT:    eor r0, r1, r0
113 ; ARMEB-NEXT:    clz r0, r0
114 ; ARMEB-NEXT:    lsr r0, r0, #5
115 ; ARMEB-NEXT:    bx lr
117 ; THUMB1-LABEL: cmp_xor8_int_int:
118 ; THUMB1:       @ %bb.0: @ %entry
119 ; THUMB1-NEXT:    ldrb r0, [r0]
120 ; THUMB1-NEXT:    ldrb r1, [r1]
121 ; THUMB1-NEXT:    eors r1, r0
122 ; THUMB1-NEXT:    rsbs r0, r1, #0
123 ; THUMB1-NEXT:    adcs r0, r1
124 ; THUMB1-NEXT:    bx lr
126 ; THUMB2-LABEL: cmp_xor8_int_int:
127 ; THUMB2:       @ %bb.0: @ %entry
128 ; THUMB2-NEXT:    ldrb r0, [r0]
129 ; THUMB2-NEXT:    ldrb r1, [r1]
130 ; THUMB2-NEXT:    eors r0, r1
131 ; THUMB2-NEXT:    clz r0, r0
132 ; THUMB2-NEXT:    lsrs r0, r0, #5
133 ; THUMB2-NEXT:    bx lr
134 entry:
135   %0 = load i32, i32* %a, align 4
136   %1 = load i32, i32* %b, align 4
137   %xor = xor i32 %1, %0
138   %and = and i32 %xor, 255
139   %cmp = icmp eq i32 %and, 0
140   ret i1 %cmp
143 define arm_aapcscc zeroext i1 @cmp_xor16(i32* nocapture readonly %a, i32* nocapture readonly %b) {
144 ; ARM-LABEL: cmp_xor16:
145 ; ARM:       @ %bb.0: @ %entry
146 ; ARM-NEXT:    ldrh r0, [r0]
147 ; ARM-NEXT:    ldrh r1, [r1]
148 ; ARM-NEXT:    eor r0, r1, r0
149 ; ARM-NEXT:    clz r0, r0
150 ; ARM-NEXT:    lsr r0, r0, #5
151 ; ARM-NEXT:    bx lr
153 ; ARMEB-LABEL: cmp_xor16:
154 ; ARMEB:       @ %bb.0: @ %entry
155 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
156 ; ARMEB-NEXT:    ldrh r1, [r1, #2]
157 ; ARMEB-NEXT:    eor r0, r1, r0
158 ; ARMEB-NEXT:    clz r0, r0
159 ; ARMEB-NEXT:    lsr r0, r0, #5
160 ; ARMEB-NEXT:    bx lr
162 ; THUMB1-LABEL: cmp_xor16:
163 ; THUMB1:       @ %bb.0: @ %entry
164 ; THUMB1-NEXT:    ldrh r0, [r0]
165 ; THUMB1-NEXT:    ldrh r1, [r1]
166 ; THUMB1-NEXT:    eors r1, r0
167 ; THUMB1-NEXT:    rsbs r0, r1, #0
168 ; THUMB1-NEXT:    adcs r0, r1
169 ; THUMB1-NEXT:    bx lr
171 ; THUMB2-LABEL: cmp_xor16:
172 ; THUMB2:       @ %bb.0: @ %entry
173 ; THUMB2-NEXT:    ldrh r0, [r0]
174 ; THUMB2-NEXT:    ldrh r1, [r1]
175 ; THUMB2-NEXT:    eors r0, r1
176 ; THUMB2-NEXT:    clz r0, r0
177 ; THUMB2-NEXT:    lsrs r0, r0, #5
178 ; THUMB2-NEXT:    bx lr
179 entry:
180   %0 = load i32, i32* %a, align 4
181   %1 = load i32, i32* %b, align 4
182   %xor = xor i32 %1, %0
183   %and = and i32 %xor, 65535
184   %cmp = icmp eq i32 %and, 0
185   ret i1 %cmp
188 define arm_aapcscc zeroext i1 @cmp_or8_short_short(i16* nocapture readonly %a, i16* nocapture readonly %b) {
189 ; ARM-LABEL: cmp_or8_short_short:
190 ; ARM:       @ %bb.0: @ %entry
191 ; ARM-NEXT:    ldrb r0, [r0]
192 ; ARM-NEXT:    ldrb r1, [r1]
193 ; ARM-NEXT:    orr r0, r1, r0
194 ; ARM-NEXT:    clz r0, r0
195 ; ARM-NEXT:    lsr r0, r0, #5
196 ; ARM-NEXT:    bx lr
198 ; ARMEB-LABEL: cmp_or8_short_short:
199 ; ARMEB:       @ %bb.0: @ %entry
200 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
201 ; ARMEB-NEXT:    ldrb r1, [r1, #1]
202 ; ARMEB-NEXT:    orr r0, r1, r0
203 ; ARMEB-NEXT:    clz r0, r0
204 ; ARMEB-NEXT:    lsr r0, r0, #5
205 ; ARMEB-NEXT:    bx lr
207 ; THUMB1-LABEL: cmp_or8_short_short:
208 ; THUMB1:       @ %bb.0: @ %entry
209 ; THUMB1-NEXT:    ldrb r0, [r0]
210 ; THUMB1-NEXT:    ldrb r1, [r1]
211 ; THUMB1-NEXT:    orrs r1, r0
212 ; THUMB1-NEXT:    rsbs r0, r1, #0
213 ; THUMB1-NEXT:    adcs r0, r1
214 ; THUMB1-NEXT:    bx lr
216 ; THUMB2-LABEL: cmp_or8_short_short:
217 ; THUMB2:       @ %bb.0: @ %entry
218 ; THUMB2-NEXT:    ldrb r0, [r0]
219 ; THUMB2-NEXT:    ldrb r1, [r1]
220 ; THUMB2-NEXT:    orrs r0, r1
221 ; THUMB2-NEXT:    clz r0, r0
222 ; THUMB2-NEXT:    lsrs r0, r0, #5
223 ; THUMB2-NEXT:    bx lr
224 entry:
225   %0 = load i16, i16* %a, align 2
226   %1 = load i16, i16* %b, align 2
227   %or2 = or i16 %1, %0
228   %2 = and i16 %or2, 255
229   %cmp = icmp eq i16 %2, 0
230   ret i1 %cmp
233 define arm_aapcscc zeroext i1 @cmp_or8_short_int(i16* nocapture readonly %a, i32* nocapture readonly %b) {
234 ; ARM-LABEL: cmp_or8_short_int:
235 ; ARM:       @ %bb.0: @ %entry
236 ; ARM-NEXT:    ldrb r0, [r0]
237 ; ARM-NEXT:    ldrb r1, [r1]
238 ; ARM-NEXT:    orr r0, r1, r0
239 ; ARM-NEXT:    clz r0, r0
240 ; ARM-NEXT:    lsr r0, r0, #5
241 ; ARM-NEXT:    bx lr
243 ; ARMEB-LABEL: cmp_or8_short_int:
244 ; ARMEB:       @ %bb.0: @ %entry
245 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
246 ; ARMEB-NEXT:    ldrb r1, [r1, #3]
247 ; ARMEB-NEXT:    orr r0, r1, r0
248 ; ARMEB-NEXT:    clz r0, r0
249 ; ARMEB-NEXT:    lsr r0, r0, #5
250 ; ARMEB-NEXT:    bx lr
252 ; THUMB1-LABEL: cmp_or8_short_int:
253 ; THUMB1:       @ %bb.0: @ %entry
254 ; THUMB1-NEXT:    ldrb r0, [r0]
255 ; THUMB1-NEXT:    ldrb r1, [r1]
256 ; THUMB1-NEXT:    orrs r1, r0
257 ; THUMB1-NEXT:    rsbs r0, r1, #0
258 ; THUMB1-NEXT:    adcs r0, r1
259 ; THUMB1-NEXT:    bx lr
261 ; THUMB2-LABEL: cmp_or8_short_int:
262 ; THUMB2:       @ %bb.0: @ %entry
263 ; THUMB2-NEXT:    ldrb r0, [r0]
264 ; THUMB2-NEXT:    ldrb r1, [r1]
265 ; THUMB2-NEXT:    orrs r0, r1
266 ; THUMB2-NEXT:    clz r0, r0
267 ; THUMB2-NEXT:    lsrs r0, r0, #5
268 ; THUMB2-NEXT:    bx lr
269 entry:
270   %0 = load i16, i16* %a, align 2
271   %conv = zext i16 %0 to i32
272   %1 = load i32, i32* %b, align 4
273   %or = or i32 %1, %conv
274   %and = and i32 %or, 255
275   %cmp = icmp eq i32 %and, 0
276   ret i1 %cmp
279 define arm_aapcscc zeroext i1 @cmp_or8_int_int(i32* nocapture readonly %a, i32* nocapture readonly %b) {
280 ; ARM-LABEL: cmp_or8_int_int:
281 ; ARM:       @ %bb.0: @ %entry
282 ; ARM-NEXT:    ldrb r0, [r0]
283 ; ARM-NEXT:    ldrb r1, [r1]
284 ; ARM-NEXT:    orr r0, r1, r0
285 ; ARM-NEXT:    clz r0, r0
286 ; ARM-NEXT:    lsr r0, r0, #5
287 ; ARM-NEXT:    bx lr
289 ; ARMEB-LABEL: cmp_or8_int_int:
290 ; ARMEB:       @ %bb.0: @ %entry
291 ; ARMEB-NEXT:    ldrb r0, [r0, #3]
292 ; ARMEB-NEXT:    ldrb r1, [r1, #3]
293 ; ARMEB-NEXT:    orr r0, r1, r0
294 ; ARMEB-NEXT:    clz r0, r0
295 ; ARMEB-NEXT:    lsr r0, r0, #5
296 ; ARMEB-NEXT:    bx lr
298 ; THUMB1-LABEL: cmp_or8_int_int:
299 ; THUMB1:       @ %bb.0: @ %entry
300 ; THUMB1-NEXT:    ldrb r0, [r0]
301 ; THUMB1-NEXT:    ldrb r1, [r1]
302 ; THUMB1-NEXT:    orrs r1, r0
303 ; THUMB1-NEXT:    rsbs r0, r1, #0
304 ; THUMB1-NEXT:    adcs r0, r1
305 ; THUMB1-NEXT:    bx lr
307 ; THUMB2-LABEL: cmp_or8_int_int:
308 ; THUMB2:       @ %bb.0: @ %entry
309 ; THUMB2-NEXT:    ldrb r0, [r0]
310 ; THUMB2-NEXT:    ldrb r1, [r1]
311 ; THUMB2-NEXT:    orrs r0, r1
312 ; THUMB2-NEXT:    clz r0, r0
313 ; THUMB2-NEXT:    lsrs r0, r0, #5
314 ; THUMB2-NEXT:    bx lr
315 entry:
316   %0 = load i32, i32* %a, align 4
317   %1 = load i32, i32* %b, align 4
318   %or = or i32 %1, %0
319   %and = and i32 %or, 255
320   %cmp = icmp eq i32 %and, 0
321   ret i1 %cmp
324 define arm_aapcscc zeroext i1 @cmp_or16(i32* nocapture readonly %a, i32* nocapture readonly %b) {
325 ; ARM-LABEL: cmp_or16:
326 ; ARM:       @ %bb.0: @ %entry
327 ; ARM-NEXT:    ldrh r0, [r0]
328 ; ARM-NEXT:    ldrh r1, [r1]
329 ; ARM-NEXT:    orr r0, r1, r0
330 ; ARM-NEXT:    clz r0, r0
331 ; ARM-NEXT:    lsr r0, r0, #5
332 ; ARM-NEXT:    bx lr
334 ; ARMEB-LABEL: cmp_or16:
335 ; ARMEB:       @ %bb.0: @ %entry
336 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
337 ; ARMEB-NEXT:    ldrh r1, [r1, #2]
338 ; ARMEB-NEXT:    orr r0, r1, r0
339 ; ARMEB-NEXT:    clz r0, r0
340 ; ARMEB-NEXT:    lsr r0, r0, #5
341 ; ARMEB-NEXT:    bx lr
343 ; THUMB1-LABEL: cmp_or16:
344 ; THUMB1:       @ %bb.0: @ %entry
345 ; THUMB1-NEXT:    ldrh r0, [r0]
346 ; THUMB1-NEXT:    ldrh r1, [r1]
347 ; THUMB1-NEXT:    orrs r1, r0
348 ; THUMB1-NEXT:    rsbs r0, r1, #0
349 ; THUMB1-NEXT:    adcs r0, r1
350 ; THUMB1-NEXT:    bx lr
352 ; THUMB2-LABEL: cmp_or16:
353 ; THUMB2:       @ %bb.0: @ %entry
354 ; THUMB2-NEXT:    ldrh r0, [r0]
355 ; THUMB2-NEXT:    ldrh r1, [r1]
356 ; THUMB2-NEXT:    orrs r0, r1
357 ; THUMB2-NEXT:    clz r0, r0
358 ; THUMB2-NEXT:    lsrs r0, r0, #5
359 ; THUMB2-NEXT:    bx lr
360 entry:
361   %0 = load i32, i32* %a, align 4
362   %1 = load i32, i32* %b, align 4
363   %or = or i32 %1, %0
364   %and = and i32 %or, 65535
365   %cmp = icmp eq i32 %and, 0
366   ret i1 %cmp
369 define arm_aapcscc zeroext i1 @cmp_and8_short_short(i16* nocapture readonly %a, i16* nocapture readonly %b) {
370 ; ARM-LABEL: cmp_and8_short_short:
371 ; ARM:       @ %bb.0: @ %entry
372 ; ARM-NEXT:    ldrb r1, [r1]
373 ; ARM-NEXT:    ldrb r0, [r0]
374 ; ARM-NEXT:    and r0, r0, r1
375 ; ARM-NEXT:    clz r0, r0
376 ; ARM-NEXT:    lsr r0, r0, #5
377 ; ARM-NEXT:    bx lr
379 ; ARMEB-LABEL: cmp_and8_short_short:
380 ; ARMEB:       @ %bb.0: @ %entry
381 ; ARMEB-NEXT:    ldrb r1, [r1, #1]
382 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
383 ; ARMEB-NEXT:    and r0, r0, r1
384 ; ARMEB-NEXT:    clz r0, r0
385 ; ARMEB-NEXT:    lsr r0, r0, #5
386 ; ARMEB-NEXT:    bx lr
388 ; THUMB1-LABEL: cmp_and8_short_short:
389 ; THUMB1:       @ %bb.0: @ %entry
390 ; THUMB1-NEXT:    ldrb r1, [r1]
391 ; THUMB1-NEXT:    ldrb r2, [r0]
392 ; THUMB1-NEXT:    ands r2, r1
393 ; THUMB1-NEXT:    rsbs r0, r2, #0
394 ; THUMB1-NEXT:    adcs r0, r2
395 ; THUMB1-NEXT:    bx lr
397 ; THUMB2-LABEL: cmp_and8_short_short:
398 ; THUMB2:       @ %bb.0: @ %entry
399 ; THUMB2-NEXT:    ldrb r1, [r1]
400 ; THUMB2-NEXT:    ldrb r0, [r0]
401 ; THUMB2-NEXT:    ands r0, r1
402 ; THUMB2-NEXT:    clz r0, r0
403 ; THUMB2-NEXT:    lsrs r0, r0, #5
404 ; THUMB2-NEXT:    bx lr
405 entry:
406   %0 = load i16, i16* %a, align 2
407   %1 = load i16, i16* %b, align 2
408   %and3 = and i16 %0, 255
409   %2 = and i16 %and3, %1
410   %cmp = icmp eq i16 %2, 0
411   ret i1 %cmp
414 define arm_aapcscc zeroext i1 @cmp_and8_short_int(i16* nocapture readonly %a, i32* nocapture readonly %b) {
415 ; ARM-LABEL: cmp_and8_short_int:
416 ; ARM:       @ %bb.0: @ %entry
417 ; ARM-NEXT:    ldrb r1, [r1]
418 ; ARM-NEXT:    ldrb r0, [r0]
419 ; ARM-NEXT:    and r0, r0, r1
420 ; ARM-NEXT:    clz r0, r0
421 ; ARM-NEXT:    lsr r0, r0, #5
422 ; ARM-NEXT:    bx lr
424 ; ARMEB-LABEL: cmp_and8_short_int:
425 ; ARMEB:       @ %bb.0: @ %entry
426 ; ARMEB-NEXT:    ldrb r1, [r1, #3]
427 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
428 ; ARMEB-NEXT:    and r0, r0, r1
429 ; ARMEB-NEXT:    clz r0, r0
430 ; ARMEB-NEXT:    lsr r0, r0, #5
431 ; ARMEB-NEXT:    bx lr
433 ; THUMB1-LABEL: cmp_and8_short_int:
434 ; THUMB1:       @ %bb.0: @ %entry
435 ; THUMB1-NEXT:    ldrb r1, [r1]
436 ; THUMB1-NEXT:    ldrb r2, [r0]
437 ; THUMB1-NEXT:    ands r2, r1
438 ; THUMB1-NEXT:    rsbs r0, r2, #0
439 ; THUMB1-NEXT:    adcs r0, r2
440 ; THUMB1-NEXT:    bx lr
442 ; THUMB2-LABEL: cmp_and8_short_int:
443 ; THUMB2:       @ %bb.0: @ %entry
444 ; THUMB2-NEXT:    ldrb r1, [r1]
445 ; THUMB2-NEXT:    ldrb r0, [r0]
446 ; THUMB2-NEXT:    ands r0, r1
447 ; THUMB2-NEXT:    clz r0, r0
448 ; THUMB2-NEXT:    lsrs r0, r0, #5
449 ; THUMB2-NEXT:    bx lr
450 entry:
451   %0 = load i16, i16* %a, align 2
452   %1 = load i32, i32* %b, align 4
453   %2 = and i16 %0, 255
454   %and = zext i16 %2 to i32
455   %and1 = and i32 %1, %and
456   %cmp = icmp eq i32 %and1, 0
457   ret i1 %cmp
460 define arm_aapcscc zeroext i1 @cmp_and8_int_int(i32* nocapture readonly %a, i32* nocapture readonly %b) {
461 ; ARM-LABEL: cmp_and8_int_int:
462 ; ARM:       @ %bb.0: @ %entry
463 ; ARM-NEXT:    ldrb r1, [r1]
464 ; ARM-NEXT:    ldrb r0, [r0]
465 ; ARM-NEXT:    and r0, r0, r1
466 ; ARM-NEXT:    clz r0, r0
467 ; ARM-NEXT:    lsr r0, r0, #5
468 ; ARM-NEXT:    bx lr
470 ; ARMEB-LABEL: cmp_and8_int_int:
471 ; ARMEB:       @ %bb.0: @ %entry
472 ; ARMEB-NEXT:    ldrb r1, [r1, #3]
473 ; ARMEB-NEXT:    ldrb r0, [r0, #3]
474 ; ARMEB-NEXT:    and r0, r0, r1
475 ; ARMEB-NEXT:    clz r0, r0
476 ; ARMEB-NEXT:    lsr r0, r0, #5
477 ; ARMEB-NEXT:    bx lr
479 ; THUMB1-LABEL: cmp_and8_int_int:
480 ; THUMB1:       @ %bb.0: @ %entry
481 ; THUMB1-NEXT:    ldrb r1, [r1]
482 ; THUMB1-NEXT:    ldrb r2, [r0]
483 ; THUMB1-NEXT:    ands r2, r1
484 ; THUMB1-NEXT:    rsbs r0, r2, #0
485 ; THUMB1-NEXT:    adcs r0, r2
486 ; THUMB1-NEXT:    bx lr
488 ; THUMB2-LABEL: cmp_and8_int_int:
489 ; THUMB2:       @ %bb.0: @ %entry
490 ; THUMB2-NEXT:    ldrb r1, [r1]
491 ; THUMB2-NEXT:    ldrb r0, [r0]
492 ; THUMB2-NEXT:    ands r0, r1
493 ; THUMB2-NEXT:    clz r0, r0
494 ; THUMB2-NEXT:    lsrs r0, r0, #5
495 ; THUMB2-NEXT:    bx lr
496 entry:
497   %0 = load i32, i32* %a, align 4
498   %1 = load i32, i32* %b, align 4
499   %and = and i32 %0, 255
500   %and1 = and i32 %and, %1
501   %cmp = icmp eq i32 %and1, 0
502   ret i1 %cmp
505 define arm_aapcscc zeroext i1 @cmp_and16(i32* nocapture readonly %a, i32* nocapture readonly %b) {
506 ; ARM-LABEL: cmp_and16:
507 ; ARM:       @ %bb.0: @ %entry
508 ; ARM-NEXT:    ldrh r1, [r1]
509 ; ARM-NEXT:    ldrh r0, [r0]
510 ; ARM-NEXT:    and r0, r0, r1
511 ; ARM-NEXT:    clz r0, r0
512 ; ARM-NEXT:    lsr r0, r0, #5
513 ; ARM-NEXT:    bx lr
515 ; ARMEB-LABEL: cmp_and16:
516 ; ARMEB:       @ %bb.0: @ %entry
517 ; ARMEB-NEXT:    ldrh r1, [r1, #2]
518 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
519 ; ARMEB-NEXT:    and r0, r0, r1
520 ; ARMEB-NEXT:    clz r0, r0
521 ; ARMEB-NEXT:    lsr r0, r0, #5
522 ; ARMEB-NEXT:    bx lr
524 ; THUMB1-LABEL: cmp_and16:
525 ; THUMB1:       @ %bb.0: @ %entry
526 ; THUMB1-NEXT:    ldrh r1, [r1]
527 ; THUMB1-NEXT:    ldrh r2, [r0]
528 ; THUMB1-NEXT:    ands r2, r1
529 ; THUMB1-NEXT:    rsbs r0, r2, #0
530 ; THUMB1-NEXT:    adcs r0, r2
531 ; THUMB1-NEXT:    bx lr
533 ; THUMB2-LABEL: cmp_and16:
534 ; THUMB2:       @ %bb.0: @ %entry
535 ; THUMB2-NEXT:    ldrh r1, [r1]
536 ; THUMB2-NEXT:    ldrh r0, [r0]
537 ; THUMB2-NEXT:    ands r0, r1
538 ; THUMB2-NEXT:    clz r0, r0
539 ; THUMB2-NEXT:    lsrs r0, r0, #5
540 ; THUMB2-NEXT:    bx lr
541 entry:
542   %0 = load i32, i32* %a, align 4
543   %1 = load i32, i32* %b, align 4
544   %and = and i32 %0, 65535
545   %and1 = and i32 %and, %1
546   %cmp = icmp eq i32 %and1, 0
547   ret i1 %cmp
550 define arm_aapcscc i32 @add_and16(i32* nocapture readonly %a, i32 %y, i32 %z) {
551 ; ARM-LABEL: add_and16:
552 ; ARM:       @ %bb.0: @ %entry
553 ; ARM-NEXT:    add r1, r1, r2
554 ; ARM-NEXT:    ldrh r0, [r0]
555 ; ARM-NEXT:    uxth r1, r1
556 ; ARM-NEXT:    orr r0, r0, r1
557 ; ARM-NEXT:    bx lr
559 ; ARMEB-LABEL: add_and16:
560 ; ARMEB:       @ %bb.0: @ %entry
561 ; ARMEB-NEXT:    add r1, r1, r2
562 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
563 ; ARMEB-NEXT:    uxth r1, r1
564 ; ARMEB-NEXT:    orr r0, r0, r1
565 ; ARMEB-NEXT:    bx lr
567 ; THUMB1-LABEL: add_and16:
568 ; THUMB1:       @ %bb.0: @ %entry
569 ; THUMB1-NEXT:    adds r1, r1, r2
570 ; THUMB1-NEXT:    uxth r1, r1
571 ; THUMB1-NEXT:    ldrh r0, [r0]
572 ; THUMB1-NEXT:    orrs r0, r1
573 ; THUMB1-NEXT:    bx lr
575 ; THUMB2-LABEL: add_and16:
576 ; THUMB2:       @ %bb.0: @ %entry
577 ; THUMB2-NEXT:    add r1, r2
578 ; THUMB2-NEXT:    ldrh r0, [r0]
579 ; THUMB2-NEXT:    uxth r1, r1
580 ; THUMB2-NEXT:    orrs r0, r1
581 ; THUMB2-NEXT:    bx lr
582 entry:
583   %x = load i32, i32* %a, align 4
584   %add = add i32 %y, %z
585   %or = or i32 %x, %add
586   %and = and i32 %or, 65535
587   ret i32 %and
590 define arm_aapcscc i32 @test1(i32* %a, i32* %b, i32 %x, i32 %y) {
591 ; ARM-LABEL: test1:
592 ; ARM:       @ %bb.0: @ %entry
593 ; ARM-NEXT:    mul r2, r2, r3
594 ; ARM-NEXT:    ldrh r1, [r1]
595 ; ARM-NEXT:    ldrh r0, [r0]
596 ; ARM-NEXT:    eor r0, r0, r1
597 ; ARM-NEXT:    uxth r1, r2
598 ; ARM-NEXT:    orr r0, r0, r1
599 ; ARM-NEXT:    bx lr
601 ; ARMEB-LABEL: test1:
602 ; ARMEB:       @ %bb.0: @ %entry
603 ; ARMEB-NEXT:    mul r2, r2, r3
604 ; ARMEB-NEXT:    ldrh r1, [r1, #2]
605 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
606 ; ARMEB-NEXT:    eor r0, r0, r1
607 ; ARMEB-NEXT:    uxth r1, r2
608 ; ARMEB-NEXT:    orr r0, r0, r1
609 ; ARMEB-NEXT:    bx lr
611 ; THUMB1-LABEL: test1:
612 ; THUMB1:       @ %bb.0: @ %entry
613 ; THUMB1-NEXT:    push {r4, lr}
614 ; THUMB1-NEXT:    ldrh r1, [r1]
615 ; THUMB1-NEXT:    ldrh r4, [r0]
616 ; THUMB1-NEXT:    eors r4, r1
617 ; THUMB1-NEXT:    muls r2, r3, r2
618 ; THUMB1-NEXT:    uxth r0, r2
619 ; THUMB1-NEXT:    orrs r0, r4
620 ; THUMB1-NEXT:    pop {r4, pc}
622 ; THUMB2-LABEL: test1:
623 ; THUMB2:       @ %bb.0: @ %entry
624 ; THUMB2-NEXT:    ldrh r1, [r1]
625 ; THUMB2-NEXT:    ldrh r0, [r0]
626 ; THUMB2-NEXT:    eors r0, r1
627 ; THUMB2-NEXT:    mul r1, r2, r3
628 ; THUMB2-NEXT:    uxth r1, r1
629 ; THUMB2-NEXT:    orrs r0, r1
630 ; THUMB2-NEXT:    bx lr
631 entry:
632   %0 = load i32, i32* %a, align 4
633   %1 = load i32, i32* %b, align 4
634   %mul = mul i32 %x, %y
635   %xor = xor i32 %0, %1
636   %or = or i32 %xor, %mul
637   %and = and i32 %or, 65535
638   ret i32 %and
641 define arm_aapcscc i32 @test2(i32* %a, i32* %b, i32 %x, i32 %y) {
642 ; ARM-LABEL: test2:
643 ; ARM:       @ %bb.0: @ %entry
644 ; ARM-NEXT:    ldr r1, [r1]
645 ; ARM-NEXT:    ldr r0, [r0]
646 ; ARM-NEXT:    mul r1, r2, r1
647 ; ARM-NEXT:    eor r0, r0, r3
648 ; ARM-NEXT:    orr r0, r0, r1
649 ; ARM-NEXT:    uxth r0, r0
650 ; ARM-NEXT:    bx lr
652 ; ARMEB-LABEL: test2:
653 ; ARMEB:       @ %bb.0: @ %entry
654 ; ARMEB-NEXT:    ldr r1, [r1]
655 ; ARMEB-NEXT:    ldr r0, [r0]
656 ; ARMEB-NEXT:    mul r1, r2, r1
657 ; ARMEB-NEXT:    eor r0, r0, r3
658 ; ARMEB-NEXT:    orr r0, r0, r1
659 ; ARMEB-NEXT:    uxth r0, r0
660 ; ARMEB-NEXT:    bx lr
662 ; THUMB1-LABEL: test2:
663 ; THUMB1:       @ %bb.0: @ %entry
664 ; THUMB1-NEXT:    ldr r1, [r1]
665 ; THUMB1-NEXT:    muls r1, r2, r1
666 ; THUMB1-NEXT:    ldr r0, [r0]
667 ; THUMB1-NEXT:    eors r0, r3
668 ; THUMB1-NEXT:    orrs r0, r1
669 ; THUMB1-NEXT:    uxth r0, r0
670 ; THUMB1-NEXT:    bx lr
672 ; THUMB2-LABEL: test2:
673 ; THUMB2:       @ %bb.0: @ %entry
674 ; THUMB2-NEXT:    ldr r1, [r1]
675 ; THUMB2-NEXT:    ldr r0, [r0]
676 ; THUMB2-NEXT:    muls r1, r2, r1
677 ; THUMB2-NEXT:    eors r0, r3
678 ; THUMB2-NEXT:    orrs r0, r1
679 ; THUMB2-NEXT:    uxth r0, r0
680 ; THUMB2-NEXT:    bx lr
681 entry:
682   %0 = load i32, i32* %a, align 4
683   %1 = load i32, i32* %b, align 4
684   %mul = mul i32 %x, %1
685   %xor = xor i32 %0, %y
686   %or = or i32 %xor, %mul
687   %and = and i32 %or, 65535
688   ret i32 %and
691 define arm_aapcscc i32 @test3(i32* %a, i32* %b, i32 %x, i16* %y) {
692 ; ARM-LABEL: test3:
693 ; ARM:       @ %bb.0: @ %entry
694 ; ARM-NEXT:    ldr r0, [r0]
695 ; ARM-NEXT:    mul r1, r2, r0
696 ; ARM-NEXT:    ldrh r2, [r3]
697 ; ARM-NEXT:    eor r0, r0, r2
698 ; ARM-NEXT:    orr r0, r0, r1
699 ; ARM-NEXT:    uxth r0, r0
700 ; ARM-NEXT:    bx lr
702 ; ARMEB-LABEL: test3:
703 ; ARMEB:       @ %bb.0: @ %entry
704 ; ARMEB-NEXT:    ldr r0, [r0]
705 ; ARMEB-NEXT:    mul r1, r2, r0
706 ; ARMEB-NEXT:    ldrh r2, [r3]
707 ; ARMEB-NEXT:    eor r0, r0, r2
708 ; ARMEB-NEXT:    orr r0, r0, r1
709 ; ARMEB-NEXT:    uxth r0, r0
710 ; ARMEB-NEXT:    bx lr
712 ; THUMB1-LABEL: test3:
713 ; THUMB1:       @ %bb.0: @ %entry
714 ; THUMB1-NEXT:    ldr r0, [r0]
715 ; THUMB1-NEXT:    muls r2, r0, r2
716 ; THUMB1-NEXT:    ldrh r1, [r3]
717 ; THUMB1-NEXT:    eors r1, r0
718 ; THUMB1-NEXT:    orrs r1, r2
719 ; THUMB1-NEXT:    uxth r0, r1
720 ; THUMB1-NEXT:    bx lr
722 ; THUMB2-LABEL: test3:
723 ; THUMB2:       @ %bb.0: @ %entry
724 ; THUMB2-NEXT:    ldr r0, [r0]
725 ; THUMB2-NEXT:    mul r1, r2, r0
726 ; THUMB2-NEXT:    ldrh r2, [r3]
727 ; THUMB2-NEXT:    eors r0, r2
728 ; THUMB2-NEXT:    orrs r0, r1
729 ; THUMB2-NEXT:    uxth r0, r0
730 ; THUMB2-NEXT:    bx lr
731 entry:
732   %0 = load i32, i32* %a, align 4
733   %1 = load i16, i16* %y, align 4
734   %2 = zext i16 %1 to i32
735   %mul = mul i32 %x, %0
736   %xor = xor i32 %0, %2
737   %or = or i32 %xor, %mul
738   %and = and i32 %or, 65535
739   ret i32 %and
742 define arm_aapcscc i32 @test4(i32* %a, i32* %b, i32 %x, i32 %y) {
743 ; ARM-LABEL: test4:
744 ; ARM:       @ %bb.0: @ %entry
745 ; ARM-NEXT:    mul r2, r2, r3
746 ; ARM-NEXT:    ldrh r1, [r1]
747 ; ARM-NEXT:    ldrh r0, [r0]
748 ; ARM-NEXT:    eor r0, r0, r1
749 ; ARM-NEXT:    uxth r1, r2
750 ; ARM-NEXT:    orr r0, r0, r1
751 ; ARM-NEXT:    bx lr
753 ; ARMEB-LABEL: test4:
754 ; ARMEB:       @ %bb.0: @ %entry
755 ; ARMEB-NEXT:    mul r2, r2, r3
756 ; ARMEB-NEXT:    ldrh r1, [r1, #2]
757 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
758 ; ARMEB-NEXT:    eor r0, r0, r1
759 ; ARMEB-NEXT:    uxth r1, r2
760 ; ARMEB-NEXT:    orr r0, r0, r1
761 ; ARMEB-NEXT:    bx lr
763 ; THUMB1-LABEL: test4:
764 ; THUMB1:       @ %bb.0: @ %entry
765 ; THUMB1-NEXT:    push {r4, lr}
766 ; THUMB1-NEXT:    ldrh r1, [r1]
767 ; THUMB1-NEXT:    ldrh r4, [r0]
768 ; THUMB1-NEXT:    eors r4, r1
769 ; THUMB1-NEXT:    muls r2, r3, r2
770 ; THUMB1-NEXT:    uxth r0, r2
771 ; THUMB1-NEXT:    orrs r0, r4
772 ; THUMB1-NEXT:    pop {r4, pc}
774 ; THUMB2-LABEL: test4:
775 ; THUMB2:       @ %bb.0: @ %entry
776 ; THUMB2-NEXT:    ldrh r1, [r1]
777 ; THUMB2-NEXT:    ldrh r0, [r0]
778 ; THUMB2-NEXT:    eors r0, r1
779 ; THUMB2-NEXT:    mul r1, r2, r3
780 ; THUMB2-NEXT:    uxth r1, r1
781 ; THUMB2-NEXT:    orrs r0, r1
782 ; THUMB2-NEXT:    bx lr
783 entry:
784   %0 = load i32, i32* %a, align 4
785   %1 = load i32, i32* %b, align 4
786   %mul = mul i32 %x, %y
787   %xor = xor i32 %0, %1
788   %or = or i32 %xor, %mul
789   %and = and i32 %or, 65535
790   ret i32 %and
793 define arm_aapcscc i32 @test5(i32* %a, i32* %b, i32 %x, i16 zeroext %y) {
794 ; ARM-LABEL: test5:
795 ; ARM:       @ %bb.0: @ %entry
796 ; ARM-NEXT:    ldr r1, [r1]
797 ; ARM-NEXT:    ldrh r0, [r0]
798 ; ARM-NEXT:    mul r1, r2, r1
799 ; ARM-NEXT:    eor r0, r0, r3
800 ; ARM-NEXT:    uxth r1, r1
801 ; ARM-NEXT:    orr r0, r0, r1
802 ; ARM-NEXT:    bx lr
804 ; ARMEB-LABEL: test5:
805 ; ARMEB:       @ %bb.0: @ %entry
806 ; ARMEB-NEXT:    ldr r1, [r1]
807 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
808 ; ARMEB-NEXT:    mul r1, r2, r1
809 ; ARMEB-NEXT:    eor r0, r0, r3
810 ; ARMEB-NEXT:    uxth r1, r1
811 ; ARMEB-NEXT:    orr r0, r0, r1
812 ; ARMEB-NEXT:    bx lr
814 ; THUMB1-LABEL: test5:
815 ; THUMB1:       @ %bb.0: @ %entry
816 ; THUMB1-NEXT:    push {r4, lr}
817 ; THUMB1-NEXT:    ldrh r4, [r0]
818 ; THUMB1-NEXT:    eors r4, r3
819 ; THUMB1-NEXT:    ldr r0, [r1]
820 ; THUMB1-NEXT:    muls r0, r2, r0
821 ; THUMB1-NEXT:    uxth r0, r0
822 ; THUMB1-NEXT:    orrs r0, r4
823 ; THUMB1-NEXT:    pop {r4, pc}
825 ; THUMB2-LABEL: test5:
826 ; THUMB2:       @ %bb.0: @ %entry
827 ; THUMB2-NEXT:    ldr r1, [r1]
828 ; THUMB2-NEXT:    ldrh r0, [r0]
829 ; THUMB2-NEXT:    muls r1, r2, r1
830 ; THUMB2-NEXT:    eors r0, r3
831 ; THUMB2-NEXT:    uxth r1, r1
832 ; THUMB2-NEXT:    orrs r0, r1
833 ; THUMB2-NEXT:    bx lr
834 entry:
835   %0 = load i32, i32* %a, align 4
836   %1 = load i32, i32* %b, align 4
837   %mul = mul i32 %x, %1
838   %ext = zext i16 %y to i32
839   %xor = xor i32 %0, %ext
840   %or = or i32 %xor, %mul
841   %and = and i32 %or, 65535
842   ret i32 %and
845 define arm_aapcscc i1 @test6(i8* %x, i8 %y, i8 %z) {
846 ; ARM-LABEL: test6:
847 ; ARM:       @ %bb.0: @ %entry
848 ; ARM-NEXT:    ldrb r0, [r0]
849 ; ARM-NEXT:    and r0, r1, r0
850 ; ARM-NEXT:    uxtb r1, r2
851 ; ARM-NEXT:    sub r0, r0, r1
852 ; ARM-NEXT:    clz r0, r0
853 ; ARM-NEXT:    lsr r0, r0, #5
854 ; ARM-NEXT:    bx lr
856 ; ARMEB-LABEL: test6:
857 ; ARMEB:       @ %bb.0: @ %entry
858 ; ARMEB-NEXT:    ldrb r0, [r0]
859 ; ARMEB-NEXT:    and r0, r1, r0
860 ; ARMEB-NEXT:    uxtb r1, r2
861 ; ARMEB-NEXT:    sub r0, r0, r1
862 ; ARMEB-NEXT:    clz r0, r0
863 ; ARMEB-NEXT:    lsr r0, r0, #5
864 ; ARMEB-NEXT:    bx lr
866 ; THUMB1-LABEL: test6:
867 ; THUMB1:       @ %bb.0: @ %entry
868 ; THUMB1-NEXT:    ldrb r0, [r0]
869 ; THUMB1-NEXT:    ands r0, r1
870 ; THUMB1-NEXT:    uxtb r1, r2
871 ; THUMB1-NEXT:    subs r1, r0, r1
872 ; THUMB1-NEXT:    rsbs r0, r1, #0
873 ; THUMB1-NEXT:    adcs r0, r1
874 ; THUMB1-NEXT:    bx lr
876 ; THUMB2-LABEL: test6:
877 ; THUMB2:       @ %bb.0: @ %entry
878 ; THUMB2-NEXT:    ldrb r0, [r0]
879 ; THUMB2-NEXT:    ands r0, r1
880 ; THUMB2-NEXT:    uxtb r1, r2
881 ; THUMB2-NEXT:    subs r0, r0, r1
882 ; THUMB2-NEXT:    clz r0, r0
883 ; THUMB2-NEXT:    lsrs r0, r0, #5
884 ; THUMB2-NEXT:    bx lr
885 entry:
886   %0 = load i8, i8* %x, align 4
887   %1 = and i8 %0, %y
888   %2 = icmp eq i8 %1, %z
889   ret i1 %2
892 define arm_aapcscc i1 @test7(i16* %x, i16 %y, i8 %z) {
893 ; ARM-LABEL: test7:
894 ; ARM:       @ %bb.0: @ %entry
895 ; ARM-NEXT:    ldrb r0, [r0]
896 ; ARM-NEXT:    and r0, r1, r0
897 ; ARM-NEXT:    uxtb r1, r2
898 ; ARM-NEXT:    sub r0, r0, r1
899 ; ARM-NEXT:    clz r0, r0
900 ; ARM-NEXT:    lsr r0, r0, #5
901 ; ARM-NEXT:    bx lr
903 ; ARMEB-LABEL: test7:
904 ; ARMEB:       @ %bb.0: @ %entry
905 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
906 ; ARMEB-NEXT:    and r0, r1, r0
907 ; ARMEB-NEXT:    uxtb r1, r2
908 ; ARMEB-NEXT:    sub r0, r0, r1
909 ; ARMEB-NEXT:    clz r0, r0
910 ; ARMEB-NEXT:    lsr r0, r0, #5
911 ; ARMEB-NEXT:    bx lr
913 ; THUMB1-LABEL: test7:
914 ; THUMB1:       @ %bb.0: @ %entry
915 ; THUMB1-NEXT:    ldrb r0, [r0]
916 ; THUMB1-NEXT:    ands r0, r1
917 ; THUMB1-NEXT:    uxtb r1, r2
918 ; THUMB1-NEXT:    subs r1, r0, r1
919 ; THUMB1-NEXT:    rsbs r0, r1, #0
920 ; THUMB1-NEXT:    adcs r0, r1
921 ; THUMB1-NEXT:    bx lr
923 ; THUMB2-LABEL: test7:
924 ; THUMB2:       @ %bb.0: @ %entry
925 ; THUMB2-NEXT:    ldrb r0, [r0]
926 ; THUMB2-NEXT:    ands r0, r1
927 ; THUMB2-NEXT:    uxtb r1, r2
928 ; THUMB2-NEXT:    subs r0, r0, r1
929 ; THUMB2-NEXT:    clz r0, r0
930 ; THUMB2-NEXT:    lsrs r0, r0, #5
931 ; THUMB2-NEXT:    bx lr
932 entry:
933   %0 = load i16, i16* %x, align 4
934   %1 = and i16 %0, %y
935   %2 = trunc i16 %1 to i8
936   %3 = icmp eq i8 %2, %z
937   ret i1 %3
940 define arm_aapcscc void @test8(i32* nocapture %p) {
941 ; ARM-LABEL: test8:
942 ; ARM:       @ %bb.0: @ %entry
943 ; ARM-NEXT:    ldrb r1, [r0]
944 ; ARM-NEXT:    eor r1, r1, #255
945 ; ARM-NEXT:    str r1, [r0]
946 ; ARM-NEXT:    bx lr
948 ; ARMEB-LABEL: test8:
949 ; ARMEB:       @ %bb.0: @ %entry
950 ; ARMEB-NEXT:    ldrb r1, [r0, #3]
951 ; ARMEB-NEXT:    eor r1, r1, #255
952 ; ARMEB-NEXT:    str r1, [r0]
953 ; ARMEB-NEXT:    bx lr
955 ; THUMB1-LABEL: test8:
956 ; THUMB1:       @ %bb.0: @ %entry
957 ; THUMB1-NEXT:    ldrb r1, [r0]
958 ; THUMB1-NEXT:    movs r2, #255
959 ; THUMB1-NEXT:    eors r2, r1
960 ; THUMB1-NEXT:    str r2, [r0]
961 ; THUMB1-NEXT:    bx lr
963 ; THUMB2-LABEL: test8:
964 ; THUMB2:       @ %bb.0: @ %entry
965 ; THUMB2-NEXT:    ldrb r1, [r0]
966 ; THUMB2-NEXT:    eor r1, r1, #255
967 ; THUMB2-NEXT:    str r1, [r0]
968 ; THUMB2-NEXT:    bx lr
969 entry:
970   %0 = load i32, i32* %p, align 4
971   %neg = and i32 %0, 255
972   %and = xor i32 %neg, 255
973   store i32 %and, i32* %p, align 4
974   ret void
977 define arm_aapcscc void @test9(i32* nocapture %p) {
978 ; ARM-LABEL: test9:
979 ; ARM:       @ %bb.0: @ %entry
980 ; ARM-NEXT:    ldrb r1, [r0]
981 ; ARM-NEXT:    eor r1, r1, #255
982 ; ARM-NEXT:    str r1, [r0]
983 ; ARM-NEXT:    bx lr
985 ; ARMEB-LABEL: test9:
986 ; ARMEB:       @ %bb.0: @ %entry
987 ; ARMEB-NEXT:    ldrb r1, [r0, #3]
988 ; ARMEB-NEXT:    eor r1, r1, #255
989 ; ARMEB-NEXT:    str r1, [r0]
990 ; ARMEB-NEXT:    bx lr
992 ; THUMB1-LABEL: test9:
993 ; THUMB1:       @ %bb.0: @ %entry
994 ; THUMB1-NEXT:    ldrb r1, [r0]
995 ; THUMB1-NEXT:    movs r2, #255
996 ; THUMB1-NEXT:    eors r2, r1
997 ; THUMB1-NEXT:    str r2, [r0]
998 ; THUMB1-NEXT:    bx lr
1000 ; THUMB2-LABEL: test9:
1001 ; THUMB2:       @ %bb.0: @ %entry
1002 ; THUMB2-NEXT:    ldrb r1, [r0]
1003 ; THUMB2-NEXT:    eor r1, r1, #255
1004 ; THUMB2-NEXT:    str r1, [r0]
1005 ; THUMB2-NEXT:    bx lr
1006 entry:
1007   %0 = load i32, i32* %p, align 4
1008   %neg = xor i32 %0, -1
1009   %and = and i32 %neg, 255
1010   store i32 %and, i32* %p, align 4
1011   ret void
1014 define arm_aapcscc void @test10(i32* nocapture %p) {
1015 ; ARM-LABEL: test10:
1016 ; ARM:       @ %bb.0: @ %entry
1017 ; ARM-NEXT:    ldrb r1, [r0]
1018 ; ARM-NEXT:    eor r1, r1, #255
1019 ; ARM-NEXT:    str r1, [r0]
1020 ; ARM-NEXT:    bx lr
1022 ; ARMEB-LABEL: test10:
1023 ; ARMEB:       @ %bb.0: @ %entry
1024 ; ARMEB-NEXT:    ldrb r1, [r0, #3]
1025 ; ARMEB-NEXT:    eor r1, r1, #255
1026 ; ARMEB-NEXT:    str r1, [r0]
1027 ; ARMEB-NEXT:    bx lr
1029 ; THUMB1-LABEL: test10:
1030 ; THUMB1:       @ %bb.0: @ %entry
1031 ; THUMB1-NEXT:    ldrb r1, [r0]
1032 ; THUMB1-NEXT:    movs r2, #255
1033 ; THUMB1-NEXT:    eors r2, r1
1034 ; THUMB1-NEXT:    str r2, [r0]
1035 ; THUMB1-NEXT:    bx lr
1037 ; THUMB2-LABEL: test10:
1038 ; THUMB2:       @ %bb.0: @ %entry
1039 ; THUMB2-NEXT:    ldrb r1, [r0]
1040 ; THUMB2-NEXT:    eor r1, r1, #255
1041 ; THUMB2-NEXT:    str r1, [r0]
1042 ; THUMB2-NEXT:    bx lr
1043 entry:
1044   %0 = load i32, i32* %p, align 4
1045   %neg = and i32 %0, 255
1046   %and = xor i32 %neg, 255
1047   store i32 %and, i32* %p, align 4
1048   ret void
1051 define arm_aapcscc i32 @test11(i32* nocapture %p) {
1052 ; ARM-LABEL: test11:
1053 ; ARM:       @ %bb.0:
1054 ; ARM-NEXT:    ldrb r0, [r0, #1]
1055 ; ARM-NEXT:    lsl r0, r0, #8
1056 ; ARM-NEXT:    bx lr
1058 ; ARMEB-LABEL: test11:
1059 ; ARMEB:       @ %bb.0:
1060 ; ARMEB-NEXT:    ldrb r0, [r0, #2]
1061 ; ARMEB-NEXT:    lsl r0, r0, #8
1062 ; ARMEB-NEXT:    bx lr
1064 ; THUMB1-LABEL: test11:
1065 ; THUMB1:       @ %bb.0:
1066 ; THUMB1-NEXT:    ldrb r0, [r0, #1]
1067 ; THUMB1-NEXT:    lsls r0, r0, #8
1068 ; THUMB1-NEXT:    bx lr
1070 ; THUMB2-LABEL: test11:
1071 ; THUMB2:       @ %bb.0:
1072 ; THUMB2-NEXT:    ldrb r0, [r0, #1]
1073 ; THUMB2-NEXT:    lsls r0, r0, #8
1074 ; THUMB2-NEXT:    bx lr
1075   %1 = load i32, i32* %p, align 4
1076   %and = and i32 %1, 65280
1077   ret i32 %and
1080 define arm_aapcscc i32 @test12(i32* nocapture %p) {
1081 ; ARM-LABEL: test12:
1082 ; ARM:       @ %bb.0:
1083 ; ARM-NEXT:    ldrb r0, [r0, #2]
1084 ; ARM-NEXT:    lsl r0, r0, #16
1085 ; ARM-NEXT:    bx lr
1087 ; ARMEB-LABEL: test12:
1088 ; ARMEB:       @ %bb.0:
1089 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
1090 ; ARMEB-NEXT:    lsl r0, r0, #16
1091 ; ARMEB-NEXT:    bx lr
1093 ; THUMB1-LABEL: test12:
1094 ; THUMB1:       @ %bb.0:
1095 ; THUMB1-NEXT:    ldrb r0, [r0, #2]
1096 ; THUMB1-NEXT:    lsls r0, r0, #16
1097 ; THUMB1-NEXT:    bx lr
1099 ; THUMB2-LABEL: test12:
1100 ; THUMB2:       @ %bb.0:
1101 ; THUMB2-NEXT:    ldrb r0, [r0, #2]
1102 ; THUMB2-NEXT:    lsls r0, r0, #16
1103 ; THUMB2-NEXT:    bx lr
1104   %1 = load i32, i32* %p, align 4
1105   %and = and i32 %1, 16711680
1106   ret i32 %and
1109 define arm_aapcscc i32 @test13(i32* nocapture %p) {
1110 ; ARM-LABEL: test13:
1111 ; ARM:       @ %bb.0:
1112 ; ARM-NEXT:    ldrb r0, [r0, #3]
1113 ; ARM-NEXT:    lsl r0, r0, #24
1114 ; ARM-NEXT:    bx lr
1116 ; ARMEB-LABEL: test13:
1117 ; ARMEB:       @ %bb.0:
1118 ; ARMEB-NEXT:    ldrb r0, [r0]
1119 ; ARMEB-NEXT:    lsl r0, r0, #24
1120 ; ARMEB-NEXT:    bx lr
1122 ; THUMB1-LABEL: test13:
1123 ; THUMB1:       @ %bb.0:
1124 ; THUMB1-NEXT:    ldrb r0, [r0, #3]
1125 ; THUMB1-NEXT:    lsls r0, r0, #24
1126 ; THUMB1-NEXT:    bx lr
1128 ; THUMB2-LABEL: test13:
1129 ; THUMB2:       @ %bb.0:
1130 ; THUMB2-NEXT:    ldrb r0, [r0, #3]
1131 ; THUMB2-NEXT:    lsls r0, r0, #24
1132 ; THUMB2-NEXT:    bx lr
1133   %1 = load i32, i32* %p, align 4
1134   %and = and i32 %1, 4278190080
1135   ret i32 %and
1138 define arm_aapcscc i32 @test14(i32* nocapture %p) {
1139 ; ARM-LABEL: test14:
1140 ; ARM:       @ %bb.0:
1141 ; ARM-NEXT:    ldrh r0, [r0, #1]
1142 ; ARM-NEXT:    lsl r0, r0, #8
1143 ; ARM-NEXT:    bx lr
1145 ; ARMEB-LABEL: test14:
1146 ; ARMEB:       @ %bb.0:
1147 ; ARMEB-NEXT:    ldrh r0, [r0, #1]
1148 ; ARMEB-NEXT:    lsl r0, r0, #8
1149 ; ARMEB-NEXT:    bx lr
1151 ; THUMB1-LABEL: test14:
1152 ; THUMB1:       @ %bb.0:
1153 ; THUMB1-NEXT:    ldr r1, [r0]
1154 ; THUMB1-NEXT:    ldr r0, .LCPI26_0
1155 ; THUMB1-NEXT:    ands r0, r1
1156 ; THUMB1-NEXT:    bx lr
1157 ; THUMB1-NEXT:    .p2align 2
1158 ; THUMB1-NEXT:  @ %bb.1:
1159 ; THUMB1-NEXT:  .LCPI26_0:
1160 ; THUMB1-NEXT:    .long 16776960 @ 0xffff00
1162 ; THUMB2-LABEL: test14:
1163 ; THUMB2:       @ %bb.0:
1164 ; THUMB2-NEXT:    ldrh.w r0, [r0, #1]
1165 ; THUMB2-NEXT:    lsls r0, r0, #8
1166 ; THUMB2-NEXT:    bx lr
1167   %1 = load i32, i32* %p, align 4
1168   %and = and i32 %1, 16776960
1169   ret i32 %and
1172 define arm_aapcscc i32 @test15(i32* nocapture %p) {
1173 ; ARM-LABEL: test15:
1174 ; ARM:       @ %bb.0:
1175 ; ARM-NEXT:    ldrh r0, [r0, #2]
1176 ; ARM-NEXT:    lsl r0, r0, #16
1177 ; ARM-NEXT:    bx lr
1179 ; ARMEB-LABEL: test15:
1180 ; ARMEB:       @ %bb.0:
1181 ; ARMEB-NEXT:    ldrh r0, [r0]
1182 ; ARMEB-NEXT:    lsl r0, r0, #16
1183 ; ARMEB-NEXT:    bx lr
1185 ; THUMB1-LABEL: test15:
1186 ; THUMB1:       @ %bb.0:
1187 ; THUMB1-NEXT:    ldrh r0, [r0, #2]
1188 ; THUMB1-NEXT:    lsls r0, r0, #16
1189 ; THUMB1-NEXT:    bx lr
1191 ; THUMB2-LABEL: test15:
1192 ; THUMB2:       @ %bb.0:
1193 ; THUMB2-NEXT:    ldrh r0, [r0, #2]
1194 ; THUMB2-NEXT:    lsls r0, r0, #16
1195 ; THUMB2-NEXT:    bx lr
1196   %1 = load i32, i32* %p, align 4
1197   %and = and i32 %1, 4294901760
1198   ret i32 %and
1201 define arm_aapcscc i32 @test16(i64* nocapture %p) {
1202 ; ARM-LABEL: test16:
1203 ; ARM:       @ %bb.0:
1204 ; ARM-NEXT:    ldrb r0, [r0, #1]
1205 ; ARM-NEXT:    lsl r0, r0, #8
1206 ; ARM-NEXT:    bx lr
1208 ; ARMEB-LABEL: test16:
1209 ; ARMEB:       @ %bb.0:
1210 ; ARMEB-NEXT:    ldrb r0, [r0, #6]
1211 ; ARMEB-NEXT:    lsl r0, r0, #8
1212 ; ARMEB-NEXT:    bx lr
1214 ; THUMB1-LABEL: test16:
1215 ; THUMB1:       @ %bb.0:
1216 ; THUMB1-NEXT:    ldrb r0, [r0, #1]
1217 ; THUMB1-NEXT:    lsls r0, r0, #8
1218 ; THUMB1-NEXT:    bx lr
1220 ; THUMB2-LABEL: test16:
1221 ; THUMB2:       @ %bb.0:
1222 ; THUMB2-NEXT:    ldrb r0, [r0, #1]
1223 ; THUMB2-NEXT:    lsls r0, r0, #8
1224 ; THUMB2-NEXT:    bx lr
1225   %1 = load i64, i64* %p, align 8
1226   %and = and i64 %1, 65280
1227   %trunc = trunc i64 %and to i32
1228   ret i32 %trunc
1231 define arm_aapcscc i32 @test17(i64* nocapture %p) {
1232 ; ARM-LABEL: test17:
1233 ; ARM:       @ %bb.0:
1234 ; ARM-NEXT:    ldrb r0, [r0, #2]
1235 ; ARM-NEXT:    lsl r0, r0, #16
1236 ; ARM-NEXT:    bx lr
1238 ; ARMEB-LABEL: test17:
1239 ; ARMEB:       @ %bb.0:
1240 ; ARMEB-NEXT:    ldrb r0, [r0, #5]
1241 ; ARMEB-NEXT:    lsl r0, r0, #16
1242 ; ARMEB-NEXT:    bx lr
1244 ; THUMB1-LABEL: test17:
1245 ; THUMB1:       @ %bb.0:
1246 ; THUMB1-NEXT:    ldrb r0, [r0, #2]
1247 ; THUMB1-NEXT:    lsls r0, r0, #16
1248 ; THUMB1-NEXT:    bx lr
1250 ; THUMB2-LABEL: test17:
1251 ; THUMB2:       @ %bb.0:
1252 ; THUMB2-NEXT:    ldrb r0, [r0, #2]
1253 ; THUMB2-NEXT:    lsls r0, r0, #16
1254 ; THUMB2-NEXT:    bx lr
1255   %1 = load i64, i64* %p, align 8
1256   %and = and i64 %1, 16711680
1257   %trunc = trunc i64 %and to i32
1258   ret i32 %trunc
1261 define arm_aapcscc i32 @test18(i64* nocapture %p) {
1262 ; ARM-LABEL: test18:
1263 ; ARM:       @ %bb.0:
1264 ; ARM-NEXT:    ldrb r0, [r0, #3]
1265 ; ARM-NEXT:    lsl r0, r0, #24
1266 ; ARM-NEXT:    bx lr
1268 ; ARMEB-LABEL: test18:
1269 ; ARMEB:       @ %bb.0:
1270 ; ARMEB-NEXT:    ldrb r0, [r0, #4]
1271 ; ARMEB-NEXT:    lsl r0, r0, #24
1272 ; ARMEB-NEXT:    bx lr
1274 ; THUMB1-LABEL: test18:
1275 ; THUMB1:       @ %bb.0:
1276 ; THUMB1-NEXT:    ldrb r0, [r0, #3]
1277 ; THUMB1-NEXT:    lsls r0, r0, #24
1278 ; THUMB1-NEXT:    bx lr
1280 ; THUMB2-LABEL: test18:
1281 ; THUMB2:       @ %bb.0:
1282 ; THUMB2-NEXT:    ldrb r0, [r0, #3]
1283 ; THUMB2-NEXT:    lsls r0, r0, #24
1284 ; THUMB2-NEXT:    bx lr
1285   %1 = load i64, i64* %p, align 8
1286   %and = and i64 %1, 4278190080
1287   %trunc = trunc i64 %and to i32
1288   ret i32 %trunc
1291 define arm_aapcscc i64 @test19(i64* nocapture %p) {
1292 ; ARM-LABEL: test19:
1293 ; ARM:       @ %bb.0:
1294 ; ARM-NEXT:    ldrb r1, [r0, #4]
1295 ; ARM-NEXT:    mov r0, #0
1296 ; ARM-NEXT:    bx lr
1298 ; ARMEB-LABEL: test19:
1299 ; ARMEB:       @ %bb.0:
1300 ; ARMEB-NEXT:    ldrb r0, [r0, #3]
1301 ; ARMEB-NEXT:    mov r1, #0
1302 ; ARMEB-NEXT:    bx lr
1304 ; THUMB1-LABEL: test19:
1305 ; THUMB1:       @ %bb.0:
1306 ; THUMB1-NEXT:    ldrb r1, [r0, #4]
1307 ; THUMB1-NEXT:    movs r0, #0
1308 ; THUMB1-NEXT:    bx lr
1310 ; THUMB2-LABEL: test19:
1311 ; THUMB2:       @ %bb.0:
1312 ; THUMB2-NEXT:    ldrb r1, [r0, #4]
1313 ; THUMB2-NEXT:    movs r0, #0
1314 ; THUMB2-NEXT:    bx lr
1315   %1 = load i64, i64* %p, align 8
1316   %and = and i64 %1, 1095216660480
1317   ret i64 %and
1320 define arm_aapcscc i64 @test20(i64* nocapture %p) {
1321 ; ARM-LABEL: test20:
1322 ; ARM:       @ %bb.0:
1323 ; ARM-NEXT:    ldrb r0, [r0, #5]
1324 ; ARM-NEXT:    lsl r1, r0, #8
1325 ; ARM-NEXT:    mov r0, #0
1326 ; ARM-NEXT:    bx lr
1328 ; ARMEB-LABEL: test20:
1329 ; ARMEB:       @ %bb.0:
1330 ; ARMEB-NEXT:    ldrb r0, [r0, #2]
1331 ; ARMEB-NEXT:    mov r1, #0
1332 ; ARMEB-NEXT:    lsl r0, r0, #8
1333 ; ARMEB-NEXT:    bx lr
1335 ; THUMB1-LABEL: test20:
1336 ; THUMB1:       @ %bb.0:
1337 ; THUMB1-NEXT:    ldrb r0, [r0, #5]
1338 ; THUMB1-NEXT:    lsls r1, r0, #8
1339 ; THUMB1-NEXT:    movs r0, #0
1340 ; THUMB1-NEXT:    bx lr
1342 ; THUMB2-LABEL: test20:
1343 ; THUMB2:       @ %bb.0:
1344 ; THUMB2-NEXT:    ldrb r0, [r0, #5]
1345 ; THUMB2-NEXT:    lsls r1, r0, #8
1346 ; THUMB2-NEXT:    movs r0, #0
1347 ; THUMB2-NEXT:    bx lr
1348   %1 = load i64, i64* %p, align 8
1349   %and = and i64 %1, 280375465082880
1350   ret i64 %and
1353 define arm_aapcscc i64 @test21(i64* nocapture %p) {
1354 ; ARM-LABEL: test21:
1355 ; ARM:       @ %bb.0:
1356 ; ARM-NEXT:    ldrb r0, [r0, #6]
1357 ; ARM-NEXT:    lsl r1, r0, #16
1358 ; ARM-NEXT:    mov r0, #0
1359 ; ARM-NEXT:    bx lr
1361 ; ARMEB-LABEL: test21:
1362 ; ARMEB:       @ %bb.0:
1363 ; ARMEB-NEXT:    ldrb r0, [r0, #1]
1364 ; ARMEB-NEXT:    mov r1, #0
1365 ; ARMEB-NEXT:    lsl r0, r0, #16
1366 ; ARMEB-NEXT:    bx lr
1368 ; THUMB1-LABEL: test21:
1369 ; THUMB1:       @ %bb.0:
1370 ; THUMB1-NEXT:    ldrb r0, [r0, #6]
1371 ; THUMB1-NEXT:    lsls r1, r0, #16
1372 ; THUMB1-NEXT:    movs r0, #0
1373 ; THUMB1-NEXT:    bx lr
1375 ; THUMB2-LABEL: test21:
1376 ; THUMB2:       @ %bb.0:
1377 ; THUMB2-NEXT:    ldrb r0, [r0, #6]
1378 ; THUMB2-NEXT:    lsls r1, r0, #16
1379 ; THUMB2-NEXT:    movs r0, #0
1380 ; THUMB2-NEXT:    bx lr
1381   %1 = load i64, i64* %p, align 8
1382   %and = and i64 %1, 71776119061217280
1383   ret i64 %and
1386 define arm_aapcscc i64 @test22(i64* nocapture %p) {
1387 ; ARM-LABEL: test22:
1388 ; ARM:       @ %bb.0:
1389 ; ARM-NEXT:    ldrb r0, [r0, #7]
1390 ; ARM-NEXT:    lsl r1, r0, #24
1391 ; ARM-NEXT:    mov r0, #0
1392 ; ARM-NEXT:    bx lr
1394 ; ARMEB-LABEL: test22:
1395 ; ARMEB:       @ %bb.0:
1396 ; ARMEB-NEXT:    ldrb r0, [r0]
1397 ; ARMEB-NEXT:    mov r1, #0
1398 ; ARMEB-NEXT:    lsl r0, r0, #24
1399 ; ARMEB-NEXT:    bx lr
1401 ; THUMB1-LABEL: test22:
1402 ; THUMB1:       @ %bb.0:
1403 ; THUMB1-NEXT:    ldrb r0, [r0, #7]
1404 ; THUMB1-NEXT:    lsls r1, r0, #24
1405 ; THUMB1-NEXT:    movs r0, #0
1406 ; THUMB1-NEXT:    bx lr
1408 ; THUMB2-LABEL: test22:
1409 ; THUMB2:       @ %bb.0:
1410 ; THUMB2-NEXT:    ldrb r0, [r0, #7]
1411 ; THUMB2-NEXT:    lsls r1, r0, #24
1412 ; THUMB2-NEXT:    movs r0, #0
1413 ; THUMB2-NEXT:    bx lr
1414   %1 = load i64, i64* %p, align 8
1415   %and = and i64 %1, -72057594037927936
1416   ret i64 %and
1419 define arm_aapcscc i64 @test23(i64* nocapture %p) {
1420 ; ARM-LABEL: test23:
1421 ; ARM:       @ %bb.0:
1422 ; ARM-NEXT:    ldrh r1, [r0, #3]
1423 ; ARM-NEXT:    lsl r0, r1, #24
1424 ; ARM-NEXT:    lsr r1, r1, #8
1425 ; ARM-NEXT:    bx lr
1427 ; ARMEB-LABEL: test23:
1428 ; ARMEB:       @ %bb.0:
1429 ; ARMEB-NEXT:    ldrh r1, [r0, #3]
1430 ; ARMEB-NEXT:    lsr r0, r1, #8
1431 ; ARMEB-NEXT:    lsl r1, r1, #24
1432 ; ARMEB-NEXT:    bx lr
1434 ; THUMB1-LABEL: test23:
1435 ; THUMB1:       @ %bb.0:
1436 ; THUMB1-NEXT:    ldrb r1, [r0, #3]
1437 ; THUMB1-NEXT:    ldrb r0, [r0, #4]
1438 ; THUMB1-NEXT:    lsls r0, r0, #8
1439 ; THUMB1-NEXT:    adds r1, r0, r1
1440 ; THUMB1-NEXT:    lsls r0, r1, #24
1441 ; THUMB1-NEXT:    lsrs r1, r1, #8
1442 ; THUMB1-NEXT:    bx lr
1444 ; THUMB2-LABEL: test23:
1445 ; THUMB2:       @ %bb.0:
1446 ; THUMB2-NEXT:    ldrh.w r1, [r0, #3]
1447 ; THUMB2-NEXT:    lsls r0, r1, #24
1448 ; THUMB2-NEXT:    lsrs r1, r1, #8
1449 ; THUMB2-NEXT:    bx lr
1450   %1 = load i64, i64* %p, align 8
1451   %and = and i64 %1, 1099494850560
1452   ret i64 %and
1455 define arm_aapcscc i64 @test24(i64* nocapture %p) {
1456 ; ARM-LABEL: test24:
1457 ; ARM:       @ %bb.0:
1458 ; ARM-NEXT:    ldrh r1, [r0, #4]
1459 ; ARM-NEXT:    mov r0, #0
1460 ; ARM-NEXT:    bx lr
1462 ; ARMEB-LABEL: test24:
1463 ; ARMEB:       @ %bb.0:
1464 ; ARMEB-NEXT:    ldrh r0, [r0, #2]
1465 ; ARMEB-NEXT:    mov r1, #0
1466 ; ARMEB-NEXT:    bx lr
1468 ; THUMB1-LABEL: test24:
1469 ; THUMB1:       @ %bb.0:
1470 ; THUMB1-NEXT:    ldrh r1, [r0, #4]
1471 ; THUMB1-NEXT:    movs r0, #0
1472 ; THUMB1-NEXT:    bx lr
1474 ; THUMB2-LABEL: test24:
1475 ; THUMB2:       @ %bb.0:
1476 ; THUMB2-NEXT:    ldrh r1, [r0, #4]
1477 ; THUMB2-NEXT:    movs r0, #0
1478 ; THUMB2-NEXT:    bx lr
1479   %1 = load i64, i64* %p, align 8
1480   %and = and i64 %1, 281470681743360
1481   ret i64 %and
1484 define arm_aapcscc i64 @test25(i64* nocapture %p) {
1485 ; ARM-LABEL: test25:
1486 ; ARM:       @ %bb.0:
1487 ; ARM-NEXT:    ldrh r0, [r0, #5]
1488 ; ARM-NEXT:    lsl r1, r0, #8
1489 ; ARM-NEXT:    mov r0, #0
1490 ; ARM-NEXT:    bx lr
1492 ; ARMEB-LABEL: test25:
1493 ; ARMEB:       @ %bb.0:
1494 ; ARMEB-NEXT:    ldrh r0, [r0, #1]
1495 ; ARMEB-NEXT:    mov r1, #0
1496 ; ARMEB-NEXT:    lsl r0, r0, #8
1497 ; ARMEB-NEXT:    bx lr
1499 ; THUMB1-LABEL: test25:
1500 ; THUMB1:       @ %bb.0:
1501 ; THUMB1-NEXT:    ldrb r1, [r0, #5]
1502 ; THUMB1-NEXT:    ldrb r0, [r0, #6]
1503 ; THUMB1-NEXT:    lsls r0, r0, #8
1504 ; THUMB1-NEXT:    adds r0, r0, r1
1505 ; THUMB1-NEXT:    lsls r1, r0, #8
1506 ; THUMB1-NEXT:    movs r0, #0
1507 ; THUMB1-NEXT:    bx lr
1509 ; THUMB2-LABEL: test25:
1510 ; THUMB2:       @ %bb.0:
1511 ; THUMB2-NEXT:    ldrh.w r0, [r0, #5]
1512 ; THUMB2-NEXT:    lsls r1, r0, #8
1513 ; THUMB2-NEXT:    movs r0, #0
1514 ; THUMB2-NEXT:    bx lr
1515   %1 = load i64, i64* %p, align 8
1516   %and = and i64 %1, 72056494526300160
1517   ret i64 %and
1520 define arm_aapcscc i64 @test26(i64* nocapture %p) {
1521 ; ARM-LABEL: test26:
1522 ; ARM:       @ %bb.0:
1523 ; ARM-NEXT:    ldrh r0, [r0, #6]
1524 ; ARM-NEXT:    lsl r1, r0, #16
1525 ; ARM-NEXT:    mov r0, #0
1526 ; ARM-NEXT:    bx lr
1528 ; ARMEB-LABEL: test26:
1529 ; ARMEB:       @ %bb.0:
1530 ; ARMEB-NEXT:    ldrh r0, [r0]
1531 ; ARMEB-NEXT:    mov r1, #0
1532 ; ARMEB-NEXT:    lsl r0, r0, #16
1533 ; ARMEB-NEXT:    bx lr
1535 ; THUMB1-LABEL: test26:
1536 ; THUMB1:       @ %bb.0:
1537 ; THUMB1-NEXT:    ldrh r0, [r0, #6]
1538 ; THUMB1-NEXT:    lsls r1, r0, #16
1539 ; THUMB1-NEXT:    movs r0, #0
1540 ; THUMB1-NEXT:    bx lr
1542 ; THUMB2-LABEL: test26:
1543 ; THUMB2:       @ %bb.0:
1544 ; THUMB2-NEXT:    ldrh r0, [r0, #6]
1545 ; THUMB2-NEXT:    lsls r1, r0, #16
1546 ; THUMB2-NEXT:    movs r0, #0
1547 ; THUMB2-NEXT:    bx lr
1548   %1 = load i64, i64* %p, align 8
1549   %and = and i64 %1, -281474976710656
1550   ret i64 %and
1553 define void @test27(i32* nocapture %ptr) {
1554 ; ARM-LABEL: test27:
1555 ; ARM:       @ %bb.0: @ %entry
1556 ; ARM-NEXT:    ldrb r1, [r0, #1]
1557 ; ARM-NEXT:    lsl r1, r1, #16
1558 ; ARM-NEXT:    str r1, [r0]
1559 ; ARM-NEXT:    bx lr
1561 ; ARMEB-LABEL: test27:
1562 ; ARMEB:       @ %bb.0: @ %entry
1563 ; ARMEB-NEXT:    ldrb r1, [r0, #2]
1564 ; ARMEB-NEXT:    lsl r1, r1, #16
1565 ; ARMEB-NEXT:    str r1, [r0]
1566 ; ARMEB-NEXT:    bx lr
1568 ; THUMB1-LABEL: test27:
1569 ; THUMB1:       @ %bb.0: @ %entry
1570 ; THUMB1-NEXT:    ldrb r1, [r0, #1]
1571 ; THUMB1-NEXT:    lsls r1, r1, #16
1572 ; THUMB1-NEXT:    str r1, [r0]
1573 ; THUMB1-NEXT:    bx lr
1575 ; THUMB2-LABEL: test27:
1576 ; THUMB2:       @ %bb.0: @ %entry
1577 ; THUMB2-NEXT:    ldrb r1, [r0, #1]
1578 ; THUMB2-NEXT:    lsls r1, r1, #16
1579 ; THUMB2-NEXT:    str r1, [r0]
1580 ; THUMB2-NEXT:    bx lr
1581 entry:
1582   %0 = load i32, i32* %ptr, align 4
1583   %and = and i32 %0, 65280
1584   %shl = shl i32 %and, 8
1585   store i32 %shl, i32* %ptr, align 4
1586   ret void