xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-int-log.ll (revision 8e0cd7382adacd8bc1741dc26bc0be6bdf8e238a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible  < %s | FileCheck %s
3; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s
4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
5
6target triple = "aarch64-unknown-linux-gnu"
7
8;
9; AND
10;
11
12define <8 x i8> @and_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
13; CHECK-LABEL: and_v8i8:
14; CHECK:       // %bb.0:
15; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
16; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
17; CHECK-NEXT:    and z0.d, z0.d, z1.d
18; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
19; CHECK-NEXT:    ret
20;
21; NONEON-NOSVE-LABEL: and_v8i8:
22; NONEON-NOSVE:       // %bb.0:
23; NONEON-NOSVE-NEXT:    sub sp, sp, #32
24; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
25; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
26; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
27; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
28; NONEON-NOSVE-NEXT:    and w8, w9, w8
29; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
30; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
31; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
32; NONEON-NOSVE-NEXT:    and w8, w9, w8
33; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
34; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
35; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
36; NONEON-NOSVE-NEXT:    and w8, w9, w8
37; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
38; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
39; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
40; NONEON-NOSVE-NEXT:    and w8, w9, w8
41; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
42; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
43; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
44; NONEON-NOSVE-NEXT:    and w8, w9, w8
45; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
46; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
47; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
48; NONEON-NOSVE-NEXT:    and w8, w9, w8
49; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
50; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
51; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
52; NONEON-NOSVE-NEXT:    and w8, w9, w8
53; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
54; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
55; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
56; NONEON-NOSVE-NEXT:    and w8, w9, w8
57; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
58; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
59; NONEON-NOSVE-NEXT:    add sp, sp, #32
60; NONEON-NOSVE-NEXT:    ret
61  %res = and <8 x i8> %op1, %op2
62  ret <8 x i8> %res
63}
64
65define <16 x i8> @and_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
66; CHECK-LABEL: and_v16i8:
67; CHECK:       // %bb.0:
68; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
69; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
70; CHECK-NEXT:    and z0.d, z0.d, z1.d
71; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
72; CHECK-NEXT:    ret
73;
74; NONEON-NOSVE-LABEL: and_v16i8:
75; NONEON-NOSVE:       // %bb.0:
76; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
77; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
78; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
79; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
80; NONEON-NOSVE-NEXT:    and w8, w9, w8
81; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
82; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
83; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
84; NONEON-NOSVE-NEXT:    and w8, w9, w8
85; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
86; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
87; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
88; NONEON-NOSVE-NEXT:    and w8, w9, w8
89; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
90; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
91; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
92; NONEON-NOSVE-NEXT:    and w8, w9, w8
93; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
94; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
95; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
96; NONEON-NOSVE-NEXT:    and w8, w9, w8
97; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
98; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
99; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
100; NONEON-NOSVE-NEXT:    and w8, w9, w8
101; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
102; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
103; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
104; NONEON-NOSVE-NEXT:    and w8, w9, w8
105; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
106; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
107; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
108; NONEON-NOSVE-NEXT:    and w8, w9, w8
109; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
110; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
111; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
112; NONEON-NOSVE-NEXT:    and w8, w9, w8
113; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
114; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
115; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
116; NONEON-NOSVE-NEXT:    and w8, w9, w8
117; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
118; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
119; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
120; NONEON-NOSVE-NEXT:    and w8, w9, w8
121; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
122; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
123; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
124; NONEON-NOSVE-NEXT:    and w8, w9, w8
125; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
126; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
127; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
128; NONEON-NOSVE-NEXT:    and w8, w9, w8
129; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
130; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
131; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
132; NONEON-NOSVE-NEXT:    and w8, w9, w8
133; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
134; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
135; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
136; NONEON-NOSVE-NEXT:    and w8, w9, w8
137; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
138; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
139; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
140; NONEON-NOSVE-NEXT:    and w8, w9, w8
141; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
142; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
143; NONEON-NOSVE-NEXT:    add sp, sp, #48
144; NONEON-NOSVE-NEXT:    ret
145  %res = and <16 x i8> %op1, %op2
146  ret <16 x i8> %res
147}
148
149define void @and_v32i8(ptr %a, ptr %b) {
150; CHECK-LABEL: and_v32i8:
151; CHECK:       // %bb.0:
152; CHECK-NEXT:    ldp q0, q3, [x1]
153; CHECK-NEXT:    ldp q1, q2, [x0]
154; CHECK-NEXT:    and z0.d, z1.d, z0.d
155; CHECK-NEXT:    and z1.d, z2.d, z3.d
156; CHECK-NEXT:    stp q0, q1, [x0]
157; CHECK-NEXT:    ret
158;
159; NONEON-NOSVE-LABEL: and_v32i8:
160; NONEON-NOSVE:       // %bb.0:
161; NONEON-NOSVE-NEXT:    sub sp, sp, #96
162; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
163; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
164; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
165; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
166; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
167; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
168; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
169; NONEON-NOSVE-NEXT:    and w8, w9, w8
170; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
171; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
172; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
173; NONEON-NOSVE-NEXT:    and w8, w9, w8
174; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
175; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
176; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
177; NONEON-NOSVE-NEXT:    and w8, w9, w8
178; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
179; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
180; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
181; NONEON-NOSVE-NEXT:    and w8, w9, w8
182; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
183; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
184; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
185; NONEON-NOSVE-NEXT:    and w8, w9, w8
186; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
187; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
188; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
189; NONEON-NOSVE-NEXT:    and w8, w9, w8
190; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
191; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
192; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
193; NONEON-NOSVE-NEXT:    and w8, w9, w8
194; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
195; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
196; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
197; NONEON-NOSVE-NEXT:    and w8, w9, w8
198; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
199; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
200; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
201; NONEON-NOSVE-NEXT:    and w8, w9, w8
202; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
203; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
204; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
205; NONEON-NOSVE-NEXT:    and w8, w9, w8
206; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
207; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
208; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
209; NONEON-NOSVE-NEXT:    and w8, w9, w8
210; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
211; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
212; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
213; NONEON-NOSVE-NEXT:    and w8, w9, w8
214; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
215; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
216; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
217; NONEON-NOSVE-NEXT:    and w8, w9, w8
218; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
219; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
220; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
221; NONEON-NOSVE-NEXT:    and w8, w9, w8
222; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
223; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
224; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
225; NONEON-NOSVE-NEXT:    and w8, w9, w8
226; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
227; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
228; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
229; NONEON-NOSVE-NEXT:    and w8, w9, w8
230; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
231; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
232; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
233; NONEON-NOSVE-NEXT:    and w8, w9, w8
234; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
235; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
236; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
237; NONEON-NOSVE-NEXT:    and w8, w9, w8
238; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
239; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
240; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
241; NONEON-NOSVE-NEXT:    and w8, w9, w8
242; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
243; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
244; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
245; NONEON-NOSVE-NEXT:    and w8, w9, w8
246; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
247; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
248; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
249; NONEON-NOSVE-NEXT:    and w8, w9, w8
250; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
251; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
252; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
253; NONEON-NOSVE-NEXT:    and w8, w9, w8
254; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
255; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
256; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
257; NONEON-NOSVE-NEXT:    and w8, w9, w8
258; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
259; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
260; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
261; NONEON-NOSVE-NEXT:    and w8, w9, w8
262; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
263; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
264; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
265; NONEON-NOSVE-NEXT:    and w8, w9, w8
266; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
267; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
268; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
269; NONEON-NOSVE-NEXT:    and w8, w9, w8
270; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
271; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
272; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
273; NONEON-NOSVE-NEXT:    and w8, w9, w8
274; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
275; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
276; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
277; NONEON-NOSVE-NEXT:    and w8, w9, w8
278; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
279; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
280; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
281; NONEON-NOSVE-NEXT:    and w8, w9, w8
282; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
283; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
284; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
285; NONEON-NOSVE-NEXT:    and w8, w9, w8
286; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
287; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
288; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
289; NONEON-NOSVE-NEXT:    and w8, w9, w8
290; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
291; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
292; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
293; NONEON-NOSVE-NEXT:    and w8, w9, w8
294; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
295; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
296; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
297; NONEON-NOSVE-NEXT:    add sp, sp, #96
298; NONEON-NOSVE-NEXT:    ret
299  %op1 = load <32 x i8>, ptr %a
300  %op2 = load <32 x i8>, ptr %b
301  %res = and <32 x i8> %op1, %op2
302  store <32 x i8> %res, ptr %a
303  ret void
304}
305
306define <4 x i16> @and_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
307; CHECK-LABEL: and_v4i16:
308; CHECK:       // %bb.0:
309; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
310; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
311; CHECK-NEXT:    and z0.d, z0.d, z1.d
312; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
313; CHECK-NEXT:    ret
314;
315; NONEON-NOSVE-LABEL: and_v4i16:
316; NONEON-NOSVE:       // %bb.0:
317; NONEON-NOSVE-NEXT:    sub sp, sp, #32
318; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
319; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
320; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
321; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
322; NONEON-NOSVE-NEXT:    and w8, w9, w8
323; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
324; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
325; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
326; NONEON-NOSVE-NEXT:    and w8, w9, w8
327; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
328; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
329; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
330; NONEON-NOSVE-NEXT:    and w8, w9, w8
331; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
332; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
333; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
334; NONEON-NOSVE-NEXT:    and w8, w9, w8
335; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
336; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
337; NONEON-NOSVE-NEXT:    add sp, sp, #32
338; NONEON-NOSVE-NEXT:    ret
339  %res = and <4 x i16> %op1, %op2
340  ret <4 x i16> %res
341}
342
343define <8 x i16> @and_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
344; CHECK-LABEL: and_v8i16:
345; CHECK:       // %bb.0:
346; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
347; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
348; CHECK-NEXT:    and z0.d, z0.d, z1.d
349; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
350; CHECK-NEXT:    ret
351;
352; NONEON-NOSVE-LABEL: and_v8i16:
353; NONEON-NOSVE:       // %bb.0:
354; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
355; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
356; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
357; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
358; NONEON-NOSVE-NEXT:    and w8, w9, w8
359; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
360; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
361; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
362; NONEON-NOSVE-NEXT:    and w8, w9, w8
363; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
364; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
365; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
366; NONEON-NOSVE-NEXT:    and w8, w9, w8
367; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
368; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
369; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
370; NONEON-NOSVE-NEXT:    and w8, w9, w8
371; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
372; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
373; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
374; NONEON-NOSVE-NEXT:    and w8, w9, w8
375; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
376; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
377; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
378; NONEON-NOSVE-NEXT:    and w8, w9, w8
379; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
380; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
381; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
382; NONEON-NOSVE-NEXT:    and w8, w9, w8
383; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
384; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
385; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
386; NONEON-NOSVE-NEXT:    and w8, w9, w8
387; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
388; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
389; NONEON-NOSVE-NEXT:    add sp, sp, #48
390; NONEON-NOSVE-NEXT:    ret
391  %res = and <8 x i16> %op1, %op2
392  ret <8 x i16> %res
393}
394
395define void @and_v16i16(ptr %a, ptr %b) {
396; CHECK-LABEL: and_v16i16:
397; CHECK:       // %bb.0:
398; CHECK-NEXT:    ldp q0, q3, [x1]
399; CHECK-NEXT:    ldp q1, q2, [x0]
400; CHECK-NEXT:    and z0.d, z1.d, z0.d
401; CHECK-NEXT:    and z1.d, z2.d, z3.d
402; CHECK-NEXT:    stp q0, q1, [x0]
403; CHECK-NEXT:    ret
404;
405; NONEON-NOSVE-LABEL: and_v16i16:
406; NONEON-NOSVE:       // %bb.0:
407; NONEON-NOSVE-NEXT:    sub sp, sp, #96
408; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
409; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
410; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
411; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
412; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
413; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
414; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
415; NONEON-NOSVE-NEXT:    and w8, w9, w8
416; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]
417; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
418; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
419; NONEON-NOSVE-NEXT:    and w8, w9, w8
420; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
421; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
422; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
423; NONEON-NOSVE-NEXT:    and w8, w9, w8
424; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]
425; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
426; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
427; NONEON-NOSVE-NEXT:    and w8, w9, w8
428; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]
429; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
430; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
431; NONEON-NOSVE-NEXT:    and w8, w9, w8
432; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]
433; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
434; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
435; NONEON-NOSVE-NEXT:    and w8, w9, w8
436; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]
437; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
438; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
439; NONEON-NOSVE-NEXT:    and w8, w9, w8
440; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
441; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
442; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
443; NONEON-NOSVE-NEXT:    and w8, w9, w8
444; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
445; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
446; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
447; NONEON-NOSVE-NEXT:    and w8, w9, w8
448; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
449; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
450; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
451; NONEON-NOSVE-NEXT:    and w8, w9, w8
452; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
453; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
454; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
455; NONEON-NOSVE-NEXT:    and w8, w9, w8
456; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
457; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
458; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
459; NONEON-NOSVE-NEXT:    and w8, w9, w8
460; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
461; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
462; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
463; NONEON-NOSVE-NEXT:    and w8, w9, w8
464; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
465; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
466; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
467; NONEON-NOSVE-NEXT:    and w8, w9, w8
468; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
469; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
470; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
471; NONEON-NOSVE-NEXT:    and w8, w9, w8
472; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
473; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
474; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
475; NONEON-NOSVE-NEXT:    and w8, w9, w8
476; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
477; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
478; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
479; NONEON-NOSVE-NEXT:    add sp, sp, #96
480; NONEON-NOSVE-NEXT:    ret
481  %op1 = load <16 x i16>, ptr %a
482  %op2 = load <16 x i16>, ptr %b
483  %res = and <16 x i16> %op1, %op2
484  store <16 x i16> %res, ptr %a
485  ret void
486}
487
488define <2 x i32> @and_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
489; CHECK-LABEL: and_v2i32:
490; CHECK:       // %bb.0:
491; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
492; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
493; CHECK-NEXT:    and z0.d, z0.d, z1.d
494; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
495; CHECK-NEXT:    ret
496;
497; NONEON-NOSVE-LABEL: and_v2i32:
498; NONEON-NOSVE:       // %bb.0:
499; NONEON-NOSVE-NEXT:    sub sp, sp, #32
500; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
501; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
502; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
503; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
504; NONEON-NOSVE-NEXT:    and w8, w10, w8
505; NONEON-NOSVE-NEXT:    str w8, [sp, #28]
506; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
507; NONEON-NOSVE-NEXT:    and w8, w9, w8
508; NONEON-NOSVE-NEXT:    str w8, [sp, #24]
509; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
510; NONEON-NOSVE-NEXT:    add sp, sp, #32
511; NONEON-NOSVE-NEXT:    ret
512  %res = and <2 x i32> %op1, %op2
513  ret <2 x i32> %res
514}
515
516define <4 x i32> @and_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
517; CHECK-LABEL: and_v4i32:
518; CHECK:       // %bb.0:
519; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
520; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
521; CHECK-NEXT:    and z0.d, z0.d, z1.d
522; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
523; CHECK-NEXT:    ret
524;
525; NONEON-NOSVE-LABEL: and_v4i32:
526; NONEON-NOSVE:       // %bb.0:
527; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
528; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
529; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
530; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
531; NONEON-NOSVE-NEXT:    and w8, w10, w8
532; NONEON-NOSVE-NEXT:    str w8, [sp, #44]
533; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
534; NONEON-NOSVE-NEXT:    and w8, w9, w8
535; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
536; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
537; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
538; NONEON-NOSVE-NEXT:    and w8, w10, w8
539; NONEON-NOSVE-NEXT:    str w8, [sp, #36]
540; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
541; NONEON-NOSVE-NEXT:    and w8, w9, w8
542; NONEON-NOSVE-NEXT:    str w8, [sp, #32]
543; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
544; NONEON-NOSVE-NEXT:    add sp, sp, #48
545; NONEON-NOSVE-NEXT:    ret
546  %res = and <4 x i32> %op1, %op2
547  ret <4 x i32> %res
548}
549
550define void @and_v8i32(ptr %a, ptr %b) {
551; CHECK-LABEL: and_v8i32:
552; CHECK:       // %bb.0:
553; CHECK-NEXT:    ldp q0, q3, [x1]
554; CHECK-NEXT:    ldp q1, q2, [x0]
555; CHECK-NEXT:    and z0.d, z1.d, z0.d
556; CHECK-NEXT:    and z1.d, z2.d, z3.d
557; CHECK-NEXT:    stp q0, q1, [x0]
558; CHECK-NEXT:    ret
559;
560; NONEON-NOSVE-LABEL: and_v8i32:
561; NONEON-NOSVE:       // %bb.0:
562; NONEON-NOSVE-NEXT:    sub sp, sp, #96
563; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
564; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
565; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
566; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
567; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
568; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
569; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
570; NONEON-NOSVE-NEXT:    and w8, w10, w8
571; NONEON-NOSVE-NEXT:    str w8, [sp, #92]
572; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
573; NONEON-NOSVE-NEXT:    and w8, w9, w8
574; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
575; NONEON-NOSVE-NEXT:    str w8, [sp, #88]
576; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
577; NONEON-NOSVE-NEXT:    and w8, w10, w8
578; NONEON-NOSVE-NEXT:    str w8, [sp, #84]
579; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
580; NONEON-NOSVE-NEXT:    and w8, w9, w8
581; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
582; NONEON-NOSVE-NEXT:    str w8, [sp, #80]
583; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
584; NONEON-NOSVE-NEXT:    and w8, w10, w8
585; NONEON-NOSVE-NEXT:    str w8, [sp, #76]
586; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
587; NONEON-NOSVE-NEXT:    and w8, w9, w8
588; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
589; NONEON-NOSVE-NEXT:    str w8, [sp, #72]
590; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
591; NONEON-NOSVE-NEXT:    and w8, w10, w8
592; NONEON-NOSVE-NEXT:    str w8, [sp, #68]
593; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
594; NONEON-NOSVE-NEXT:    and w8, w9, w8
595; NONEON-NOSVE-NEXT:    str w8, [sp, #64]
596; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
597; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
598; NONEON-NOSVE-NEXT:    add sp, sp, #96
599; NONEON-NOSVE-NEXT:    ret
600  %op1 = load <8 x i32>, ptr %a
601  %op2 = load <8 x i32>, ptr %b
602  %res = and <8 x i32> %op1, %op2
603  store <8 x i32> %res, ptr %a
604  ret void
605}
606
607define <1 x i64> @and_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
608; CHECK-LABEL: and_v1i64:
609; CHECK:       // %bb.0:
610; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
611; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
612; CHECK-NEXT:    and z0.d, z0.d, z1.d
613; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
614; CHECK-NEXT:    ret
615;
616; NONEON-NOSVE-LABEL: and_v1i64:
617; NONEON-NOSVE:       // %bb.0:
618; NONEON-NOSVE-NEXT:    sub sp, sp, #16
619; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
620; NONEON-NOSVE-NEXT:    fmov x8, d1
621; NONEON-NOSVE-NEXT:    fmov x9, d0
622; NONEON-NOSVE-NEXT:    and x8, x9, x8
623; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
624; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
625; NONEON-NOSVE-NEXT:    add sp, sp, #16
626; NONEON-NOSVE-NEXT:    ret
627  %res = and <1 x i64> %op1, %op2
628  ret <1 x i64> %res
629}
630
631define <2 x i64> @and_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
632; CHECK-LABEL: and_v2i64:
633; CHECK:       // %bb.0:
634; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
635; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
636; CHECK-NEXT:    and z0.d, z0.d, z1.d
637; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
638; CHECK-NEXT:    ret
639;
640; NONEON-NOSVE-LABEL: and_v2i64:
641; NONEON-NOSVE:       // %bb.0:
642; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
643; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
644; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
645; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
646; NONEON-NOSVE-NEXT:    and x8, x10, x8
647; NONEON-NOSVE-NEXT:    str x8, [sp, #40]
648; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
649; NONEON-NOSVE-NEXT:    and x8, x9, x8
650; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
651; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
652; NONEON-NOSVE-NEXT:    add sp, sp, #48
653; NONEON-NOSVE-NEXT:    ret
654  %res = and <2 x i64> %op1, %op2
655  ret <2 x i64> %res
656}
657
658define void @and_v4i64(ptr %a, ptr %b) {
659; CHECK-LABEL: and_v4i64:
660; CHECK:       // %bb.0:
661; CHECK-NEXT:    ldp q0, q3, [x1]
662; CHECK-NEXT:    ldp q1, q2, [x0]
663; CHECK-NEXT:    and z0.d, z1.d, z0.d
664; CHECK-NEXT:    and z1.d, z2.d, z3.d
665; CHECK-NEXT:    stp q0, q1, [x0]
666; CHECK-NEXT:    ret
667;
668; NONEON-NOSVE-LABEL: and_v4i64:
669; NONEON-NOSVE:       // %bb.0:
670; NONEON-NOSVE-NEXT:    sub sp, sp, #96
671; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
672; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
673; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
674; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
675; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
676; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
677; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
678; NONEON-NOSVE-NEXT:    and x8, x10, x8
679; NONEON-NOSVE-NEXT:    str x8, [sp, #88]
680; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
681; NONEON-NOSVE-NEXT:    and x8, x9, x8
682; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
683; NONEON-NOSVE-NEXT:    str x8, [sp, #80]
684; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
685; NONEON-NOSVE-NEXT:    and x8, x10, x8
686; NONEON-NOSVE-NEXT:    str x8, [sp, #72]
687; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
688; NONEON-NOSVE-NEXT:    and x8, x9, x8
689; NONEON-NOSVE-NEXT:    str x8, [sp, #64]
690; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
691; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
692; NONEON-NOSVE-NEXT:    add sp, sp, #96
693; NONEON-NOSVE-NEXT:    ret
694  %op1 = load <4 x i64>, ptr %a
695  %op2 = load <4 x i64>, ptr %b
696  %res = and <4 x i64> %op1, %op2
697  store <4 x i64> %res, ptr %a
698  ret void
699}
700
701;
702; OR
703;
704
705define <8 x i8> @or_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
706; CHECK-LABEL: or_v8i8:
707; CHECK:       // %bb.0:
708; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
709; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
710; CHECK-NEXT:    orr z0.d, z0.d, z1.d
711; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
712; CHECK-NEXT:    ret
713;
714; NONEON-NOSVE-LABEL: or_v8i8:
715; NONEON-NOSVE:       // %bb.0:
716; NONEON-NOSVE-NEXT:    sub sp, sp, #32
717; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
718; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
719; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
720; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
721; NONEON-NOSVE-NEXT:    orr w8, w9, w8
722; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
723; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
724; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
725; NONEON-NOSVE-NEXT:    orr w8, w9, w8
726; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
727; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
728; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
729; NONEON-NOSVE-NEXT:    orr w8, w9, w8
730; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
731; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
732; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
733; NONEON-NOSVE-NEXT:    orr w8, w9, w8
734; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
735; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
736; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
737; NONEON-NOSVE-NEXT:    orr w8, w9, w8
738; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
739; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
740; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
741; NONEON-NOSVE-NEXT:    orr w8, w9, w8
742; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
743; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
744; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
745; NONEON-NOSVE-NEXT:    orr w8, w9, w8
746; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
747; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
748; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
749; NONEON-NOSVE-NEXT:    orr w8, w9, w8
750; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
751; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
752; NONEON-NOSVE-NEXT:    add sp, sp, #32
753; NONEON-NOSVE-NEXT:    ret
754  %res = or <8 x i8> %op1, %op2
755  ret <8 x i8> %res
756}
757
758define <16 x i8> @or_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
759; CHECK-LABEL: or_v16i8:
760; CHECK:       // %bb.0:
761; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
762; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
763; CHECK-NEXT:    orr z0.d, z0.d, z1.d
764; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
765; CHECK-NEXT:    ret
766;
767; NONEON-NOSVE-LABEL: or_v16i8:
768; NONEON-NOSVE:       // %bb.0:
769; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
770; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
771; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
772; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
773; NONEON-NOSVE-NEXT:    orr w8, w9, w8
774; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
775; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
776; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
777; NONEON-NOSVE-NEXT:    orr w8, w9, w8
778; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
779; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
780; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
781; NONEON-NOSVE-NEXT:    orr w8, w9, w8
782; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
783; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
784; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
785; NONEON-NOSVE-NEXT:    orr w8, w9, w8
786; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
787; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
788; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
789; NONEON-NOSVE-NEXT:    orr w8, w9, w8
790; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
791; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
792; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
793; NONEON-NOSVE-NEXT:    orr w8, w9, w8
794; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
795; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
796; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
797; NONEON-NOSVE-NEXT:    orr w8, w9, w8
798; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
799; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
800; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
801; NONEON-NOSVE-NEXT:    orr w8, w9, w8
802; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
803; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
804; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
805; NONEON-NOSVE-NEXT:    orr w8, w9, w8
806; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
807; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
808; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
809; NONEON-NOSVE-NEXT:    orr w8, w9, w8
810; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
811; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
812; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
813; NONEON-NOSVE-NEXT:    orr w8, w9, w8
814; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
815; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
816; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
817; NONEON-NOSVE-NEXT:    orr w8, w9, w8
818; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
819; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
820; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
821; NONEON-NOSVE-NEXT:    orr w8, w9, w8
822; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
823; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
824; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
825; NONEON-NOSVE-NEXT:    orr w8, w9, w8
826; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
827; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
828; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
829; NONEON-NOSVE-NEXT:    orr w8, w9, w8
830; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
831; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
832; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
833; NONEON-NOSVE-NEXT:    orr w8, w9, w8
834; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
835; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
836; NONEON-NOSVE-NEXT:    add sp, sp, #48
837; NONEON-NOSVE-NEXT:    ret
838  %res = or <16 x i8> %op1, %op2
839  ret <16 x i8> %res
840}
841
842define void @or_v32i8(ptr %a, ptr %b) {
843; CHECK-LABEL: or_v32i8:
844; CHECK:       // %bb.0:
845; CHECK-NEXT:    ldp q0, q3, [x1]
846; CHECK-NEXT:    ldp q1, q2, [x0]
847; CHECK-NEXT:    orr z0.d, z1.d, z0.d
848; CHECK-NEXT:    orr z1.d, z2.d, z3.d
849; CHECK-NEXT:    stp q0, q1, [x0]
850; CHECK-NEXT:    ret
851;
852; NONEON-NOSVE-LABEL: or_v32i8:
853; NONEON-NOSVE:       // %bb.0:
854; NONEON-NOSVE-NEXT:    sub sp, sp, #96
855; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
856; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
857; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
858; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
859; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
860; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
861; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
862; NONEON-NOSVE-NEXT:    orr w8, w9, w8
863; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
864; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
865; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
866; NONEON-NOSVE-NEXT:    orr w8, w9, w8
867; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
868; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
869; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
870; NONEON-NOSVE-NEXT:    orr w8, w9, w8
871; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
872; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
873; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
874; NONEON-NOSVE-NEXT:    orr w8, w9, w8
875; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
876; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
877; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
878; NONEON-NOSVE-NEXT:    orr w8, w9, w8
879; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
880; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
881; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
882; NONEON-NOSVE-NEXT:    orr w8, w9, w8
883; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
884; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
885; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
886; NONEON-NOSVE-NEXT:    orr w8, w9, w8
887; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
888; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
889; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
890; NONEON-NOSVE-NEXT:    orr w8, w9, w8
891; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
892; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
893; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
894; NONEON-NOSVE-NEXT:    orr w8, w9, w8
895; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
896; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
897; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
898; NONEON-NOSVE-NEXT:    orr w8, w9, w8
899; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
900; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
901; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
902; NONEON-NOSVE-NEXT:    orr w8, w9, w8
903; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
904; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
905; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
906; NONEON-NOSVE-NEXT:    orr w8, w9, w8
907; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
908; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
909; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
910; NONEON-NOSVE-NEXT:    orr w8, w9, w8
911; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
912; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
913; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
914; NONEON-NOSVE-NEXT:    orr w8, w9, w8
915; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
916; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
917; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
918; NONEON-NOSVE-NEXT:    orr w8, w9, w8
919; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
920; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
921; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
922; NONEON-NOSVE-NEXT:    orr w8, w9, w8
923; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
924; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
925; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
926; NONEON-NOSVE-NEXT:    orr w8, w9, w8
927; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
928; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
929; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
930; NONEON-NOSVE-NEXT:    orr w8, w9, w8
931; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
932; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
933; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
934; NONEON-NOSVE-NEXT:    orr w8, w9, w8
935; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
936; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
937; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
938; NONEON-NOSVE-NEXT:    orr w8, w9, w8
939; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
940; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
941; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
942; NONEON-NOSVE-NEXT:    orr w8, w9, w8
943; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
944; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
945; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
946; NONEON-NOSVE-NEXT:    orr w8, w9, w8
947; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
948; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
949; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
950; NONEON-NOSVE-NEXT:    orr w8, w9, w8
951; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
952; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
953; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
954; NONEON-NOSVE-NEXT:    orr w8, w9, w8
955; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
956; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
957; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
958; NONEON-NOSVE-NEXT:    orr w8, w9, w8
959; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
960; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
961; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
962; NONEON-NOSVE-NEXT:    orr w8, w9, w8
963; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
964; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
965; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
966; NONEON-NOSVE-NEXT:    orr w8, w9, w8
967; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
968; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
969; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
970; NONEON-NOSVE-NEXT:    orr w8, w9, w8
971; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
972; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
973; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
974; NONEON-NOSVE-NEXT:    orr w8, w9, w8
975; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
976; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
977; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
978; NONEON-NOSVE-NEXT:    orr w8, w9, w8
979; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
980; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
981; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
982; NONEON-NOSVE-NEXT:    orr w8, w9, w8
983; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
984; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
985; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
986; NONEON-NOSVE-NEXT:    orr w8, w9, w8
987; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
988; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
989; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
990; NONEON-NOSVE-NEXT:    add sp, sp, #96
991; NONEON-NOSVE-NEXT:    ret
992  %op1 = load <32 x i8>, ptr %a
993  %op2 = load <32 x i8>, ptr %b
994  %res = or <32 x i8> %op1, %op2
995  store <32 x i8> %res, ptr %a
996  ret void
997}
998
999define <4 x i16> @or_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
1000; CHECK-LABEL: or_v4i16:
1001; CHECK:       // %bb.0:
1002; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1003; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1004; CHECK-NEXT:    orr z0.d, z0.d, z1.d
1005; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1006; CHECK-NEXT:    ret
1007;
1008; NONEON-NOSVE-LABEL: or_v4i16:
1009; NONEON-NOSVE:       // %bb.0:
1010; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1011; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1012; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1013; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1014; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1015; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1016; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1017; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
1018; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1019; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1020; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1021; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
1022; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1023; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1024; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1025; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
1026; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1027; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1028; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
1029; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1030; NONEON-NOSVE-NEXT:    add sp, sp, #32
1031; NONEON-NOSVE-NEXT:    ret
1032  %res = or <4 x i16> %op1, %op2
1033  ret <4 x i16> %res
1034}
1035
1036define <8 x i16> @or_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
1037; CHECK-LABEL: or_v8i16:
1038; CHECK:       // %bb.0:
1039; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1040; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1041; CHECK-NEXT:    orr z0.d, z0.d, z1.d
1042; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1043; CHECK-NEXT:    ret
1044;
1045; NONEON-NOSVE-LABEL: or_v8i16:
1046; NONEON-NOSVE:       // %bb.0:
1047; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1048; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1049; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1050; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1051; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1052; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1053; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1054; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1055; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1056; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1057; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1058; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1059; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1060; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1061; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1062; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1063; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1064; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1065; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1066; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1067; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1068; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1069; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1070; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1071; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1072; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1073; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1074; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1075; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1076; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1077; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1078; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1079; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1080; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1081; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1082; NONEON-NOSVE-NEXT:    add sp, sp, #48
1083; NONEON-NOSVE-NEXT:    ret
1084  %res = or <8 x i16> %op1, %op2
1085  ret <8 x i16> %res
1086}
1087
1088define void @or_v16i16(ptr %a, ptr %b) {
1089; CHECK-LABEL: or_v16i16:
1090; CHECK:       // %bb.0:
1091; CHECK-NEXT:    ldp q0, q3, [x1]
1092; CHECK-NEXT:    ldp q1, q2, [x0]
1093; CHECK-NEXT:    orr z0.d, z1.d, z0.d
1094; CHECK-NEXT:    orr z1.d, z2.d, z3.d
1095; CHECK-NEXT:    stp q0, q1, [x0]
1096; CHECK-NEXT:    ret
1097;
1098; NONEON-NOSVE-LABEL: or_v16i16:
1099; NONEON-NOSVE:       // %bb.0:
1100; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1101; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1102; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1103; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1104; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1105; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1106; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
1107; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
1108; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1109; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]
1110; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1111; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
1112; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1113; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
1114; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1115; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
1116; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1117; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]
1118; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1119; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
1120; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1121; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]
1122; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1123; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
1124; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1125; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]
1126; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1127; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
1128; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1129; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]
1130; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1131; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
1132; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1133; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
1134; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1135; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
1136; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1137; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1138; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1139; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1140; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1141; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1142; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1143; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1144; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1145; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1146; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1147; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1148; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1149; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1150; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1151; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1152; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1153; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1154; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1155; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1156; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1157; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1158; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1159; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1160; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1161; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1162; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1163; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1164; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1165; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1166; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1167; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1168; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1169; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1170; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1171; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1172; NONEON-NOSVE-NEXT:    add sp, sp, #96
1173; NONEON-NOSVE-NEXT:    ret
1174  %op1 = load <16 x i16>, ptr %a
1175  %op2 = load <16 x i16>, ptr %b
1176  %res = or <16 x i16> %op1, %op2
1177  store <16 x i16> %res, ptr %a
1178  ret void
1179}
1180
1181define <2 x i32> @or_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
1182; CHECK-LABEL: or_v2i32:
1183; CHECK:       // %bb.0:
1184; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1185; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1186; CHECK-NEXT:    orr z0.d, z0.d, z1.d
1187; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1188; CHECK-NEXT:    ret
1189;
1190; NONEON-NOSVE-LABEL: or_v2i32:
1191; NONEON-NOSVE:       // %bb.0:
1192; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1193; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1194; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1195; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1196; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1197; NONEON-NOSVE-NEXT:    orr w8, w10, w8
1198; NONEON-NOSVE-NEXT:    str w8, [sp, #28]
1199; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1200; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1201; NONEON-NOSVE-NEXT:    str w8, [sp, #24]
1202; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1203; NONEON-NOSVE-NEXT:    add sp, sp, #32
1204; NONEON-NOSVE-NEXT:    ret
1205  %res = or <2 x i32> %op1, %op2
1206  ret <2 x i32> %res
1207}
1208
1209define <4 x i32> @or_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
1210; CHECK-LABEL: or_v4i32:
1211; CHECK:       // %bb.0:
1212; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1213; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1214; CHECK-NEXT:    orr z0.d, z0.d, z1.d
1215; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1216; CHECK-NEXT:    ret
1217;
1218; NONEON-NOSVE-LABEL: or_v4i32:
1219; NONEON-NOSVE:       // %bb.0:
1220; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1221; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1222; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1223; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1224; NONEON-NOSVE-NEXT:    orr w8, w10, w8
1225; NONEON-NOSVE-NEXT:    str w8, [sp, #44]
1226; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1227; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1228; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1229; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
1230; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1231; NONEON-NOSVE-NEXT:    orr w8, w10, w8
1232; NONEON-NOSVE-NEXT:    str w8, [sp, #36]
1233; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1234; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1235; NONEON-NOSVE-NEXT:    str w8, [sp, #32]
1236; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1237; NONEON-NOSVE-NEXT:    add sp, sp, #48
1238; NONEON-NOSVE-NEXT:    ret
1239  %res = or <4 x i32> %op1, %op2
1240  ret <4 x i32> %res
1241}
1242
1243define void @or_v8i32(ptr %a, ptr %b) {
1244; CHECK-LABEL: or_v8i32:
1245; CHECK:       // %bb.0:
1246; CHECK-NEXT:    ldp q0, q3, [x1]
1247; CHECK-NEXT:    ldp q1, q2, [x0]
1248; CHECK-NEXT:    orr z0.d, z1.d, z0.d
1249; CHECK-NEXT:    orr z1.d, z2.d, z3.d
1250; CHECK-NEXT:    stp q0, q1, [x0]
1251; CHECK-NEXT:    ret
1252;
1253; NONEON-NOSVE-LABEL: or_v8i32:
1254; NONEON-NOSVE:       // %bb.0:
1255; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1256; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1257; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1258; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1259; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1260; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1261; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
1262; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
1263; NONEON-NOSVE-NEXT:    orr w8, w10, w8
1264; NONEON-NOSVE-NEXT:    str w8, [sp, #92]
1265; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
1266; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1267; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
1268; NONEON-NOSVE-NEXT:    str w8, [sp, #88]
1269; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
1270; NONEON-NOSVE-NEXT:    orr w8, w10, w8
1271; NONEON-NOSVE-NEXT:    str w8, [sp, #84]
1272; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
1273; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1274; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1275; NONEON-NOSVE-NEXT:    str w8, [sp, #80]
1276; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1277; NONEON-NOSVE-NEXT:    orr w8, w10, w8
1278; NONEON-NOSVE-NEXT:    str w8, [sp, #76]
1279; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1280; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1281; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1282; NONEON-NOSVE-NEXT:    str w8, [sp, #72]
1283; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1284; NONEON-NOSVE-NEXT:    orr w8, w10, w8
1285; NONEON-NOSVE-NEXT:    str w8, [sp, #68]
1286; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1287; NONEON-NOSVE-NEXT:    orr w8, w9, w8
1288; NONEON-NOSVE-NEXT:    str w8, [sp, #64]
1289; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1290; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1291; NONEON-NOSVE-NEXT:    add sp, sp, #96
1292; NONEON-NOSVE-NEXT:    ret
1293  %op1 = load <8 x i32>, ptr %a
1294  %op2 = load <8 x i32>, ptr %b
1295  %res = or <8 x i32> %op1, %op2
1296  store <8 x i32> %res, ptr %a
1297  ret void
1298}
1299
1300define <1 x i64> @or_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
1301; CHECK-LABEL: or_v1i64:
1302; CHECK:       // %bb.0:
1303; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1304; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1305; CHECK-NEXT:    orr z0.d, z0.d, z1.d
1306; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1307; CHECK-NEXT:    ret
1308;
1309; NONEON-NOSVE-LABEL: or_v1i64:
1310; NONEON-NOSVE:       // %bb.0:
1311; NONEON-NOSVE-NEXT:    sub sp, sp, #16
1312; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
1313; NONEON-NOSVE-NEXT:    fmov x8, d1
1314; NONEON-NOSVE-NEXT:    fmov x9, d0
1315; NONEON-NOSVE-NEXT:    orr x8, x9, x8
1316; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
1317; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1318; NONEON-NOSVE-NEXT:    add sp, sp, #16
1319; NONEON-NOSVE-NEXT:    ret
1320  %res = or <1 x i64> %op1, %op2
1321  ret <1 x i64> %res
1322}
1323
1324define <2 x i64> @or_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
1325; CHECK-LABEL: or_v2i64:
1326; CHECK:       // %bb.0:
1327; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1328; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1329; CHECK-NEXT:    orr z0.d, z0.d, z1.d
1330; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1331; CHECK-NEXT:    ret
1332;
1333; NONEON-NOSVE-LABEL: or_v2i64:
1334; NONEON-NOSVE:       // %bb.0:
1335; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1336; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1337; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1338; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1339; NONEON-NOSVE-NEXT:    orr x8, x10, x8
1340; NONEON-NOSVE-NEXT:    str x8, [sp, #40]
1341; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1342; NONEON-NOSVE-NEXT:    orr x8, x9, x8
1343; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
1344; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1345; NONEON-NOSVE-NEXT:    add sp, sp, #48
1346; NONEON-NOSVE-NEXT:    ret
1347  %res = or <2 x i64> %op1, %op2
1348  ret <2 x i64> %res
1349}
1350
1351define void @or_v4i64(ptr %a, ptr %b) {
1352; CHECK-LABEL: or_v4i64:
1353; CHECK:       // %bb.0:
1354; CHECK-NEXT:    ldp q0, q3, [x1]
1355; CHECK-NEXT:    ldp q1, q2, [x0]
1356; CHECK-NEXT:    orr z0.d, z1.d, z0.d
1357; CHECK-NEXT:    orr z1.d, z2.d, z3.d
1358; CHECK-NEXT:    stp q0, q1, [x0]
1359; CHECK-NEXT:    ret
1360;
1361; NONEON-NOSVE-LABEL: or_v4i64:
1362; NONEON-NOSVE:       // %bb.0:
1363; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1364; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1365; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1366; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1367; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1368; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1369; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
1370; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
1371; NONEON-NOSVE-NEXT:    orr x8, x10, x8
1372; NONEON-NOSVE-NEXT:    str x8, [sp, #88]
1373; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
1374; NONEON-NOSVE-NEXT:    orr x8, x9, x8
1375; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1376; NONEON-NOSVE-NEXT:    str x8, [sp, #80]
1377; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1378; NONEON-NOSVE-NEXT:    orr x8, x10, x8
1379; NONEON-NOSVE-NEXT:    str x8, [sp, #72]
1380; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1381; NONEON-NOSVE-NEXT:    orr x8, x9, x8
1382; NONEON-NOSVE-NEXT:    str x8, [sp, #64]
1383; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1384; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1385; NONEON-NOSVE-NEXT:    add sp, sp, #96
1386; NONEON-NOSVE-NEXT:    ret
1387  %op1 = load <4 x i64>, ptr %a
1388  %op2 = load <4 x i64>, ptr %b
1389  %res = or <4 x i64> %op1, %op2
1390  store <4 x i64> %res, ptr %a
1391  ret void
1392}
1393
1394;
1395; XOR
1396;
1397
1398define <8 x i8> @xor_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
1399; CHECK-LABEL: xor_v8i8:
1400; CHECK:       // %bb.0:
1401; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1402; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1403; CHECK-NEXT:    eor z0.d, z0.d, z1.d
1404; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1405; CHECK-NEXT:    ret
1406;
1407; NONEON-NOSVE-LABEL: xor_v8i8:
1408; NONEON-NOSVE:       // %bb.0:
1409; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1410; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1411; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1412; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1413; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1414; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1415; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1416; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
1417; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1418; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1419; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1420; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
1421; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1422; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1423; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1424; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
1425; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1426; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1427; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1428; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
1429; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1430; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1431; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1432; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
1433; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1434; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1435; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1436; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
1437; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1438; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1439; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1440; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
1441; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1442; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1443; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
1444; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1445; NONEON-NOSVE-NEXT:    add sp, sp, #32
1446; NONEON-NOSVE-NEXT:    ret
1447  %res = xor <8 x i8> %op1, %op2
1448  ret <8 x i8> %res
1449}
1450
1451define <16 x i8> @xor_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
1452; CHECK-LABEL: xor_v16i8:
1453; CHECK:       // %bb.0:
1454; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1455; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1456; CHECK-NEXT:    eor z0.d, z0.d, z1.d
1457; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1458; CHECK-NEXT:    ret
1459;
1460; NONEON-NOSVE-LABEL: xor_v16i8:
1461; NONEON-NOSVE:       // %bb.0:
1462; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1463; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1464; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1465; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1466; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1467; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1468; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
1469; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1470; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1471; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1472; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
1473; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1474; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1475; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1476; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
1477; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1478; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1479; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1480; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
1481; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1482; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1483; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1484; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
1485; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1486; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1487; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1488; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
1489; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1490; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1491; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1492; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
1493; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1494; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1495; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1496; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
1497; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1498; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1499; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1500; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
1501; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1502; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1503; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1504; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
1505; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1506; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1507; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1508; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
1509; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1510; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1511; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1512; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
1513; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1514; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1515; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1516; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
1517; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1518; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1519; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1520; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
1521; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1522; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1523; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1524; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
1525; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1526; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1527; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1528; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1529; NONEON-NOSVE-NEXT:    add sp, sp, #48
1530; NONEON-NOSVE-NEXT:    ret
1531  %res = xor <16 x i8> %op1, %op2
1532  ret <16 x i8> %res
1533}
1534
1535define void @xor_v32i8(ptr %a, ptr %b) {
1536; CHECK-LABEL: xor_v32i8:
1537; CHECK:       // %bb.0:
1538; CHECK-NEXT:    ldp q0, q3, [x1]
1539; CHECK-NEXT:    ldp q1, q2, [x0]
1540; CHECK-NEXT:    eor z0.d, z1.d, z0.d
1541; CHECK-NEXT:    eor z1.d, z2.d, z3.d
1542; CHECK-NEXT:    stp q0, q1, [x0]
1543; CHECK-NEXT:    ret
1544;
1545; NONEON-NOSVE-LABEL: xor_v32i8:
1546; NONEON-NOSVE:       // %bb.0:
1547; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1548; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1549; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1550; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1551; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1552; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1553; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
1554; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
1555; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1556; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
1557; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
1558; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
1559; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1560; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
1561; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
1562; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
1563; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1564; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
1565; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
1566; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
1567; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1568; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
1569; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
1570; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
1571; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1572; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
1573; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
1574; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
1575; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1576; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
1577; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
1578; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
1579; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1580; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
1581; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
1582; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
1583; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1584; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
1585; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
1586; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
1587; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1588; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
1589; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
1590; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
1591; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1592; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
1593; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
1594; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
1595; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1596; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
1597; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
1598; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
1599; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1600; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
1601; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
1602; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
1603; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1604; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
1605; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
1606; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
1607; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1608; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
1609; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
1610; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
1611; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1612; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
1613; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
1614; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
1615; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1616; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1617; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
1618; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1619; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1620; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1621; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
1622; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1623; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1624; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1625; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
1626; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1627; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1628; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1629; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
1630; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1631; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1632; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1633; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
1634; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1635; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1636; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1637; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
1638; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1639; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1640; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1641; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
1642; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1643; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1644; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1645; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
1646; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1647; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1648; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1649; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
1650; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1651; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1652; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1653; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
1654; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1655; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1656; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1657; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
1658; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1659; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1660; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1661; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
1662; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1663; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1664; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1665; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
1666; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1667; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1668; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1669; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
1670; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1671; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1672; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1673; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
1674; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1675; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1676; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1677; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
1678; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1679; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1680; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
1681; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1682; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1683; NONEON-NOSVE-NEXT:    add sp, sp, #96
1684; NONEON-NOSVE-NEXT:    ret
1685  %op1 = load <32 x i8>, ptr %a
1686  %op2 = load <32 x i8>, ptr %b
1687  %res = xor <32 x i8> %op1, %op2
1688  store <32 x i8> %res, ptr %a
1689  ret void
1690}
1691
1692define <4 x i16> @xor_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
1693; CHECK-LABEL: xor_v4i16:
1694; CHECK:       // %bb.0:
1695; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1696; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1697; CHECK-NEXT:    eor z0.d, z0.d, z1.d
1698; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1699; CHECK-NEXT:    ret
1700;
1701; NONEON-NOSVE-LABEL: xor_v4i16:
1702; NONEON-NOSVE:       // %bb.0:
1703; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1704; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1705; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1706; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1707; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1708; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1709; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1710; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
1711; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1712; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1713; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1714; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
1715; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1716; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1717; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1718; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
1719; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1720; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1721; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
1722; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1723; NONEON-NOSVE-NEXT:    add sp, sp, #32
1724; NONEON-NOSVE-NEXT:    ret
1725  %res = xor <4 x i16> %op1, %op2
1726  ret <4 x i16> %res
1727}
1728
1729define <8 x i16> @xor_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
1730; CHECK-LABEL: xor_v8i16:
1731; CHECK:       // %bb.0:
1732; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1733; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1734; CHECK-NEXT:    eor z0.d, z0.d, z1.d
1735; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1736; CHECK-NEXT:    ret
1737;
1738; NONEON-NOSVE-LABEL: xor_v8i16:
1739; NONEON-NOSVE:       // %bb.0:
1740; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1741; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1742; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1743; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1744; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1745; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1746; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1747; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1748; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1749; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1750; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1751; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1752; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1753; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1754; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1755; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1756; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1757; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1758; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1759; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1760; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1761; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1762; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1763; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1764; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1765; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1766; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1767; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1768; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1769; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1770; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1771; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1772; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1773; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1774; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1775; NONEON-NOSVE-NEXT:    add sp, sp, #48
1776; NONEON-NOSVE-NEXT:    ret
1777  %res = xor <8 x i16> %op1, %op2
1778  ret <8 x i16> %res
1779}
1780
1781define void @xor_v16i16(ptr %a, ptr %b) {
1782; CHECK-LABEL: xor_v16i16:
1783; CHECK:       // %bb.0:
1784; CHECK-NEXT:    ldp q0, q3, [x1]
1785; CHECK-NEXT:    ldp q1, q2, [x0]
1786; CHECK-NEXT:    eor z0.d, z1.d, z0.d
1787; CHECK-NEXT:    eor z1.d, z2.d, z3.d
1788; CHECK-NEXT:    stp q0, q1, [x0]
1789; CHECK-NEXT:    ret
1790;
1791; NONEON-NOSVE-LABEL: xor_v16i16:
1792; NONEON-NOSVE:       // %bb.0:
1793; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1794; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1795; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1796; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1797; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1798; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1799; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
1800; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
1801; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1802; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]
1803; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1804; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
1805; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1806; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
1807; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1808; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
1809; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1810; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]
1811; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1812; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
1813; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1814; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]
1815; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1816; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
1817; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1818; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]
1819; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1820; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
1821; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1822; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]
1823; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1824; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
1825; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1826; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
1827; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1828; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
1829; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1830; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1831; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1832; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1833; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1834; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1835; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1836; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1837; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1838; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1839; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1840; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1841; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1842; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1843; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1844; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1845; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1846; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1847; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1848; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1849; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1850; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1851; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1852; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1853; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1854; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1855; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1856; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1857; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1858; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1859; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1860; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1861; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1862; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1863; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1864; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1865; NONEON-NOSVE-NEXT:    add sp, sp, #96
1866; NONEON-NOSVE-NEXT:    ret
1867  %op1 = load <16 x i16>, ptr %a
1868  %op2 = load <16 x i16>, ptr %b
1869  %res = xor <16 x i16> %op1, %op2
1870  store <16 x i16> %res, ptr %a
1871  ret void
1872}
1873
1874define <2 x i32> @xor_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
1875; CHECK-LABEL: xor_v2i32:
1876; CHECK:       // %bb.0:
1877; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1878; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1879; CHECK-NEXT:    eor z0.d, z0.d, z1.d
1880; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1881; CHECK-NEXT:    ret
1882;
1883; NONEON-NOSVE-LABEL: xor_v2i32:
1884; NONEON-NOSVE:       // %bb.0:
1885; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1886; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1887; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1888; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1889; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1890; NONEON-NOSVE-NEXT:    eor w8, w10, w8
1891; NONEON-NOSVE-NEXT:    str w8, [sp, #28]
1892; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1893; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1894; NONEON-NOSVE-NEXT:    str w8, [sp, #24]
1895; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1896; NONEON-NOSVE-NEXT:    add sp, sp, #32
1897; NONEON-NOSVE-NEXT:    ret
1898  %res = xor <2 x i32> %op1, %op2
1899  ret <2 x i32> %res
1900}
1901
1902define <4 x i32> @xor_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
1903; CHECK-LABEL: xor_v4i32:
1904; CHECK:       // %bb.0:
1905; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1906; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1907; CHECK-NEXT:    eor z0.d, z0.d, z1.d
1908; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1909; CHECK-NEXT:    ret
1910;
1911; NONEON-NOSVE-LABEL: xor_v4i32:
1912; NONEON-NOSVE:       // %bb.0:
1913; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1914; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1915; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1916; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1917; NONEON-NOSVE-NEXT:    eor w8, w10, w8
1918; NONEON-NOSVE-NEXT:    str w8, [sp, #44]
1919; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1920; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1921; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1922; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
1923; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1924; NONEON-NOSVE-NEXT:    eor w8, w10, w8
1925; NONEON-NOSVE-NEXT:    str w8, [sp, #36]
1926; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1927; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1928; NONEON-NOSVE-NEXT:    str w8, [sp, #32]
1929; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1930; NONEON-NOSVE-NEXT:    add sp, sp, #48
1931; NONEON-NOSVE-NEXT:    ret
1932  %res = xor <4 x i32> %op1, %op2
1933  ret <4 x i32> %res
1934}
1935
1936define void @xor_v8i32(ptr %a, ptr %b) {
1937; CHECK-LABEL: xor_v8i32:
1938; CHECK:       // %bb.0:
1939; CHECK-NEXT:    ldp q0, q3, [x1]
1940; CHECK-NEXT:    ldp q1, q2, [x0]
1941; CHECK-NEXT:    eor z0.d, z1.d, z0.d
1942; CHECK-NEXT:    eor z1.d, z2.d, z3.d
1943; CHECK-NEXT:    stp q0, q1, [x0]
1944; CHECK-NEXT:    ret
1945;
1946; NONEON-NOSVE-LABEL: xor_v8i32:
1947; NONEON-NOSVE:       // %bb.0:
1948; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1949; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1950; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1951; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1952; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1953; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1954; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
1955; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
1956; NONEON-NOSVE-NEXT:    eor w8, w10, w8
1957; NONEON-NOSVE-NEXT:    str w8, [sp, #92]
1958; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
1959; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1960; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
1961; NONEON-NOSVE-NEXT:    str w8, [sp, #88]
1962; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
1963; NONEON-NOSVE-NEXT:    eor w8, w10, w8
1964; NONEON-NOSVE-NEXT:    str w8, [sp, #84]
1965; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
1966; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1967; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1968; NONEON-NOSVE-NEXT:    str w8, [sp, #80]
1969; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1970; NONEON-NOSVE-NEXT:    eor w8, w10, w8
1971; NONEON-NOSVE-NEXT:    str w8, [sp, #76]
1972; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1973; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1974; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1975; NONEON-NOSVE-NEXT:    str w8, [sp, #72]
1976; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1977; NONEON-NOSVE-NEXT:    eor w8, w10, w8
1978; NONEON-NOSVE-NEXT:    str w8, [sp, #68]
1979; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1980; NONEON-NOSVE-NEXT:    eor w8, w9, w8
1981; NONEON-NOSVE-NEXT:    str w8, [sp, #64]
1982; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1983; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1984; NONEON-NOSVE-NEXT:    add sp, sp, #96
1985; NONEON-NOSVE-NEXT:    ret
1986  %op1 = load <8 x i32>, ptr %a
1987  %op2 = load <8 x i32>, ptr %b
1988  %res = xor <8 x i32> %op1, %op2
1989  store <8 x i32> %res, ptr %a
1990  ret void
1991}
1992
1993define <1 x i64> @xor_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
1994; CHECK-LABEL: xor_v1i64:
1995; CHECK:       // %bb.0:
1996; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1997; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1998; CHECK-NEXT:    eor z0.d, z0.d, z1.d
1999; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2000; CHECK-NEXT:    ret
2001;
2002; NONEON-NOSVE-LABEL: xor_v1i64:
2003; NONEON-NOSVE:       // %bb.0:
2004; NONEON-NOSVE-NEXT:    sub sp, sp, #16
2005; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2006; NONEON-NOSVE-NEXT:    fmov x8, d1
2007; NONEON-NOSVE-NEXT:    fmov x9, d0
2008; NONEON-NOSVE-NEXT:    eor x8, x9, x8
2009; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
2010; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2011; NONEON-NOSVE-NEXT:    add sp, sp, #16
2012; NONEON-NOSVE-NEXT:    ret
2013  %res = xor <1 x i64> %op1, %op2
2014  ret <1 x i64> %res
2015}
2016
2017define <2 x i64> @xor_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
2018; CHECK-LABEL: xor_v2i64:
2019; CHECK:       // %bb.0:
2020; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2021; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
2022; CHECK-NEXT:    eor z0.d, z0.d, z1.d
2023; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2024; CHECK-NEXT:    ret
2025;
2026; NONEON-NOSVE-LABEL: xor_v2i64:
2027; NONEON-NOSVE:       // %bb.0:
2028; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
2029; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
2030; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
2031; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
2032; NONEON-NOSVE-NEXT:    eor x8, x10, x8
2033; NONEON-NOSVE-NEXT:    str x8, [sp, #40]
2034; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
2035; NONEON-NOSVE-NEXT:    eor x8, x9, x8
2036; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
2037; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
2038; NONEON-NOSVE-NEXT:    add sp, sp, #48
2039; NONEON-NOSVE-NEXT:    ret
2040  %res = xor <2 x i64> %op1, %op2
2041  ret <2 x i64> %res
2042}
2043
2044define void @xor_v4i64(ptr %a, ptr %b) {
2045; CHECK-LABEL: xor_v4i64:
2046; CHECK:       // %bb.0:
2047; CHECK-NEXT:    ldp q0, q3, [x1]
2048; CHECK-NEXT:    ldp q1, q2, [x0]
2049; CHECK-NEXT:    eor z0.d, z1.d, z0.d
2050; CHECK-NEXT:    eor z1.d, z2.d, z3.d
2051; CHECK-NEXT:    stp q0, q1, [x0]
2052; CHECK-NEXT:    ret
2053;
2054; NONEON-NOSVE-LABEL: xor_v4i64:
2055; NONEON-NOSVE:       // %bb.0:
2056; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2057; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2058; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2059; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2060; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2061; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2062; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
2063; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
2064; NONEON-NOSVE-NEXT:    eor x8, x10, x8
2065; NONEON-NOSVE-NEXT:    str x8, [sp, #88]
2066; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
2067; NONEON-NOSVE-NEXT:    eor x8, x9, x8
2068; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
2069; NONEON-NOSVE-NEXT:    str x8, [sp, #80]
2070; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
2071; NONEON-NOSVE-NEXT:    eor x8, x10, x8
2072; NONEON-NOSVE-NEXT:    str x8, [sp, #72]
2073; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
2074; NONEON-NOSVE-NEXT:    eor x8, x9, x8
2075; NONEON-NOSVE-NEXT:    str x8, [sp, #64]
2076; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2077; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2078; NONEON-NOSVE-NEXT:    add sp, sp, #96
2079; NONEON-NOSVE-NEXT:    ret
2080  %op1 = load <4 x i64>, ptr %a
2081  %op2 = load <4 x i64>, ptr %b
2082  %res = xor <4 x i64> %op1, %op2
2083  store <4 x i64> %res, ptr %a
2084  ret void
2085}
2086