blob: 2b92778f469de9a2862e2196c0d60052f5da75ae [file] [log] [blame]
Sam Parker412a9912017-12-01 13:42:39 +00001; 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
6
7define arm_aapcscc zeroext i1 @cmp_xor8_short_short(i16* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +00008 i16* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +00009; ARM-LABEL: cmp_xor8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +000010; ARM: ldrb r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +000011; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +000012; ARM-NEXT: ldrb r1, [r1]
13; ARM-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +000014; ARM-NEXT: movweq r0, #1
15; ARM-NEXT: bx lr
16;
17; ARMEB-LABEL: cmp_xor8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +000018; ARMEB: ldrb r2, [r0, #1]
Sam Parker412a9912017-12-01 13:42:39 +000019; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +000020; ARMEB-NEXT: ldrb r1, [r1, #1]
21; ARMEB-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +000022; ARMEB-NEXT: movweq r0, #1
23; ARMEB-NEXT: bx lr
24;
25; THUMB1-LABEL: cmp_xor8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +000026; THUMB1: ldrb r0, [r0]
27; THUMB1-NEXT: ldrb r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +000028; THUMB1-NEXT: eors r2, r0
29; THUMB1-NEXT: movs r0, #1
30; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +000031; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +000032; THUMB1-NEXT: beq .LBB0_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000033; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +000034; THUMB1-NEXT: mov r0, r1
35; THUMB1-NEXT: .LBB0_2: @ %entry
36; THUMB1-NEXT: bx lr
37;
38; THUMB2-LABEL: cmp_xor8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +000039; THUMB2: ldrb r2, [r0]
40; THUMB2-NEXT: movs r0, #0
41; THUMB2-NEXT: ldrb r1, [r1]
42; THUMB2-NEXT: teq.w r1, r2
Sam Parker412a9912017-12-01 13:42:39 +000043; THUMB2-NEXT: it eq
44; THUMB2-NEXT: moveq r0, #1
45; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +000046entry:
47 %0 = load i16, i16* %a, align 2
48 %1 = load i16, i16* %b, align 2
49 %xor2 = xor i16 %1, %0
50 %2 = and i16 %xor2, 255
51 %cmp = icmp eq i16 %2, 0
52 ret i1 %cmp
53}
54
55define arm_aapcscc zeroext i1 @cmp_xor8_short_int(i16* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +000056 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +000057; ARM-LABEL: cmp_xor8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +000058; ARM: ldrb r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +000059; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +000060; ARM-NEXT: ldrb r1, [r1]
61; ARM-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +000062; ARM-NEXT: movweq r0, #1
63; ARM-NEXT: bx lr
64;
65; ARMEB-LABEL: cmp_xor8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +000066; ARMEB: ldrb r2, [r0, #1]
Sam Parker412a9912017-12-01 13:42:39 +000067; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +000068; ARMEB-NEXT: ldrb r1, [r1, #3]
69; ARMEB-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +000070; ARMEB-NEXT: movweq r0, #1
71; ARMEB-NEXT: bx lr
72;
73; THUMB1-LABEL: cmp_xor8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +000074; THUMB1: ldrb r0, [r0]
75; THUMB1-NEXT: ldrb r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +000076; THUMB1-NEXT: eors r2, r0
77; THUMB1-NEXT: movs r0, #1
78; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +000079; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +000080; THUMB1-NEXT: beq .LBB1_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000081; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +000082; THUMB1-NEXT: mov r0, r1
83; THUMB1-NEXT: .LBB1_2: @ %entry
84; THUMB1-NEXT: bx lr
85;
86; THUMB2-LABEL: cmp_xor8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +000087; THUMB2: ldrb r2, [r0]
88; THUMB2-NEXT: movs r0, #0
89; THUMB2-NEXT: ldrb r1, [r1]
90; THUMB2-NEXT: teq.w r1, r2
Sam Parker412a9912017-12-01 13:42:39 +000091; THUMB2-NEXT: it eq
92; THUMB2-NEXT: moveq r0, #1
93; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +000094entry:
95 %0 = load i16, i16* %a, align 2
96 %conv = zext i16 %0 to i32
97 %1 = load i32, i32* %b, align 4
98 %xor = xor i32 %1, %conv
99 %and = and i32 %xor, 255
100 %cmp = icmp eq i32 %and, 0
101 ret i1 %cmp
102}
103
104define arm_aapcscc zeroext i1 @cmp_xor8_int_int(i32* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000105 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000106; ARM-LABEL: cmp_xor8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000107; ARM: ldrb r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000108; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000109; ARM-NEXT: ldrb r1, [r1]
110; ARM-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000111; ARM-NEXT: movweq r0, #1
112; ARM-NEXT: bx lr
113;
114; ARMEB-LABEL: cmp_xor8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000115; ARMEB: ldrb r2, [r0, #3]
Sam Parker412a9912017-12-01 13:42:39 +0000116; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000117; ARMEB-NEXT: ldrb r1, [r1, #3]
118; ARMEB-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000119; ARMEB-NEXT: movweq r0, #1
120; ARMEB-NEXT: bx lr
121;
122; THUMB1-LABEL: cmp_xor8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000123; THUMB1: ldrb r0, [r0]
124; THUMB1-NEXT: ldrb r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000125; THUMB1-NEXT: eors r2, r0
126; THUMB1-NEXT: movs r0, #1
127; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000128; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +0000129; THUMB1-NEXT: beq .LBB2_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000130; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000131; THUMB1-NEXT: mov r0, r1
132; THUMB1-NEXT: .LBB2_2: @ %entry
133; THUMB1-NEXT: bx lr
134;
135; THUMB2-LABEL: cmp_xor8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000136; THUMB2: ldrb r2, [r0]
137; THUMB2-NEXT: movs r0, #0
138; THUMB2-NEXT: ldrb r1, [r1]
139; THUMB2-NEXT: teq.w r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000140; THUMB2-NEXT: it eq
141; THUMB2-NEXT: moveq r0, #1
142; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000143entry:
144 %0 = load i32, i32* %a, align 4
145 %1 = load i32, i32* %b, align 4
146 %xor = xor i32 %1, %0
147 %and = and i32 %xor, 255
148 %cmp = icmp eq i32 %and, 0
149 ret i1 %cmp
150}
151
152define arm_aapcscc zeroext i1 @cmp_xor16(i32* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000153 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000154; ARM-LABEL: cmp_xor16:
Sam Parker00804ef2017-12-18 10:04:27 +0000155; ARM: ldrh r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000156; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000157; ARM-NEXT: ldrh r1, [r1]
158; ARM-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000159; ARM-NEXT: movweq r0, #1
160; ARM-NEXT: bx lr
161;
162; ARMEB-LABEL: cmp_xor16:
Sam Parker00804ef2017-12-18 10:04:27 +0000163; ARMEB: ldrh r2, [r0, #2]
Sam Parker412a9912017-12-01 13:42:39 +0000164; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000165; ARMEB-NEXT: ldrh r1, [r1, #2]
166; ARMEB-NEXT: teq r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000167; ARMEB-NEXT: movweq r0, #1
168; ARMEB-NEXT: bx lr
169;
170; THUMB1-LABEL: cmp_xor16:
Sam Parker00804ef2017-12-18 10:04:27 +0000171; THUMB1: ldrh r0, [r0]
172; THUMB1-NEXT: ldrh r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000173; THUMB1-NEXT: eors r2, r0
174; THUMB1-NEXT: movs r0, #1
175; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000176; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +0000177; THUMB1-NEXT: beq .LBB3_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000178; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000179; THUMB1-NEXT: mov r0, r1
180; THUMB1-NEXT: .LBB3_2: @ %entry
181; THUMB1-NEXT: bx lr
182;
183; THUMB2-LABEL: cmp_xor16:
Sam Parker00804ef2017-12-18 10:04:27 +0000184; THUMB2: ldrh r2, [r0]
185; THUMB2-NEXT: movs r0, #0
186; THUMB2-NEXT: ldrh r1, [r1]
187; THUMB2-NEXT: teq.w r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000188; THUMB2-NEXT: it eq
189; THUMB2-NEXT: moveq r0, #1
190; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000191entry:
192 %0 = load i32, i32* %a, align 4
193 %1 = load i32, i32* %b, align 4
194 %xor = xor i32 %1, %0
195 %and = and i32 %xor, 65535
196 %cmp = icmp eq i32 %and, 0
197 ret i1 %cmp
198}
199
200define arm_aapcscc zeroext i1 @cmp_or8_short_short(i16* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000201 i16* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000202; ARM-LABEL: cmp_or8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000203; ARM: ldrb r0, [r0]
204; ARM-NEXT: ldrb r1, [r1]
205; ARM-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000206; ARM-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000207; ARM-NEXT: movweq r0, #1
208; ARM-NEXT: bx lr
209;
210; ARMEB-LABEL: cmp_or8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000211; ARMEB: ldrb r0, [r0, #1]
212; ARMEB-NEXT: ldrb r1, [r1, #1]
213; ARMEB-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000214; ARMEB-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000215; ARMEB-NEXT: movweq r0, #1
216; ARMEB-NEXT: bx lr
217;
218; THUMB1-LABEL: cmp_or8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000219; THUMB1: ldrb r0, [r0]
220; THUMB1-NEXT: ldrb r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000221; THUMB1-NEXT: orrs r2, r0
222; THUMB1-NEXT: movs r0, #1
223; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000224; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +0000225; THUMB1-NEXT: beq .LBB4_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000226; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000227; THUMB1-NEXT: mov r0, r1
228; THUMB1-NEXT: .LBB4_2: @ %entry
229; THUMB1-NEXT: bx lr
230;
231; THUMB2-LABEL: cmp_or8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000232; THUMB2: ldrb r0, [r0]
233; THUMB2-NEXT: ldrb r1, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000234; THUMB2-NEXT: orrs r0, r1
Sam Parker412a9912017-12-01 13:42:39 +0000235; THUMB2-NEXT: mov.w r0, #0
236; THUMB2-NEXT: it eq
237; THUMB2-NEXT: moveq r0, #1
238; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000239entry:
240 %0 = load i16, i16* %a, align 2
241 %1 = load i16, i16* %b, align 2
242 %or2 = or i16 %1, %0
243 %2 = and i16 %or2, 255
244 %cmp = icmp eq i16 %2, 0
245 ret i1 %cmp
246}
247
248define arm_aapcscc zeroext i1 @cmp_or8_short_int(i16* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000249 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000250; ARM-LABEL: cmp_or8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000251; ARM: ldrb r0, [r0]
252; ARM-NEXT: ldrb r1, [r1]
253; ARM-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000254; ARM-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000255; ARM-NEXT: movweq r0, #1
256; ARM-NEXT: bx lr
257;
258; ARMEB-LABEL: cmp_or8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000259; ARMEB: ldrb r0, [r0, #1]
260; ARMEB-NEXT: ldrb r1, [r1, #3]
261; ARMEB-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000262; ARMEB-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000263; ARMEB-NEXT: movweq r0, #1
264; ARMEB-NEXT: bx lr
265;
266; THUMB1-LABEL: cmp_or8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000267; THUMB1: ldrb r0, [r0]
268; THUMB1-NEXT: ldrb r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000269; THUMB1-NEXT: orrs r2, r0
270; THUMB1-NEXT: movs r0, #1
271; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000272; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +0000273; THUMB1-NEXT: beq .LBB5_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000274; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000275; THUMB1-NEXT: mov r0, r1
276; THUMB1-NEXT: .LBB5_2: @ %entry
277; THUMB1-NEXT: bx lr
278;
279; THUMB2-LABEL: cmp_or8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000280; THUMB2: ldrb r0, [r0]
281; THUMB2-NEXT: ldrb r1, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000282; THUMB2-NEXT: orrs r0, r1
Sam Parker412a9912017-12-01 13:42:39 +0000283; THUMB2-NEXT: mov.w r0, #0
284; THUMB2-NEXT: it eq
285; THUMB2-NEXT: moveq r0, #1
286; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000287entry:
288 %0 = load i16, i16* %a, align 2
289 %conv = zext i16 %0 to i32
290 %1 = load i32, i32* %b, align 4
291 %or = or i32 %1, %conv
292 %and = and i32 %or, 255
293 %cmp = icmp eq i32 %and, 0
294 ret i1 %cmp
295}
296
297define arm_aapcscc zeroext i1 @cmp_or8_int_int(i32* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000298 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000299; ARM-LABEL: cmp_or8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000300; ARM: ldrb r0, [r0]
301; ARM-NEXT: ldrb r1, [r1]
302; ARM-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000303; ARM-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000304; ARM-NEXT: movweq r0, #1
305; ARM-NEXT: bx lr
306;
307; ARMEB-LABEL: cmp_or8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000308; ARMEB: ldrb r0, [r0, #3]
309; ARMEB-NEXT: ldrb r1, [r1, #3]
310; ARMEB-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000311; ARMEB-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000312; ARMEB-NEXT: movweq r0, #1
313; ARMEB-NEXT: bx lr
314;
315; THUMB1-LABEL: cmp_or8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000316; THUMB1: ldrb r0, [r0]
317; THUMB1-NEXT: ldrb r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000318; THUMB1-NEXT: orrs r2, r0
319; THUMB1-NEXT: movs r0, #1
320; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000321; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +0000322; THUMB1-NEXT: beq .LBB6_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000323; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000324; THUMB1-NEXT: mov r0, r1
325; THUMB1-NEXT: .LBB6_2: @ %entry
326; THUMB1-NEXT: bx lr
327;
328; THUMB2-LABEL: cmp_or8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000329; THUMB2: ldrb r0, [r0]
330; THUMB2-NEXT: ldrb r1, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000331; THUMB2-NEXT: orrs r0, r1
Sam Parker412a9912017-12-01 13:42:39 +0000332; THUMB2-NEXT: mov.w r0, #0
333; THUMB2-NEXT: it eq
334; THUMB2-NEXT: moveq r0, #1
335; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000336entry:
337 %0 = load i32, i32* %a, align 4
338 %1 = load i32, i32* %b, align 4
339 %or = or i32 %1, %0
340 %and = and i32 %or, 255
341 %cmp = icmp eq i32 %and, 0
342 ret i1 %cmp
343}
344
345define arm_aapcscc zeroext i1 @cmp_or16(i32* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000346 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000347; ARM-LABEL: cmp_or16:
Sam Parker00804ef2017-12-18 10:04:27 +0000348; ARM: ldrh r0, [r0]
349; ARM-NEXT: ldrh r1, [r1]
350; ARM-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000351; ARM-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000352; ARM-NEXT: movweq r0, #1
353; ARM-NEXT: bx lr
354;
355; ARMEB-LABEL: cmp_or16:
Sam Parker00804ef2017-12-18 10:04:27 +0000356; ARMEB: ldrh r0, [r0, #2]
357; ARMEB-NEXT: ldrh r1, [r1, #2]
358; ARMEB-NEXT: orrs r0, r1, r0
Sam Parker412a9912017-12-01 13:42:39 +0000359; ARMEB-NEXT: mov r0, #0
Sam Parker412a9912017-12-01 13:42:39 +0000360; ARMEB-NEXT: movweq r0, #1
361; ARMEB-NEXT: bx lr
362;
363; THUMB1-LABEL: cmp_or16:
Sam Parker00804ef2017-12-18 10:04:27 +0000364; THUMB1: ldrh r0, [r0]
365; THUMB1-NEXT: ldrh r2, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000366; THUMB1-NEXT: orrs r2, r0
367; THUMB1-NEXT: movs r0, #1
368; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000369; THUMB1-NEXT: cmp r2, #0
Sam Parker412a9912017-12-01 13:42:39 +0000370; THUMB1-NEXT: beq .LBB7_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000371; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000372; THUMB1-NEXT: mov r0, r1
373; THUMB1-NEXT: .LBB7_2: @ %entry
374; THUMB1-NEXT: bx lr
375;
376; THUMB2-LABEL: cmp_or16:
Sam Parker00804ef2017-12-18 10:04:27 +0000377; THUMB2: ldrh r0, [r0]
378; THUMB2-NEXT: ldrh r1, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000379; THUMB2-NEXT: orrs r0, r1
Sam Parker412a9912017-12-01 13:42:39 +0000380; THUMB2-NEXT: mov.w r0, #0
381; THUMB2-NEXT: it eq
382; THUMB2-NEXT: moveq r0, #1
383; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000384entry:
385 %0 = load i32, i32* %a, align 4
386 %1 = load i32, i32* %b, align 4
387 %or = or i32 %1, %0
388 %and = and i32 %or, 65535
389 %cmp = icmp eq i32 %and, 0
390 ret i1 %cmp
391}
392
393define arm_aapcscc zeroext i1 @cmp_and8_short_short(i16* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000394 i16* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000395; ARM-LABEL: cmp_and8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000396; ARM: ldrb r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000397; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000398; ARM-NEXT: ldrb r1, [r1]
399; ARM-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000400; ARM-NEXT: movweq r0, #1
401; ARM-NEXT: bx lr
402;
403; ARMEB-LABEL: cmp_and8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000404; ARMEB: ldrb r2, [r0, #1]
Sam Parker412a9912017-12-01 13:42:39 +0000405; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000406; ARMEB-NEXT: ldrb r1, [r1, #1]
407; ARMEB-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000408; ARMEB-NEXT: movweq r0, #1
409; ARMEB-NEXT: bx lr
410;
411; THUMB1-LABEL: cmp_and8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000412; THUMB1: ldrb r2, [r1]
413; THUMB1-NEXT: ldrb r3, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000414; THUMB1-NEXT: movs r0, #1
415; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000416; THUMB1-NEXT: tst r3, r2
Sam Parker412a9912017-12-01 13:42:39 +0000417; THUMB1-NEXT: beq .LBB8_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000418; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000419; THUMB1-NEXT: mov r0, r1
420; THUMB1-NEXT: .LBB8_2: @ %entry
421; THUMB1-NEXT: bx lr
422;
423; THUMB2-LABEL: cmp_and8_short_short:
Sam Parker00804ef2017-12-18 10:04:27 +0000424; THUMB2: ldrb r2, [r0]
425; THUMB2-NEXT: movs r0, #0
426; THUMB2-NEXT: ldrb r1, [r1]
427; THUMB2-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000428; THUMB2-NEXT: it eq
429; THUMB2-NEXT: moveq r0, #1
430; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000431entry:
432 %0 = load i16, i16* %a, align 2
433 %1 = load i16, i16* %b, align 2
434 %and3 = and i16 %0, 255
435 %2 = and i16 %and3, %1
436 %cmp = icmp eq i16 %2, 0
437 ret i1 %cmp
438}
439
440define arm_aapcscc zeroext i1 @cmp_and8_short_int(i16* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000441 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000442; ARM-LABEL: cmp_and8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000443; ARM: ldrb r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000444; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000445; ARM-NEXT: ldrb r1, [r1]
446; ARM-NEXT: tst r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000447; ARM-NEXT: movweq r0, #1
448; ARM-NEXT: bx lr
449;
450; ARMEB-LABEL: cmp_and8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000451; ARMEB: ldrb r2, [r0, #1]
Sam Parker412a9912017-12-01 13:42:39 +0000452; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000453; ARMEB-NEXT: ldrb r1, [r1, #3]
454; ARMEB-NEXT: tst r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000455; ARMEB-NEXT: movweq r0, #1
456; ARMEB-NEXT: bx lr
457;
458; THUMB1-LABEL: cmp_and8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000459; THUMB1: ldrb r2, [r0]
460; THUMB1-NEXT: ldrb r3, [r1]
Sam Parker412a9912017-12-01 13:42:39 +0000461; THUMB1-NEXT: movs r0, #1
462; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000463; THUMB1-NEXT: tst r3, r2
Sam Parker412a9912017-12-01 13:42:39 +0000464; THUMB1-NEXT: beq .LBB9_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000465; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000466; THUMB1-NEXT: mov r0, r1
467; THUMB1-NEXT: .LBB9_2: @ %entry
468; THUMB1-NEXT: bx lr
469;
470; THUMB2-LABEL: cmp_and8_short_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000471; THUMB2: ldrb r2, [r0]
472; THUMB2-NEXT: movs r0, #0
473; THUMB2-NEXT: ldrb r1, [r1]
474; THUMB2-NEXT: tst r1, r2
Sam Parker412a9912017-12-01 13:42:39 +0000475; THUMB2-NEXT: it eq
476; THUMB2-NEXT: moveq r0, #1
477; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000478entry:
479 %0 = load i16, i16* %a, align 2
480 %1 = load i32, i32* %b, align 4
481 %2 = and i16 %0, 255
482 %and = zext i16 %2 to i32
483 %and1 = and i32 %1, %and
484 %cmp = icmp eq i32 %and1, 0
485 ret i1 %cmp
486}
487
488define arm_aapcscc zeroext i1 @cmp_and8_int_int(i32* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000489 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000490; ARM-LABEL: cmp_and8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000491; ARM: ldrb r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000492; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000493; ARM-NEXT: ldrb r1, [r1]
494; ARM-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000495; ARM-NEXT: movweq r0, #1
496; ARM-NEXT: bx lr
497;
498; ARMEB-LABEL: cmp_and8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000499; ARMEB: ldrb r2, [r0, #3]
Sam Parker412a9912017-12-01 13:42:39 +0000500; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000501; ARMEB-NEXT: ldrb r1, [r1, #3]
502; ARMEB-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000503; ARMEB-NEXT: movweq r0, #1
504; ARMEB-NEXT: bx lr
505;
506; THUMB1-LABEL: cmp_and8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000507; THUMB1: ldrb r2, [r1]
508; THUMB1-NEXT: ldrb r3, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000509; THUMB1-NEXT: movs r0, #1
510; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000511; THUMB1-NEXT: tst r3, r2
Sam Parker412a9912017-12-01 13:42:39 +0000512; THUMB1-NEXT: beq .LBB10_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000513; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000514; THUMB1-NEXT: mov r0, r1
515; THUMB1-NEXT: .LBB10_2: @ %entry
516; THUMB1-NEXT: bx lr
517;
518; THUMB2-LABEL: cmp_and8_int_int:
Sam Parker00804ef2017-12-18 10:04:27 +0000519; THUMB2: ldrb r2, [r0]
520; THUMB2-NEXT: movs r0, #0
521; THUMB2-NEXT: ldrb r1, [r1]
522; THUMB2-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000523; THUMB2-NEXT: it eq
524; THUMB2-NEXT: moveq r0, #1
525; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000526entry:
527 %0 = load i32, i32* %a, align 4
528 %1 = load i32, i32* %b, align 4
529 %and = and i32 %0, 255
530 %and1 = and i32 %and, %1
531 %cmp = icmp eq i32 %and1, 0
532 ret i1 %cmp
533}
534
535define arm_aapcscc zeroext i1 @cmp_and16(i32* nocapture readonly %a,
Sam Parker00804ef2017-12-18 10:04:27 +0000536 i32* nocapture readonly %b) {
Sam Parker412a9912017-12-01 13:42:39 +0000537; ARM-LABEL: cmp_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000538; ARM: ldrh r2, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000539; ARM-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000540; ARM-NEXT: ldrh r1, [r1]
541; ARM-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000542; ARM-NEXT: movweq r0, #1
543; ARM-NEXT: bx lr
544;
545; ARMEB-LABEL: cmp_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000546; ARMEB: ldrh r2, [r0, #2]
Sam Parker412a9912017-12-01 13:42:39 +0000547; ARMEB-NEXT: mov r0, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000548; ARMEB-NEXT: ldrh r1, [r1, #2]
549; ARMEB-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000550; ARMEB-NEXT: movweq r0, #1
551; ARMEB-NEXT: bx lr
552;
553; THUMB1-LABEL: cmp_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000554; THUMB1: ldrh r2, [r1]
555; THUMB1-NEXT: ldrh r3, [r0]
Sam Parker412a9912017-12-01 13:42:39 +0000556; THUMB1-NEXT: movs r0, #1
557; THUMB1-NEXT: movs r1, #0
Sam Parker00804ef2017-12-18 10:04:27 +0000558; THUMB1-NEXT: tst r3, r2
Sam Parker412a9912017-12-01 13:42:39 +0000559; THUMB1-NEXT: beq .LBB11_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000560; THUMB1-NEXT: @ %bb.1: @ %entry
Sam Parker412a9912017-12-01 13:42:39 +0000561; THUMB1-NEXT: mov r0, r1
562; THUMB1-NEXT: .LBB11_2: @ %entry
563; THUMB1-NEXT: bx lr
564;
565; THUMB2-LABEL: cmp_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000566; THUMB2: ldrh r2, [r0]
567; THUMB2-NEXT: movs r0, #0
568; THUMB2-NEXT: ldrh r1, [r1]
569; THUMB2-NEXT: tst r2, r1
Sam Parker412a9912017-12-01 13:42:39 +0000570; THUMB2-NEXT: it eq
571; THUMB2-NEXT: moveq r0, #1
572; THUMB2-NEXT: bx lr
Sam Parker412a9912017-12-01 13:42:39 +0000573entry:
574 %0 = load i32, i32* %a, align 4
575 %1 = load i32, i32* %b, align 4
576 %and = and i32 %0, 65535
577 %and1 = and i32 %and, %1
578 %cmp = icmp eq i32 %and1, 0
579 ret i1 %cmp
580}
Sam Parker45b59502017-12-01 15:31:41 +0000581
582define arm_aapcscc i32 @add_and16(i32* nocapture readonly %a, i32 %y, i32 %z) {
583; ARM-LABEL: add_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000584; ARM: add r1, r1, r2
585; ARM-NEXT: ldrh r0, [r0]
586; ARM-NEXT: uxth r1, r1
Sam Parker45b59502017-12-01 15:31:41 +0000587; ARM-NEXT: orr r0, r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000588; ARM-NEXT: bx lr
589;
590; ARMEB-LABEL: add_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000591; ARMEB: add r1, r1, r2
592; ARMEB-NEXT: ldrh r0, [r0, #2]
593; ARMEB-NEXT: uxth r1, r1
Sam Parker45b59502017-12-01 15:31:41 +0000594; ARMEB-NEXT: orr r0, r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000595; ARMEB-NEXT: bx lr
596;
597; THUMB1-LABEL: add_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000598; THUMB1: adds r1, r1, r2
599; THUMB1-NEXT: uxth r1, r1
600; THUMB1-NEXT: ldrh r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000601; THUMB1-NEXT: orrs r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000602; THUMB1-NEXT: bx lr
603;
604; THUMB2-LABEL: add_and16:
Sam Parker00804ef2017-12-18 10:04:27 +0000605; THUMB2: add r1, r2
606; THUMB2-NEXT: ldrh r0, [r0]
607; THUMB2-NEXT: uxth r1, r1
Sam Parker45b59502017-12-01 15:31:41 +0000608; THUMB2-NEXT: orrs r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000609; THUMB2-NEXT: bx lr
610entry:
611 %x = load i32, i32* %a, align 4
612 %add = add i32 %y, %z
613 %or = or i32 %x, %add
614 %and = and i32 %or, 65535
615 ret i32 %and
616}
617
618define arm_aapcscc i32 @test1(i32* %a, i32* %b, i32 %x, i32 %y) {
619; ARM-LABEL: test1:
Sam Parker00804ef2017-12-18 10:04:27 +0000620; ARM: mul r2, r2, r3
621; ARM-NEXT: ldrh r1, [r1]
622; ARM-NEXT: ldrh r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000623; ARM-NEXT: eor r0, r0, r1
Sam Parker00804ef2017-12-18 10:04:27 +0000624; ARM-NEXT: uxth r1, r2
625; ARM-NEXT: orr r0, r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000626; ARM-NEXT: bx lr
627;
628; ARMEB-LABEL: test1:
Sam Parker00804ef2017-12-18 10:04:27 +0000629; ARMEB: mul r2, r2, r3
630; ARMEB-NEXT: ldrh r1, [r1, #2]
631; ARMEB-NEXT: ldrh r0, [r0, #2]
Sam Parker45b59502017-12-01 15:31:41 +0000632; ARMEB-NEXT: eor r0, r0, r1
Sam Parker00804ef2017-12-18 10:04:27 +0000633; ARMEB-NEXT: uxth r1, r2
634; ARMEB-NEXT: orr r0, r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000635; ARMEB-NEXT: bx lr
636;
637; THUMB1-LABEL: test1:
Sam Parker00804ef2017-12-18 10:04:27 +0000638; THUMB1: ldrh r1, [r1]
639; THUMB1-NEXT: ldrh r4, [r0]
640; THUMB1-NEXT: eors r4, r1
Sam Parker45b59502017-12-01 15:31:41 +0000641; THUMB1-NEXT: muls r2, r3, r2
Sam Parker00804ef2017-12-18 10:04:27 +0000642; THUMB1-NEXT: uxth r0, r2
643; THUMB1-NEXT: orrs r0, r4
644; THUMB1-NEXT: pop
Sam Parker45b59502017-12-01 15:31:41 +0000645;
646; THUMB2-LABEL: test1:
Sam Parker00804ef2017-12-18 10:04:27 +0000647; THUMB2: ldrh r1, [r1]
648; THUMB2-NEXT: ldrh r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000649; THUMB2-NEXT: eors r0, r1
Sam Parker00804ef2017-12-18 10:04:27 +0000650; THUMB2-NEXT: mul r1, r2, r3
651; THUMB2-NEXT: uxth r1, r1
652; THUMB2-NEXT: orrs r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000653; THUMB2-NEXT: bx lr
654entry:
655 %0 = load i32, i32* %a, align 4
656 %1 = load i32, i32* %b, align 4
657 %mul = mul i32 %x, %y
658 %xor = xor i32 %0, %1
659 %or = or i32 %xor, %mul
660 %and = and i32 %or, 65535
661 ret i32 %and
662}
663
664define arm_aapcscc i32 @test2(i32* %a, i32* %b, i32 %x, i32 %y) {
665; ARM-LABEL: test2:
Sam Parker00804ef2017-12-18 10:04:27 +0000666; ARM: ldr r1, [r1]
Sam Parker45b59502017-12-01 15:31:41 +0000667; ARM-NEXT: ldr r0, [r0]
668; ARM-NEXT: mul r1, r2, r1
669; ARM-NEXT: eor r0, r0, r3
670; ARM-NEXT: orr r0, r0, r1
671; ARM-NEXT: uxth r0, r0
672; ARM-NEXT: bx lr
673;
674; ARMEB-LABEL: test2:
Sam Parker00804ef2017-12-18 10:04:27 +0000675; ARMEB: ldr r1, [r1]
Sam Parker45b59502017-12-01 15:31:41 +0000676; ARMEB-NEXT: ldr r0, [r0]
677; ARMEB-NEXT: mul r1, r2, r1
678; ARMEB-NEXT: eor r0, r0, r3
679; ARMEB-NEXT: orr r0, r0, r1
680; ARMEB-NEXT: uxth r0, r0
681; ARMEB-NEXT: bx lr
682;
683; THUMB1-LABEL: test2:
Sam Parker00804ef2017-12-18 10:04:27 +0000684; THUMB1: ldr r1, [r1]
Sam Parker45b59502017-12-01 15:31:41 +0000685; THUMB1-NEXT: muls r1, r2, r1
686; THUMB1-NEXT: ldr r0, [r0]
687; THUMB1-NEXT: eors r0, r3
688; THUMB1-NEXT: orrs r0, r1
689; THUMB1-NEXT: uxth r0, r0
690; THUMB1-NEXT: bx lr
691;
692; THUMB2-LABEL: test2:
Sam Parker00804ef2017-12-18 10:04:27 +0000693; THUMB2: ldr r1, [r1]
Sam Parker45b59502017-12-01 15:31:41 +0000694; THUMB2-NEXT: ldr r0, [r0]
695; THUMB2-NEXT: muls r1, r2, r1
696; THUMB2-NEXT: eors r0, r3
697; THUMB2-NEXT: orrs r0, r1
698; THUMB2-NEXT: uxth r0, r0
699; THUMB2-NEXT: bx lr
700entry:
701 %0 = load i32, i32* %a, align 4
702 %1 = load i32, i32* %b, align 4
703 %mul = mul i32 %x, %1
704 %xor = xor i32 %0, %y
705 %or = or i32 %xor, %mul
706 %and = and i32 %or, 65535
707 ret i32 %and
708}
709
710define arm_aapcscc i32 @test3(i32* %a, i32* %b, i32 %x, i16* %y) {
711; ARM-LABEL: test3:
Sam Parker00804ef2017-12-18 10:04:27 +0000712; ARM: ldr r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000713; ARM-NEXT: mul r1, r2, r0
714; ARM-NEXT: ldrh r2, [r3]
715; ARM-NEXT: eor r0, r0, r2
716; ARM-NEXT: orr r0, r0, r1
717; ARM-NEXT: uxth r0, r0
718; ARM-NEXT: bx lr
719;
720; ARMEB-LABEL: test3:
Sam Parker00804ef2017-12-18 10:04:27 +0000721; ARMEB: ldr r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000722; ARMEB-NEXT: mul r1, r2, r0
723; ARMEB-NEXT: ldrh r2, [r3]
724; ARMEB-NEXT: eor r0, r0, r2
725; ARMEB-NEXT: orr r0, r0, r1
726; ARMEB-NEXT: uxth r0, r0
727; ARMEB-NEXT: bx lr
728;
729; THUMB1-LABEL: test3:
Sam Parker00804ef2017-12-18 10:04:27 +0000730; THUMB1: ldr r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000731; THUMB1-NEXT: muls r2, r0, r2
732; THUMB1-NEXT: ldrh r1, [r3]
733; THUMB1-NEXT: eors r1, r0
734; THUMB1-NEXT: orrs r1, r2
735; THUMB1-NEXT: uxth r0, r1
736; THUMB1-NEXT: bx lr
737;
738; THUMB2-LABEL: test3:
Sam Parker00804ef2017-12-18 10:04:27 +0000739; THUMB2: ldr r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000740; THUMB2-NEXT: mul r1, r2, r0
741; THUMB2-NEXT: ldrh r2, [r3]
742; THUMB2-NEXT: eors r0, r2
743; THUMB2-NEXT: orrs r0, r1
744; THUMB2-NEXT: uxth r0, r0
745; THUMB2-NEXT: bx lr
746entry:
747 %0 = load i32, i32* %a, align 4
748 %1 = load i16, i16* %y, align 4
749 %2 = zext i16 %1 to i32
750 %mul = mul i32 %x, %0
751 %xor = xor i32 %0, %2
752 %or = or i32 %xor, %mul
753 %and = and i32 %or, 65535
754 ret i32 %and
755}
756
757define arm_aapcscc i32 @test4(i32* %a, i32* %b, i32 %x, i32 %y) {
758; ARM-LABEL: test4:
Sam Parker00804ef2017-12-18 10:04:27 +0000759; ARM: mul r2, r2, r3
760; ARM-NEXT: ldrh r1, [r1]
761; ARM-NEXT: ldrh r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000762; ARM-NEXT: eor r0, r0, r1
Sam Parker00804ef2017-12-18 10:04:27 +0000763; ARM-NEXT: uxth r1, r2
764; ARM-NEXT: orr r0, r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000765; ARM-NEXT: bx lr
766;
767; ARMEB-LABEL: test4:
Sam Parker00804ef2017-12-18 10:04:27 +0000768; ARMEB: mul r2, r2, r3
769; ARMEB-NEXT: ldrh r1, [r1, #2]
770; ARMEB-NEXT: ldrh r0, [r0, #2]
Sam Parker45b59502017-12-01 15:31:41 +0000771; ARMEB-NEXT: eor r0, r0, r1
Sam Parker00804ef2017-12-18 10:04:27 +0000772; ARMEB-NEXT: uxth r1, r2
773; ARMEB-NEXT: orr r0, r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000774; ARMEB-NEXT: bx lr
775;
776; THUMB1-LABEL: test4:
Sam Parker00804ef2017-12-18 10:04:27 +0000777; THUMB1: ldrh r1, [r1]
778; THUMB1-NEXT: ldrh r4, [r0]
779; THUMB1-NEXT: eors r4, r1
Sam Parker45b59502017-12-01 15:31:41 +0000780; THUMB1-NEXT: muls r2, r3, r2
Sam Parker00804ef2017-12-18 10:04:27 +0000781; THUMB1-NEXT: uxth r0, r2
782; THUMB1-NEXT: orrs r0, r4
783; THUMB1-NEXT: pop
Sam Parker45b59502017-12-01 15:31:41 +0000784;
785; THUMB2-LABEL: test4:
Sam Parker00804ef2017-12-18 10:04:27 +0000786; THUMB2: ldrh r1, [r1]
787; THUMB2-NEXT: ldrh r0, [r0]
Sam Parker45b59502017-12-01 15:31:41 +0000788; THUMB2-NEXT: eors r0, r1
Sam Parker00804ef2017-12-18 10:04:27 +0000789; THUMB2-NEXT: mul r1, r2, r3
790; THUMB2-NEXT: uxth r1, r1
791; THUMB2-NEXT: orrs r0, r1
Sam Parker45b59502017-12-01 15:31:41 +0000792; THUMB2-NEXT: bx lr
793entry:
794 %0 = load i32, i32* %a, align 4
795 %1 = load i32, i32* %b, align 4
796 %mul = mul i32 %x, %y
797 %xor = xor i32 %0, %1
798 %or = or i32 %xor, %mul
799 %and = and i32 %or, 65535
800 ret i32 %and
801}
Sam Parker987b2c92017-12-04 15:14:59 +0000802
803define arm_aapcscc i32 @test5(i32* %a, i32* %b, i32 %x, i16 zeroext %y) {
804; ARM-LABEL: test5:
Sam Parker00804ef2017-12-18 10:04:27 +0000805; ARM: ldr r1, [r1]
806; ARM-NEXT: ldrh r0, [r0]
Sam Parker987b2c92017-12-04 15:14:59 +0000807; ARM-NEXT: mul r1, r2, r1
808; ARM-NEXT: eor r0, r0, r3
Sam Parker00804ef2017-12-18 10:04:27 +0000809; ARM-NEXT: uxth r1, r1
Sam Parker987b2c92017-12-04 15:14:59 +0000810; ARM-NEXT: orr r0, r0, r1
Sam Parker987b2c92017-12-04 15:14:59 +0000811; ARM-NEXT: bx lr
812;
813; ARMEB-LABEL: test5:
Sam Parker00804ef2017-12-18 10:04:27 +0000814; ARMEB: ldr r1, [r1]
815; ARMEB-NEXT: ldrh r0, [r0, #2]
Sam Parker987b2c92017-12-04 15:14:59 +0000816; ARMEB-NEXT: mul r1, r2, r1
817; ARMEB-NEXT: eor r0, r0, r3
Sam Parker00804ef2017-12-18 10:04:27 +0000818; ARMEB-NEXT: uxth r1, r1
Sam Parker987b2c92017-12-04 15:14:59 +0000819; ARMEB-NEXT: orr r0, r0, r1
Sam Parker987b2c92017-12-04 15:14:59 +0000820; ARMEB-NEXT: bx lr
821;
822; THUMB1-LABEL: test5:
Sam Parker00804ef2017-12-18 10:04:27 +0000823; THUMB1: ldrh r4, [r0]
824; THUMB1-NEXT: eors r4, r3
825; THUMB1-NEXT: ldr r0, [r1]
826; THUMB1-NEXT: muls r0, r2, r0
Sam Parker987b2c92017-12-04 15:14:59 +0000827; THUMB1-NEXT: uxth r0, r0
Sam Parker00804ef2017-12-18 10:04:27 +0000828; THUMB1-NEXT: orrs r0, r4
829; THUMB1-NEXT: pop
Sam Parker987b2c92017-12-04 15:14:59 +0000830;
831; THUMB2-LABEL: test5:
Sam Parker00804ef2017-12-18 10:04:27 +0000832; THUMB2: ldr r1, [r1]
833; THUMB2-NEXT: ldrh r0, [r0]
Sam Parker987b2c92017-12-04 15:14:59 +0000834; THUMB2-NEXT: muls r1, r2, r1
835; THUMB2-NEXT: eors r0, r3
Sam Parker00804ef2017-12-18 10:04:27 +0000836; THUMB2-NEXT: uxth r1, r1
Sam Parker987b2c92017-12-04 15:14:59 +0000837; THUMB2-NEXT: orrs r0, r1
Sam Parker987b2c92017-12-04 15:14:59 +0000838; THUMB2-NEXT: bx lr
839entry:
840 %0 = load i32, i32* %a, align 4
841 %1 = load i32, i32* %b, align 4
842 %mul = mul i32 %x, %1
843 %ext = zext i16 %y to i32
844 %xor = xor i32 %0, %ext
845 %or = or i32 %xor, %mul
846 %and = and i32 %or, 65535
847 ret i32 %and
848}
Sam Parker18b0d1e2017-12-15 15:30:39 +0000849
850define arm_aapcscc i1 @test6(i8* %x, i8 %y, i8 %z) {
851; ARM-LABEL: test6:
852; ARM: @ %bb.0: @ %entry
853; ARM-NEXT: ldrb r0, [r0]
854; ARM-NEXT: uxtb r2, r2
855; ARM-NEXT: and r0, r0, r1
856; ARM-NEXT: uxtb r1, r0
857; ARM-NEXT: mov r0, #0
858; ARM-NEXT: cmp r1, r2
859; ARM-NEXT: movweq r0, #1
860; ARM-NEXT: bx lr
861;
862; ARMEB-LABEL: test6:
863; ARMEB: @ %bb.0: @ %entry
864; ARMEB-NEXT: ldrb r0, [r0]
865; ARMEB-NEXT: uxtb r2, r2
866; ARMEB-NEXT: and r0, r0, r1
867; ARMEB-NEXT: uxtb r1, r0
868; ARMEB-NEXT: mov r0, #0
869; ARMEB-NEXT: cmp r1, r2
870; ARMEB-NEXT: movweq r0, #1
871; ARMEB-NEXT: bx lr
872;
873; THUMB1-LABEL: test6:
874; THUMB1: @ %bb.0: @ %entry
875; THUMB1-NEXT: ldrb r0, [r0]
876; THUMB1-NEXT: ands r0, r1
877; THUMB1-NEXT: uxtb r3, r0
878; THUMB1-NEXT: uxtb r2, r2
879; THUMB1-NEXT: movs r0, #1
880; THUMB1-NEXT: movs r1, #0
881; THUMB1-NEXT: cmp r3, r2
882; THUMB1-NEXT: beq .LBB18_2
883; THUMB1-NEXT: @ %bb.1: @ %entry
884; THUMB1-NEXT: mov r0, r1
885; THUMB1-NEXT: .LBB18_2: @ %entry
886; THUMB1-NEXT: bx lr
887;
888; THUMB2-LABEL: test6:
889; THUMB2: @ %bb.0: @ %entry
890; THUMB2-NEXT: ldrb r0, [r0]
891; THUMB2-NEXT: uxtb r2, r2
892; THUMB2-NEXT: ands r0, r1
893; THUMB2-NEXT: uxtb r1, r0
894; THUMB2-NEXT: movs r0, #0
895; THUMB2-NEXT: cmp r1, r2
896; THUMB2-NEXT: it eq
897; THUMB2-NEXT: moveq r0, #1
898; THUMB2-NEXT: bx lr
899entry:
900 %0 = load i8, i8* %x, align 4
901 %1 = and i8 %0, %y
902 %2 = icmp eq i8 %1, %z
903 ret i1 %2
904}
905
906define arm_aapcscc i1 @test7(i16* %x, i16 %y, i8 %z) {
907; ARM-LABEL: test7:
908; ARM: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000909; ARM-NEXT: ldrb r0, [r0]
Sam Parker18b0d1e2017-12-15 15:30:39 +0000910; ARM-NEXT: uxtb r2, r2
Sam Parker00804ef2017-12-18 10:04:27 +0000911; ARM-NEXT: and r1, r0, r1
Sam Parker18b0d1e2017-12-15 15:30:39 +0000912; ARM-NEXT: mov r0, #0
913; ARM-NEXT: cmp r1, r2
914; ARM-NEXT: movweq r0, #1
915; ARM-NEXT: bx lr
916;
917; ARMEB-LABEL: test7:
918; ARMEB: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000919; ARMEB-NEXT: ldrb r0, [r0, #1]
Sam Parker18b0d1e2017-12-15 15:30:39 +0000920; ARMEB-NEXT: uxtb r2, r2
Sam Parker00804ef2017-12-18 10:04:27 +0000921; ARMEB-NEXT: and r1, r0, r1
Sam Parker18b0d1e2017-12-15 15:30:39 +0000922; ARMEB-NEXT: mov r0, #0
923; ARMEB-NEXT: cmp r1, r2
924; ARMEB-NEXT: movweq r0, #1
925; ARMEB-NEXT: bx lr
926;
927; THUMB1-LABEL: test7:
928; THUMB1: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000929; THUMB1-NEXT: ldrb r3, [r0]
930; THUMB1-NEXT: ands r3, r1
Sam Parker18b0d1e2017-12-15 15:30:39 +0000931; THUMB1-NEXT: uxtb r2, r2
932; THUMB1-NEXT: movs r0, #1
933; THUMB1-NEXT: movs r1, #0
934; THUMB1-NEXT: cmp r3, r2
935; THUMB1-NEXT: beq .LBB19_2
936; THUMB1-NEXT: @ %bb.1: @ %entry
937; THUMB1-NEXT: mov r0, r1
938; THUMB1-NEXT: .LBB19_2: @ %entry
939; THUMB1-NEXT: bx lr
940;
941; THUMB2-LABEL: test7:
942; THUMB2: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000943; THUMB2-NEXT: ldrb r0, [r0]
Sam Parker18b0d1e2017-12-15 15:30:39 +0000944; THUMB2-NEXT: uxtb r2, r2
Sam Parker00804ef2017-12-18 10:04:27 +0000945; THUMB2-NEXT: ands r1, r0
Sam Parker18b0d1e2017-12-15 15:30:39 +0000946; THUMB2-NEXT: movs r0, #0
947; THUMB2-NEXT: cmp r1, r2
948; THUMB2-NEXT: it eq
949; THUMB2-NEXT: moveq r0, #1
950; THUMB2-NEXT: bx lr
951entry:
952 %0 = load i16, i16* %x, align 4
953 %1 = and i16 %0, %y
954 %2 = trunc i16 %1 to i8
955 %3 = icmp eq i8 %2, %z
956 ret i1 %3
957}
958
959define arm_aapcscc void @test8(i32* nocapture %p) {
960; ARM-LABEL: test8:
961; ARM: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000962; ARM-NEXT: ldrb r1, [r0]
963; ARM-NEXT: eor r1, r1, #255
Sam Parker18b0d1e2017-12-15 15:30:39 +0000964; ARM-NEXT: str r1, [r0]
965; ARM-NEXT: bx lr
966;
967; ARMEB-LABEL: test8:
968; ARMEB: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000969; ARMEB-NEXT: ldrb r1, [r0, #3]
970; ARMEB-NEXT: eor r1, r1, #255
Sam Parker18b0d1e2017-12-15 15:30:39 +0000971; ARMEB-NEXT: str r1, [r0]
972; ARMEB-NEXT: bx lr
973;
974; THUMB1-LABEL: test8:
975; THUMB1: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000976; THUMB1-NEXT: ldrb r1, [r0]
Sam Parker18b0d1e2017-12-15 15:30:39 +0000977; THUMB1-NEXT: movs r2, #255
Sam Parker00804ef2017-12-18 10:04:27 +0000978; THUMB1-NEXT: eors r2, r1
Sam Parker18b0d1e2017-12-15 15:30:39 +0000979; THUMB1-NEXT: str r2, [r0]
980; THUMB1-NEXT: bx lr
981;
982; THUMB2-LABEL: test8:
983; THUMB2: @ %bb.0: @ %entry
Sam Parker00804ef2017-12-18 10:04:27 +0000984; THUMB2-NEXT: ldrb r1, [r0]
985; THUMB2-NEXT: eor r1, r1, #255
Sam Parker18b0d1e2017-12-15 15:30:39 +0000986; THUMB2-NEXT: str r1, [r0]
987; THUMB2-NEXT: bx lr
988entry:
989 %0 = load i32, i32* %p, align 4
990 %neg = and i32 %0, 255
991 %and = xor i32 %neg, 255
992 store i32 %and, i32* %p, align 4
993 ret void
994}
Sam Parker00804ef2017-12-18 10:04:27 +0000995
996define arm_aapcscc void @test9(i32* nocapture %p) {
997; ARM-LABEL: test9:
998; ARM: @ %bb.0: @ %entry
999; ARM-NEXT: ldrb r1, [r0]
1000; ARM-NEXT: eor r1, r1, #255
1001; ARM-NEXT: str r1, [r0]
1002; ARM-NEXT: bx lr
1003;
1004; ARMEB-LABEL: test9:
1005; ARMEB: @ %bb.0: @ %entry
1006; ARMEB-NEXT: ldrb r1, [r0, #3]
1007; ARMEB-NEXT: eor r1, r1, #255
1008; ARMEB-NEXT: str r1, [r0]
1009; ARMEB-NEXT: bx lr
1010;
1011; THUMB1-LABEL: test9:
1012; THUMB1: @ %bb.0: @ %entry
1013; THUMB1-NEXT: ldrb r1, [r0]
1014; THUMB1-NEXT: movs r2, #255
1015; THUMB1-NEXT: eors r2, r1
1016; THUMB1-NEXT: str r2, [r0]
1017; THUMB1-NEXT: bx lr
1018;
1019; THUMB2-LABEL: test9:
1020; THUMB2: @ %bb.0: @ %entry
1021; THUMB2-NEXT: ldrb r1, [r0]
1022; THUMB2-NEXT: eor r1, r1, #255
1023; THUMB2-NEXT: str r1, [r0]
1024; THUMB2-NEXT: bx lr
1025entry:
1026 %0 = load i32, i32* %p, align 4
1027 %neg = xor i32 %0, -1
1028 %and = and i32 %neg, 255
1029 store i32 %and, i32* %p, align 4
1030 ret void
1031}
1032
1033; ARM-LABEL: test10:
1034; ARM: @ %bb.0: @ %entry
1035; ARM-NEXT: ldrb r1, [r0]
1036; ARM-NEXT: eor r1, r1, #255
1037; ARM-NEXT: str r1, [r0]
1038; ARM-NEXT: bx lr
1039;
1040; ARMEB-LABEL: test10:
1041; ARMEB: @ %bb.0: @ %entry
1042; ARMEB-NEXT: ldrb r1, [r0, #3]
1043; ARMEB-NEXT: eor r1, r1, #255
1044; ARMEB-NEXT: str r1, [r0]
1045; ARMEB-NEXT: bx lr
1046;
1047; THUMB1-LABEL: test10:
1048; THUMB1: @ %bb.0: @ %entry
1049; THUMB1-NEXT: ldrb r1, [r0]
1050; THUMB1-NEXT: movs r2, #255
1051; THUMB1-NEXT: eors r2, r1
1052; THUMB1-NEXT: str r2, [r0]
1053; THUMB1-NEXT: bx lr
1054;
1055; THUMB2-LABEL: test10:
1056; THUMB2: @ %bb.0: @ %entry
1057; THUMB2-NEXT: ldrb r1, [r0]
1058; THUMB2-NEXT: eor r1, r1, #255
1059; THUMB2-NEXT: str r1, [r0]
1060; THUMB2-NEXT: bx lr
1061define arm_aapcscc void @test10(i32* nocapture %p) {
1062entry:
1063 %0 = load i32, i32* %p, align 4
1064 %neg = and i32 %0, 255
1065 %and = xor i32 %neg, 255
1066 store i32 %and, i32* %p, align 4
1067 ret void
1068}
1069