xref: /llvm-project/llvm/test/CodeGen/RISCV/memcmp.ll (revision a4e47586b9c0566761b7fb704011da6ded823398)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -O2  \
3; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-ALIGNED,CHECK-ALIGNED-RV32
4; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -O2  \
5; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-ALIGNED,CHECK-ALIGNED-RV64
6; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zbb -O2  \
7; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-ALIGNED,CHECK-ALIGNED-RV32-ZBB
8; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zbb -O2  \
9; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-ALIGNED,CHECK-ALIGNED-RV64-ZBB
10; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zbkb -O2  \
11; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-ALIGNED,CHECK-ALIGNED-RV32-ZBKB
12; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zbkb -O2  \
13; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-ALIGNED,CHECK-ALIGNED-RV64-ZBKB
14; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v -O2  \
15; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-ALIGNED,CHECK-ALIGNED-RV32-V
16; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v -O2  \
17; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-ALIGNED,CHECK-ALIGNED-RV64-V
18; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+unaligned-scalar-mem -O2 \
19; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-UNALIGNED,CHECK-UNALIGNED-RV32
20; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+unaligned-scalar-mem -O2 \
21; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-UNALIGNED,CHECK-UNALIGNED-RV64
22; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zbb,+unaligned-scalar-mem -O2 \
23; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-UNALIGNED,CHECK-UNALIGNED-RV32-ZBB
24; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zbb,+unaligned-scalar-mem -O2 \
25; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-UNALIGNED,CHECK-UNALIGNED-RV64-ZBB
26; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zbkb,+unaligned-scalar-mem -O2 \
27; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-UNALIGNED,CHECK-UNALIGNED-RV32-ZBKB
28; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zbkb,+unaligned-scalar-mem -O2 \
29; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-UNALIGNED,CHECK-UNALIGNED-RV64-ZBKB
30; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+unaligned-scalar-mem,+unaligned-vector-mem -O2 \
31; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV32,CHECK-UNALIGNED,CHECK-UNALIGNED-RV32-V
32; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+unaligned-scalar-mem,+unaligned-vector-mem -O2 \
33; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,CHECK-UNALIGNED,CHECK-UNALIGNED-RV64-V
34
35declare i32 @bcmp(ptr, ptr, iXLen) nounwind readonly
36declare i32 @memcmp(ptr, ptr, iXLen) nounwind readonly
37
38define i32 @bcmp_size_0(ptr %s1, ptr %s2) nounwind {
39; CHECK-RV32-LABEL: bcmp_size_0:
40; CHECK-RV32:       # %bb.0: # %entry
41; CHECK-RV32-NEXT:    addi sp, sp, -16
42; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
43; CHECK-RV32-NEXT:    li a2, 0
44; CHECK-RV32-NEXT:    call bcmp
45; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
46; CHECK-RV32-NEXT:    addi sp, sp, 16
47; CHECK-RV32-NEXT:    ret
48;
49; CHECK-RV64-LABEL: bcmp_size_0:
50; CHECK-RV64:       # %bb.0: # %entry
51; CHECK-RV64-NEXT:    addi sp, sp, -16
52; CHECK-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
53; CHECK-RV64-NEXT:    li a2, 0
54; CHECK-RV64-NEXT:    call bcmp
55; CHECK-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
56; CHECK-RV64-NEXT:    addi sp, sp, 16
57; CHECK-RV64-NEXT:    ret
58entry:
59  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 0)
60  ret i32 %bcmp
61}
62
63define i32 @bcmp_size_1(ptr %s1, ptr %s2) nounwind {
64; CHECK-ALIGNED-RV32-LABEL: bcmp_size_1:
65; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
66; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
67; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
68; CHECK-ALIGNED-RV32-NEXT:    li a2, 1
69; CHECK-ALIGNED-RV32-NEXT:    call bcmp
70; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
71; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
72; CHECK-ALIGNED-RV32-NEXT:    ret
73;
74; CHECK-ALIGNED-RV64-LABEL: bcmp_size_1:
75; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
76; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
77; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
78; CHECK-ALIGNED-RV64-NEXT:    li a2, 1
79; CHECK-ALIGNED-RV64-NEXT:    call bcmp
80; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
81; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
82; CHECK-ALIGNED-RV64-NEXT:    ret
83;
84; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_1:
85; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
86; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
87; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
88; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 1
89; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
90; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
91; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
92; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
93;
94; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_1:
95; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
96; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
97; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
98; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 1
99; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
100; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
101; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
102; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
103;
104; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_1:
105; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
106; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
107; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
108; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 1
109; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
110; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
111; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
112; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
113;
114; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_1:
115; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
116; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
117; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
118; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 1
119; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
120; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
121; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
122; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
123;
124; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_1:
125; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
126; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
127; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
128; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 1
129; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
130; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
131; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
132; CHECK-ALIGNED-RV32-V-NEXT:    ret
133;
134; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_1:
135; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
136; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
137; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
138; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 1
139; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
140; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
141; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
142; CHECK-ALIGNED-RV64-V-NEXT:    ret
143;
144; CHECK-UNALIGNED-LABEL: bcmp_size_1:
145; CHECK-UNALIGNED:       # %bb.0: # %entry
146; CHECK-UNALIGNED-NEXT:    lbu a0, 0(a0)
147; CHECK-UNALIGNED-NEXT:    lbu a1, 0(a1)
148; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
149; CHECK-UNALIGNED-NEXT:    snez a0, a0
150; CHECK-UNALIGNED-NEXT:    ret
151entry:
152  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 1)
153  ret i32 %bcmp
154}
155
156define i32 @bcmp_size_2(ptr %s1, ptr %s2) nounwind {
157; CHECK-ALIGNED-RV32-LABEL: bcmp_size_2:
158; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
159; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
160; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
161; CHECK-ALIGNED-RV32-NEXT:    li a2, 2
162; CHECK-ALIGNED-RV32-NEXT:    call bcmp
163; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
164; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
165; CHECK-ALIGNED-RV32-NEXT:    ret
166;
167; CHECK-ALIGNED-RV64-LABEL: bcmp_size_2:
168; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
169; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
170; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
171; CHECK-ALIGNED-RV64-NEXT:    li a2, 2
172; CHECK-ALIGNED-RV64-NEXT:    call bcmp
173; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
174; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
175; CHECK-ALIGNED-RV64-NEXT:    ret
176;
177; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_2:
178; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
179; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
180; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
181; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 2
182; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
183; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
184; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
185; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
186;
187; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_2:
188; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
189; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
190; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
191; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 2
192; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
193; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
194; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
195; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
196;
197; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_2:
198; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
199; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
200; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
201; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 2
202; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
203; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
204; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
205; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
206;
207; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_2:
208; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
209; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
210; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
211; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 2
212; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
213; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
214; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
215; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
216;
217; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_2:
218; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
219; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
220; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
221; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 2
222; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
223; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
224; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
225; CHECK-ALIGNED-RV32-V-NEXT:    ret
226;
227; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_2:
228; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
229; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
230; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
231; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 2
232; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
233; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
234; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
235; CHECK-ALIGNED-RV64-V-NEXT:    ret
236;
237; CHECK-UNALIGNED-LABEL: bcmp_size_2:
238; CHECK-UNALIGNED:       # %bb.0: # %entry
239; CHECK-UNALIGNED-NEXT:    lhu a0, 0(a0)
240; CHECK-UNALIGNED-NEXT:    lhu a1, 0(a1)
241; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
242; CHECK-UNALIGNED-NEXT:    snez a0, a0
243; CHECK-UNALIGNED-NEXT:    ret
244entry:
245  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 2)
246  ret i32 %bcmp
247}
248
249define i32 @bcmp_size_3(ptr %s1, ptr %s2) nounwind {
250; CHECK-ALIGNED-RV32-LABEL: bcmp_size_3:
251; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
252; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
253; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
254; CHECK-ALIGNED-RV32-NEXT:    li a2, 3
255; CHECK-ALIGNED-RV32-NEXT:    call bcmp
256; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
257; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
258; CHECK-ALIGNED-RV32-NEXT:    ret
259;
260; CHECK-ALIGNED-RV64-LABEL: bcmp_size_3:
261; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
262; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
263; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
264; CHECK-ALIGNED-RV64-NEXT:    li a2, 3
265; CHECK-ALIGNED-RV64-NEXT:    call bcmp
266; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
267; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
268; CHECK-ALIGNED-RV64-NEXT:    ret
269;
270; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_3:
271; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
272; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
273; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
274; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 3
275; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
276; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
277; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
278; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
279;
280; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_3:
281; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
282; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
283; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
284; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 3
285; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
286; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
287; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
288; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
289;
290; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_3:
291; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
292; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
293; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
294; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 3
295; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
296; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
297; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
298; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
299;
300; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_3:
301; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
302; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
303; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
304; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 3
305; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
306; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
307; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
308; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
309;
310; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_3:
311; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
312; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
313; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
314; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 3
315; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
316; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
317; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
318; CHECK-ALIGNED-RV32-V-NEXT:    ret
319;
320; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_3:
321; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
322; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
323; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
324; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 3
325; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
326; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
327; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
328; CHECK-ALIGNED-RV64-V-NEXT:    ret
329;
330; CHECK-UNALIGNED-LABEL: bcmp_size_3:
331; CHECK-UNALIGNED:       # %bb.0: # %entry
332; CHECK-UNALIGNED-NEXT:    lhu a2, 0(a0)
333; CHECK-UNALIGNED-NEXT:    lbu a0, 2(a0)
334; CHECK-UNALIGNED-NEXT:    lhu a3, 0(a1)
335; CHECK-UNALIGNED-NEXT:    lbu a1, 2(a1)
336; CHECK-UNALIGNED-NEXT:    xor a2, a2, a3
337; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
338; CHECK-UNALIGNED-NEXT:    or a0, a2, a0
339; CHECK-UNALIGNED-NEXT:    snez a0, a0
340; CHECK-UNALIGNED-NEXT:    ret
341entry:
342  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 3)
343  ret i32 %bcmp
344}
345
346define i32 @bcmp_size_4(ptr %s1, ptr %s2) nounwind {
347; CHECK-ALIGNED-RV32-LABEL: bcmp_size_4:
348; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
349; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
350; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
351; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
352; CHECK-ALIGNED-RV32-NEXT:    call bcmp
353; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
354; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
355; CHECK-ALIGNED-RV32-NEXT:    ret
356;
357; CHECK-ALIGNED-RV64-LABEL: bcmp_size_4:
358; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
359; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
360; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
361; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
362; CHECK-ALIGNED-RV64-NEXT:    call bcmp
363; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
364; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
365; CHECK-ALIGNED-RV64-NEXT:    ret
366;
367; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_4:
368; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
369; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
370; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
371; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
372; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
373; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
374; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
375; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
376;
377; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_4:
378; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
379; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
380; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
381; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
382; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
383; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
384; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
385; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
386;
387; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_4:
388; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
389; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
390; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
391; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
392; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
393; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
394; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
395; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
396;
397; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_4:
398; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
399; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
400; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
401; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
402; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
403; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
404; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
405; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
406;
407; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_4:
408; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
409; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
410; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
411; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
412; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
413; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
414; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
415; CHECK-ALIGNED-RV32-V-NEXT:    ret
416;
417; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_4:
418; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
419; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
420; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
421; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
422; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
423; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
424; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
425; CHECK-ALIGNED-RV64-V-NEXT:    ret
426;
427; CHECK-UNALIGNED-LABEL: bcmp_size_4:
428; CHECK-UNALIGNED:       # %bb.0: # %entry
429; CHECK-UNALIGNED-NEXT:    lw a0, 0(a0)
430; CHECK-UNALIGNED-NEXT:    lw a1, 0(a1)
431; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
432; CHECK-UNALIGNED-NEXT:    snez a0, a0
433; CHECK-UNALIGNED-NEXT:    ret
434entry:
435  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 4)
436  ret i32 %bcmp
437}
438
439define i32 @bcmp_size_5(ptr %s1, ptr %s2) nounwind {
440; CHECK-ALIGNED-RV32-LABEL: bcmp_size_5:
441; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
442; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
443; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
444; CHECK-ALIGNED-RV32-NEXT:    li a2, 5
445; CHECK-ALIGNED-RV32-NEXT:    call bcmp
446; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
447; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
448; CHECK-ALIGNED-RV32-NEXT:    ret
449;
450; CHECK-ALIGNED-RV64-LABEL: bcmp_size_5:
451; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
452; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
453; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
454; CHECK-ALIGNED-RV64-NEXT:    li a2, 5
455; CHECK-ALIGNED-RV64-NEXT:    call bcmp
456; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
457; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
458; CHECK-ALIGNED-RV64-NEXT:    ret
459;
460; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_5:
461; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
462; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
463; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
464; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 5
465; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
466; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
467; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
468; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
469;
470; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_5:
471; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
472; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
473; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
474; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 5
475; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
476; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
477; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
478; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
479;
480; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_5:
481; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
482; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
483; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
484; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 5
485; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
486; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
487; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
488; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
489;
490; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_5:
491; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
492; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
493; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
494; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 5
495; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
496; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
497; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
498; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
499;
500; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_5:
501; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
502; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
503; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
504; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 5
505; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
506; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
507; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
508; CHECK-ALIGNED-RV32-V-NEXT:    ret
509;
510; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_5:
511; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
512; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
513; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
514; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 5
515; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
516; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
517; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
518; CHECK-ALIGNED-RV64-V-NEXT:    ret
519;
520; CHECK-UNALIGNED-LABEL: bcmp_size_5:
521; CHECK-UNALIGNED:       # %bb.0: # %entry
522; CHECK-UNALIGNED-NEXT:    lw a2, 0(a0)
523; CHECK-UNALIGNED-NEXT:    lbu a0, 4(a0)
524; CHECK-UNALIGNED-NEXT:    lw a3, 0(a1)
525; CHECK-UNALIGNED-NEXT:    lbu a1, 4(a1)
526; CHECK-UNALIGNED-NEXT:    xor a2, a2, a3
527; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
528; CHECK-UNALIGNED-NEXT:    or a0, a2, a0
529; CHECK-UNALIGNED-NEXT:    snez a0, a0
530; CHECK-UNALIGNED-NEXT:    ret
531entry:
532  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 5)
533  ret i32 %bcmp
534}
535
536define i32 @bcmp_size_6(ptr %s1, ptr %s2) nounwind {
537; CHECK-ALIGNED-RV32-LABEL: bcmp_size_6:
538; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
539; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
540; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
541; CHECK-ALIGNED-RV32-NEXT:    li a2, 6
542; CHECK-ALIGNED-RV32-NEXT:    call bcmp
543; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
544; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
545; CHECK-ALIGNED-RV32-NEXT:    ret
546;
547; CHECK-ALIGNED-RV64-LABEL: bcmp_size_6:
548; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
549; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
550; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
551; CHECK-ALIGNED-RV64-NEXT:    li a2, 6
552; CHECK-ALIGNED-RV64-NEXT:    call bcmp
553; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
554; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
555; CHECK-ALIGNED-RV64-NEXT:    ret
556;
557; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_6:
558; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
559; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
560; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
561; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 6
562; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
563; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
564; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
565; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
566;
567; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_6:
568; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
569; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
570; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
571; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 6
572; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
573; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
574; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
575; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
576;
577; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_6:
578; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
579; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
580; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
581; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 6
582; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
583; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
584; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
585; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
586;
587; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_6:
588; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
589; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
590; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
591; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 6
592; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
593; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
594; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
595; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
596;
597; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_6:
598; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
599; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
600; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
601; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 6
602; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
603; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
604; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
605; CHECK-ALIGNED-RV32-V-NEXT:    ret
606;
607; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_6:
608; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
609; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
610; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
611; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 6
612; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
613; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
614; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
615; CHECK-ALIGNED-RV64-V-NEXT:    ret
616;
617; CHECK-UNALIGNED-LABEL: bcmp_size_6:
618; CHECK-UNALIGNED:       # %bb.0: # %entry
619; CHECK-UNALIGNED-NEXT:    lw a2, 0(a0)
620; CHECK-UNALIGNED-NEXT:    lhu a0, 4(a0)
621; CHECK-UNALIGNED-NEXT:    lw a3, 0(a1)
622; CHECK-UNALIGNED-NEXT:    lhu a1, 4(a1)
623; CHECK-UNALIGNED-NEXT:    xor a2, a2, a3
624; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
625; CHECK-UNALIGNED-NEXT:    or a0, a2, a0
626; CHECK-UNALIGNED-NEXT:    snez a0, a0
627; CHECK-UNALIGNED-NEXT:    ret
628entry:
629  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 6)
630  ret i32 %bcmp
631}
632
633define i32 @bcmp_size_7(ptr %s1, ptr %s2) nounwind {
634; CHECK-ALIGNED-RV32-LABEL: bcmp_size_7:
635; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
636; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
637; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
638; CHECK-ALIGNED-RV32-NEXT:    li a2, 7
639; CHECK-ALIGNED-RV32-NEXT:    call bcmp
640; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
641; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
642; CHECK-ALIGNED-RV32-NEXT:    ret
643;
644; CHECK-ALIGNED-RV64-LABEL: bcmp_size_7:
645; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
646; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
647; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
648; CHECK-ALIGNED-RV64-NEXT:    li a2, 7
649; CHECK-ALIGNED-RV64-NEXT:    call bcmp
650; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
651; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
652; CHECK-ALIGNED-RV64-NEXT:    ret
653;
654; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_7:
655; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
656; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
657; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
658; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 7
659; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
660; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
661; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
662; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
663;
664; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_7:
665; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
666; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
667; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
668; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 7
669; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
670; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
671; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
672; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
673;
674; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_7:
675; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
676; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
677; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
678; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 7
679; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
680; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
681; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
682; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
683;
684; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_7:
685; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
686; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
687; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
688; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 7
689; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
690; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
691; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
692; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
693;
694; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_7:
695; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
696; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
697; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
698; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 7
699; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
700; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
701; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
702; CHECK-ALIGNED-RV32-V-NEXT:    ret
703;
704; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_7:
705; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
706; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
707; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
708; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 7
709; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
710; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
711; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
712; CHECK-ALIGNED-RV64-V-NEXT:    ret
713;
714; CHECK-UNALIGNED-LABEL: bcmp_size_7:
715; CHECK-UNALIGNED:       # %bb.0: # %entry
716; CHECK-UNALIGNED-NEXT:    lw a2, 0(a0)
717; CHECK-UNALIGNED-NEXT:    lw a0, 3(a0)
718; CHECK-UNALIGNED-NEXT:    lw a3, 0(a1)
719; CHECK-UNALIGNED-NEXT:    lw a1, 3(a1)
720; CHECK-UNALIGNED-NEXT:    xor a2, a2, a3
721; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
722; CHECK-UNALIGNED-NEXT:    or a0, a2, a0
723; CHECK-UNALIGNED-NEXT:    snez a0, a0
724; CHECK-UNALIGNED-NEXT:    ret
725entry:
726  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 7)
727  ret i32 %bcmp
728}
729
730define i32 @bcmp_size_8(ptr %s1, ptr %s2) nounwind {
731; CHECK-ALIGNED-RV32-LABEL: bcmp_size_8:
732; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
733; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
734; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
735; CHECK-ALIGNED-RV32-NEXT:    li a2, 8
736; CHECK-ALIGNED-RV32-NEXT:    call bcmp
737; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
738; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
739; CHECK-ALIGNED-RV32-NEXT:    ret
740;
741; CHECK-ALIGNED-RV64-LABEL: bcmp_size_8:
742; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
743; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
744; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
745; CHECK-ALIGNED-RV64-NEXT:    li a2, 8
746; CHECK-ALIGNED-RV64-NEXT:    call bcmp
747; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
748; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
749; CHECK-ALIGNED-RV64-NEXT:    ret
750;
751; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_8:
752; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
753; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
754; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
755; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 8
756; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
757; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
758; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
759; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
760;
761; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_8:
762; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
763; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
764; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
765; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 8
766; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
767; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
768; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
769; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
770;
771; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_8:
772; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
773; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
774; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
775; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 8
776; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
777; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
778; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
779; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
780;
781; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_8:
782; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
783; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
784; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
785; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 8
786; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
787; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
788; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
789; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
790;
791; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_8:
792; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
793; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
794; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
795; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 8
796; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
797; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
798; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
799; CHECK-ALIGNED-RV32-V-NEXT:    ret
800;
801; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_8:
802; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
803; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
804; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
805; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 8
806; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
807; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
808; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
809; CHECK-ALIGNED-RV64-V-NEXT:    ret
810;
811; CHECK-UNALIGNED-RV32-LABEL: bcmp_size_8:
812; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
813; CHECK-UNALIGNED-RV32-NEXT:    lw a2, 0(a0)
814; CHECK-UNALIGNED-RV32-NEXT:    lw a0, 4(a0)
815; CHECK-UNALIGNED-RV32-NEXT:    lw a3, 0(a1)
816; CHECK-UNALIGNED-RV32-NEXT:    lw a1, 4(a1)
817; CHECK-UNALIGNED-RV32-NEXT:    xor a2, a2, a3
818; CHECK-UNALIGNED-RV32-NEXT:    xor a0, a0, a1
819; CHECK-UNALIGNED-RV32-NEXT:    or a0, a2, a0
820; CHECK-UNALIGNED-RV32-NEXT:    snez a0, a0
821; CHECK-UNALIGNED-RV32-NEXT:    ret
822;
823; CHECK-UNALIGNED-RV64-LABEL: bcmp_size_8:
824; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
825; CHECK-UNALIGNED-RV64-NEXT:    ld a0, 0(a0)
826; CHECK-UNALIGNED-RV64-NEXT:    ld a1, 0(a1)
827; CHECK-UNALIGNED-RV64-NEXT:    xor a0, a0, a1
828; CHECK-UNALIGNED-RV64-NEXT:    snez a0, a0
829; CHECK-UNALIGNED-RV64-NEXT:    ret
830;
831; CHECK-UNALIGNED-RV32-ZBB-LABEL: bcmp_size_8:
832; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
833; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
834; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 4(a0)
835; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
836; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 4(a1)
837; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a2, a2, a3
838; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a0, a0, a1
839; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a2, a0
840; CHECK-UNALIGNED-RV32-ZBB-NEXT:    snez a0, a0
841; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
842;
843; CHECK-UNALIGNED-RV64-ZBB-LABEL: bcmp_size_8:
844; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
845; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 0(a0)
846; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 0(a1)
847; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
848; CHECK-UNALIGNED-RV64-ZBB-NEXT:    snez a0, a0
849; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
850;
851; CHECK-UNALIGNED-RV32-ZBKB-LABEL: bcmp_size_8:
852; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
853; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
854; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 4(a0)
855; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
856; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 4(a1)
857; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a2, a2, a3
858; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a0, a0, a1
859; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a2, a0
860; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    snez a0, a0
861; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
862;
863; CHECK-UNALIGNED-RV64-ZBKB-LABEL: bcmp_size_8:
864; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
865; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 0(a0)
866; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 0(a1)
867; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
868; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    snez a0, a0
869; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
870;
871; CHECK-UNALIGNED-RV32-V-LABEL: bcmp_size_8:
872; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
873; CHECK-UNALIGNED-RV32-V-NEXT:    lw a2, 0(a0)
874; CHECK-UNALIGNED-RV32-V-NEXT:    lw a0, 4(a0)
875; CHECK-UNALIGNED-RV32-V-NEXT:    lw a3, 0(a1)
876; CHECK-UNALIGNED-RV32-V-NEXT:    lw a1, 4(a1)
877; CHECK-UNALIGNED-RV32-V-NEXT:    xor a2, a2, a3
878; CHECK-UNALIGNED-RV32-V-NEXT:    xor a0, a0, a1
879; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a2, a0
880; CHECK-UNALIGNED-RV32-V-NEXT:    snez a0, a0
881; CHECK-UNALIGNED-RV32-V-NEXT:    ret
882;
883; CHECK-UNALIGNED-RV64-V-LABEL: bcmp_size_8:
884; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
885; CHECK-UNALIGNED-RV64-V-NEXT:    ld a0, 0(a0)
886; CHECK-UNALIGNED-RV64-V-NEXT:    ld a1, 0(a1)
887; CHECK-UNALIGNED-RV64-V-NEXT:    xor a0, a0, a1
888; CHECK-UNALIGNED-RV64-V-NEXT:    snez a0, a0
889; CHECK-UNALIGNED-RV64-V-NEXT:    ret
890entry:
891  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 8)
892  ret i32 %bcmp
893}
894
895define i32 @bcmp_size_15(ptr %s1, ptr %s2) nounwind {
896; CHECK-ALIGNED-RV32-LABEL: bcmp_size_15:
897; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
898; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
899; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
900; CHECK-ALIGNED-RV32-NEXT:    li a2, 15
901; CHECK-ALIGNED-RV32-NEXT:    call bcmp
902; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
903; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
904; CHECK-ALIGNED-RV32-NEXT:    ret
905;
906; CHECK-ALIGNED-RV64-LABEL: bcmp_size_15:
907; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
908; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
909; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
910; CHECK-ALIGNED-RV64-NEXT:    li a2, 15
911; CHECK-ALIGNED-RV64-NEXT:    call bcmp
912; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
913; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
914; CHECK-ALIGNED-RV64-NEXT:    ret
915;
916; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_15:
917; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
918; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
919; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
920; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 15
921; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
922; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
923; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
924; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
925;
926; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_15:
927; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
928; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
929; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
930; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 15
931; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
932; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
933; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
934; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
935;
936; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_15:
937; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
938; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
939; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
940; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 15
941; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
942; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
943; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
944; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
945;
946; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_15:
947; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
948; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
949; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
950; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 15
951; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
952; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
953; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
954; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
955;
956; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_15:
957; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
958; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
959; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
960; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 15
961; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
962; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
963; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
964; CHECK-ALIGNED-RV32-V-NEXT:    ret
965;
966; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_15:
967; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
968; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
969; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
970; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 15
971; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
972; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
973; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
974; CHECK-ALIGNED-RV64-V-NEXT:    ret
975;
976; CHECK-UNALIGNED-RV32-LABEL: bcmp_size_15:
977; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
978; CHECK-UNALIGNED-RV32-NEXT:    lw a2, 0(a0)
979; CHECK-UNALIGNED-RV32-NEXT:    lw a3, 4(a0)
980; CHECK-UNALIGNED-RV32-NEXT:    lw a4, 8(a0)
981; CHECK-UNALIGNED-RV32-NEXT:    lw a0, 11(a0)
982; CHECK-UNALIGNED-RV32-NEXT:    lw a5, 0(a1)
983; CHECK-UNALIGNED-RV32-NEXT:    lw a6, 4(a1)
984; CHECK-UNALIGNED-RV32-NEXT:    lw a7, 8(a1)
985; CHECK-UNALIGNED-RV32-NEXT:    lw a1, 11(a1)
986; CHECK-UNALIGNED-RV32-NEXT:    xor a2, a2, a5
987; CHECK-UNALIGNED-RV32-NEXT:    xor a3, a3, a6
988; CHECK-UNALIGNED-RV32-NEXT:    xor a4, a4, a7
989; CHECK-UNALIGNED-RV32-NEXT:    xor a0, a0, a1
990; CHECK-UNALIGNED-RV32-NEXT:    or a2, a2, a3
991; CHECK-UNALIGNED-RV32-NEXT:    or a0, a4, a0
992; CHECK-UNALIGNED-RV32-NEXT:    or a0, a2, a0
993; CHECK-UNALIGNED-RV32-NEXT:    snez a0, a0
994; CHECK-UNALIGNED-RV32-NEXT:    ret
995;
996; CHECK-UNALIGNED-RV64-LABEL: bcmp_size_15:
997; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
998; CHECK-UNALIGNED-RV64-NEXT:    ld a2, 0(a0)
999; CHECK-UNALIGNED-RV64-NEXT:    ld a0, 7(a0)
1000; CHECK-UNALIGNED-RV64-NEXT:    ld a3, 0(a1)
1001; CHECK-UNALIGNED-RV64-NEXT:    ld a1, 7(a1)
1002; CHECK-UNALIGNED-RV64-NEXT:    xor a2, a2, a3
1003; CHECK-UNALIGNED-RV64-NEXT:    xor a0, a0, a1
1004; CHECK-UNALIGNED-RV64-NEXT:    or a0, a2, a0
1005; CHECK-UNALIGNED-RV64-NEXT:    snez a0, a0
1006; CHECK-UNALIGNED-RV64-NEXT:    ret
1007;
1008; CHECK-UNALIGNED-RV32-ZBB-LABEL: bcmp_size_15:
1009; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
1010; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
1011; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a0)
1012; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a4, 8(a0)
1013; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 11(a0)
1014; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a5, 0(a1)
1015; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a6, 4(a1)
1016; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a7, 8(a1)
1017; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 11(a1)
1018; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a2, a2, a5
1019; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a3, a3, a6
1020; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a4, a4, a7
1021; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a0, a0, a1
1022; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a2, a2, a3
1023; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a4, a0
1024; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a2, a0
1025; CHECK-UNALIGNED-RV32-ZBB-NEXT:    snez a0, a0
1026; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
1027;
1028; CHECK-UNALIGNED-RV64-ZBB-LABEL: bcmp_size_15:
1029; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
1030; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
1031; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 7(a0)
1032; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
1033; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 7(a1)
1034; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a2, a2, a3
1035; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
1036; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a2, a0
1037; CHECK-UNALIGNED-RV64-ZBB-NEXT:    snez a0, a0
1038; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
1039;
1040; CHECK-UNALIGNED-RV32-ZBKB-LABEL: bcmp_size_15:
1041; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
1042; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
1043; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a0)
1044; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a4, 8(a0)
1045; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 11(a0)
1046; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a5, 0(a1)
1047; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a6, 4(a1)
1048; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a7, 8(a1)
1049; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 11(a1)
1050; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a2, a2, a5
1051; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a3, a3, a6
1052; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a4, a4, a7
1053; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a0, a0, a1
1054; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a2, a2, a3
1055; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a4, a0
1056; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a2, a0
1057; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    snez a0, a0
1058; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
1059;
1060; CHECK-UNALIGNED-RV64-ZBKB-LABEL: bcmp_size_15:
1061; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1062; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
1063; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 7(a0)
1064; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
1065; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 7(a1)
1066; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a2, a2, a3
1067; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
1068; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a2, a0
1069; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    snez a0, a0
1070; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
1071;
1072; CHECK-UNALIGNED-RV32-V-LABEL: bcmp_size_15:
1073; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
1074; CHECK-UNALIGNED-RV32-V-NEXT:    lw a2, 0(a0)
1075; CHECK-UNALIGNED-RV32-V-NEXT:    lw a3, 4(a0)
1076; CHECK-UNALIGNED-RV32-V-NEXT:    lw a4, 8(a0)
1077; CHECK-UNALIGNED-RV32-V-NEXT:    lw a0, 11(a0)
1078; CHECK-UNALIGNED-RV32-V-NEXT:    lw a5, 0(a1)
1079; CHECK-UNALIGNED-RV32-V-NEXT:    lw a6, 4(a1)
1080; CHECK-UNALIGNED-RV32-V-NEXT:    lw a7, 8(a1)
1081; CHECK-UNALIGNED-RV32-V-NEXT:    lw a1, 11(a1)
1082; CHECK-UNALIGNED-RV32-V-NEXT:    xor a2, a2, a5
1083; CHECK-UNALIGNED-RV32-V-NEXT:    xor a3, a3, a6
1084; CHECK-UNALIGNED-RV32-V-NEXT:    xor a4, a4, a7
1085; CHECK-UNALIGNED-RV32-V-NEXT:    xor a0, a0, a1
1086; CHECK-UNALIGNED-RV32-V-NEXT:    or a2, a2, a3
1087; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a4, a0
1088; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a2, a0
1089; CHECK-UNALIGNED-RV32-V-NEXT:    snez a0, a0
1090; CHECK-UNALIGNED-RV32-V-NEXT:    ret
1091;
1092; CHECK-UNALIGNED-RV64-V-LABEL: bcmp_size_15:
1093; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
1094; CHECK-UNALIGNED-RV64-V-NEXT:    ld a2, 0(a0)
1095; CHECK-UNALIGNED-RV64-V-NEXT:    ld a0, 7(a0)
1096; CHECK-UNALIGNED-RV64-V-NEXT:    ld a3, 0(a1)
1097; CHECK-UNALIGNED-RV64-V-NEXT:    ld a1, 7(a1)
1098; CHECK-UNALIGNED-RV64-V-NEXT:    xor a2, a2, a3
1099; CHECK-UNALIGNED-RV64-V-NEXT:    xor a0, a0, a1
1100; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a2, a0
1101; CHECK-UNALIGNED-RV64-V-NEXT:    snez a0, a0
1102; CHECK-UNALIGNED-RV64-V-NEXT:    ret
1103entry:
1104  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 15)
1105  ret i32 %bcmp
1106}
1107
1108define i32 @bcmp_size_16(ptr %s1, ptr %s2) nounwind {
1109; CHECK-ALIGNED-RV32-LABEL: bcmp_size_16:
1110; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
1111; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
1112; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1113; CHECK-ALIGNED-RV32-NEXT:    li a2, 16
1114; CHECK-ALIGNED-RV32-NEXT:    call bcmp
1115; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1116; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
1117; CHECK-ALIGNED-RV32-NEXT:    ret
1118;
1119; CHECK-ALIGNED-RV64-LABEL: bcmp_size_16:
1120; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
1121; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
1122; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1123; CHECK-ALIGNED-RV64-NEXT:    li a2, 16
1124; CHECK-ALIGNED-RV64-NEXT:    call bcmp
1125; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1126; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
1127; CHECK-ALIGNED-RV64-NEXT:    ret
1128;
1129; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_16:
1130; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
1131; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
1132; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1133; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 16
1134; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
1135; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1136; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
1137; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
1138;
1139; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_16:
1140; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
1141; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
1142; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1143; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 16
1144; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
1145; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1146; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
1147; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
1148;
1149; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_16:
1150; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
1151; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
1152; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1153; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 16
1154; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
1155; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1156; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
1157; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
1158;
1159; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_16:
1160; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1161; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
1162; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1163; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 16
1164; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
1165; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1166; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
1167; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
1168;
1169; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_16:
1170; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
1171; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
1172; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1173; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 16
1174; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
1175; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1176; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
1177; CHECK-ALIGNED-RV32-V-NEXT:    ret
1178;
1179; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_16:
1180; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
1181; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
1182; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1183; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 16
1184; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
1185; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1186; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
1187; CHECK-ALIGNED-RV64-V-NEXT:    ret
1188;
1189; CHECK-UNALIGNED-RV32-LABEL: bcmp_size_16:
1190; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
1191; CHECK-UNALIGNED-RV32-NEXT:    lw a2, 0(a0)
1192; CHECK-UNALIGNED-RV32-NEXT:    lw a3, 4(a0)
1193; CHECK-UNALIGNED-RV32-NEXT:    lw a4, 8(a0)
1194; CHECK-UNALIGNED-RV32-NEXT:    lw a0, 12(a0)
1195; CHECK-UNALIGNED-RV32-NEXT:    lw a5, 0(a1)
1196; CHECK-UNALIGNED-RV32-NEXT:    lw a6, 4(a1)
1197; CHECK-UNALIGNED-RV32-NEXT:    lw a7, 8(a1)
1198; CHECK-UNALIGNED-RV32-NEXT:    lw a1, 12(a1)
1199; CHECK-UNALIGNED-RV32-NEXT:    xor a2, a2, a5
1200; CHECK-UNALIGNED-RV32-NEXT:    xor a3, a3, a6
1201; CHECK-UNALIGNED-RV32-NEXT:    xor a4, a4, a7
1202; CHECK-UNALIGNED-RV32-NEXT:    xor a0, a0, a1
1203; CHECK-UNALIGNED-RV32-NEXT:    or a2, a2, a3
1204; CHECK-UNALIGNED-RV32-NEXT:    or a0, a4, a0
1205; CHECK-UNALIGNED-RV32-NEXT:    or a0, a2, a0
1206; CHECK-UNALIGNED-RV32-NEXT:    snez a0, a0
1207; CHECK-UNALIGNED-RV32-NEXT:    ret
1208;
1209; CHECK-UNALIGNED-RV64-LABEL: bcmp_size_16:
1210; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
1211; CHECK-UNALIGNED-RV64-NEXT:    ld a2, 0(a0)
1212; CHECK-UNALIGNED-RV64-NEXT:    ld a0, 8(a0)
1213; CHECK-UNALIGNED-RV64-NEXT:    ld a3, 0(a1)
1214; CHECK-UNALIGNED-RV64-NEXT:    ld a1, 8(a1)
1215; CHECK-UNALIGNED-RV64-NEXT:    xor a2, a2, a3
1216; CHECK-UNALIGNED-RV64-NEXT:    xor a0, a0, a1
1217; CHECK-UNALIGNED-RV64-NEXT:    or a0, a2, a0
1218; CHECK-UNALIGNED-RV64-NEXT:    snez a0, a0
1219; CHECK-UNALIGNED-RV64-NEXT:    ret
1220;
1221; CHECK-UNALIGNED-RV32-ZBB-LABEL: bcmp_size_16:
1222; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
1223; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
1224; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a0)
1225; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a4, 8(a0)
1226; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 12(a0)
1227; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a5, 0(a1)
1228; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a6, 4(a1)
1229; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a7, 8(a1)
1230; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 12(a1)
1231; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a2, a2, a5
1232; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a3, a3, a6
1233; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a4, a4, a7
1234; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a0, a0, a1
1235; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a2, a2, a3
1236; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a4, a0
1237; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a2, a0
1238; CHECK-UNALIGNED-RV32-ZBB-NEXT:    snez a0, a0
1239; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
1240;
1241; CHECK-UNALIGNED-RV64-ZBB-LABEL: bcmp_size_16:
1242; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
1243; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
1244; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 8(a0)
1245; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
1246; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 8(a1)
1247; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a2, a2, a3
1248; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
1249; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a2, a0
1250; CHECK-UNALIGNED-RV64-ZBB-NEXT:    snez a0, a0
1251; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
1252;
1253; CHECK-UNALIGNED-RV32-ZBKB-LABEL: bcmp_size_16:
1254; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
1255; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
1256; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a0)
1257; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a4, 8(a0)
1258; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 12(a0)
1259; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a5, 0(a1)
1260; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a6, 4(a1)
1261; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a7, 8(a1)
1262; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 12(a1)
1263; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a2, a2, a5
1264; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a3, a3, a6
1265; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a4, a4, a7
1266; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a0, a0, a1
1267; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a2, a2, a3
1268; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a4, a0
1269; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a2, a0
1270; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    snez a0, a0
1271; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
1272;
1273; CHECK-UNALIGNED-RV64-ZBKB-LABEL: bcmp_size_16:
1274; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1275; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
1276; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 8(a0)
1277; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
1278; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 8(a1)
1279; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a2, a2, a3
1280; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
1281; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a2, a0
1282; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    snez a0, a0
1283; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
1284;
1285; CHECK-UNALIGNED-RV32-V-LABEL: bcmp_size_16:
1286; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
1287; CHECK-UNALIGNED-RV32-V-NEXT:    lw a2, 0(a0)
1288; CHECK-UNALIGNED-RV32-V-NEXT:    lw a3, 4(a0)
1289; CHECK-UNALIGNED-RV32-V-NEXT:    lw a4, 8(a0)
1290; CHECK-UNALIGNED-RV32-V-NEXT:    lw a0, 12(a0)
1291; CHECK-UNALIGNED-RV32-V-NEXT:    lw a5, 0(a1)
1292; CHECK-UNALIGNED-RV32-V-NEXT:    lw a6, 4(a1)
1293; CHECK-UNALIGNED-RV32-V-NEXT:    lw a7, 8(a1)
1294; CHECK-UNALIGNED-RV32-V-NEXT:    lw a1, 12(a1)
1295; CHECK-UNALIGNED-RV32-V-NEXT:    xor a2, a2, a5
1296; CHECK-UNALIGNED-RV32-V-NEXT:    xor a3, a3, a6
1297; CHECK-UNALIGNED-RV32-V-NEXT:    xor a4, a4, a7
1298; CHECK-UNALIGNED-RV32-V-NEXT:    xor a0, a0, a1
1299; CHECK-UNALIGNED-RV32-V-NEXT:    or a2, a2, a3
1300; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a4, a0
1301; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a2, a0
1302; CHECK-UNALIGNED-RV32-V-NEXT:    snez a0, a0
1303; CHECK-UNALIGNED-RV32-V-NEXT:    ret
1304;
1305; CHECK-UNALIGNED-RV64-V-LABEL: bcmp_size_16:
1306; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
1307; CHECK-UNALIGNED-RV64-V-NEXT:    ld a2, 0(a0)
1308; CHECK-UNALIGNED-RV64-V-NEXT:    ld a0, 8(a0)
1309; CHECK-UNALIGNED-RV64-V-NEXT:    ld a3, 0(a1)
1310; CHECK-UNALIGNED-RV64-V-NEXT:    ld a1, 8(a1)
1311; CHECK-UNALIGNED-RV64-V-NEXT:    xor a2, a2, a3
1312; CHECK-UNALIGNED-RV64-V-NEXT:    xor a0, a0, a1
1313; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a2, a0
1314; CHECK-UNALIGNED-RV64-V-NEXT:    snez a0, a0
1315; CHECK-UNALIGNED-RV64-V-NEXT:    ret
1316entry:
1317  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 16)
1318  ret i32 %bcmp
1319}
1320
1321define i32 @bcmp_size_31(ptr %s1, ptr %s2) nounwind {
1322; CHECK-ALIGNED-RV32-LABEL: bcmp_size_31:
1323; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
1324; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
1325; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1326; CHECK-ALIGNED-RV32-NEXT:    li a2, 31
1327; CHECK-ALIGNED-RV32-NEXT:    call bcmp
1328; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1329; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
1330; CHECK-ALIGNED-RV32-NEXT:    ret
1331;
1332; CHECK-ALIGNED-RV64-LABEL: bcmp_size_31:
1333; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
1334; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
1335; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1336; CHECK-ALIGNED-RV64-NEXT:    li a2, 31
1337; CHECK-ALIGNED-RV64-NEXT:    call bcmp
1338; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1339; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
1340; CHECK-ALIGNED-RV64-NEXT:    ret
1341;
1342; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_31:
1343; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
1344; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
1345; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1346; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 31
1347; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
1348; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1349; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
1350; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
1351;
1352; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_31:
1353; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
1354; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
1355; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1356; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 31
1357; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
1358; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1359; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
1360; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
1361;
1362; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_31:
1363; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
1364; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
1365; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1366; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 31
1367; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
1368; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1369; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
1370; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
1371;
1372; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_31:
1373; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1374; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
1375; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1376; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 31
1377; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
1378; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1379; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
1380; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
1381;
1382; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_31:
1383; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
1384; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
1385; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1386; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 31
1387; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
1388; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1389; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
1390; CHECK-ALIGNED-RV32-V-NEXT:    ret
1391;
1392; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_31:
1393; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
1394; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
1395; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1396; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 31
1397; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
1398; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1399; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
1400; CHECK-ALIGNED-RV64-V-NEXT:    ret
1401;
1402; CHECK-UNALIGNED-RV32-LABEL: bcmp_size_31:
1403; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
1404; CHECK-UNALIGNED-RV32-NEXT:    lw a2, 0(a0)
1405; CHECK-UNALIGNED-RV32-NEXT:    lw a3, 4(a0)
1406; CHECK-UNALIGNED-RV32-NEXT:    lw a4, 8(a0)
1407; CHECK-UNALIGNED-RV32-NEXT:    lw a5, 12(a0)
1408; CHECK-UNALIGNED-RV32-NEXT:    lw a6, 0(a1)
1409; CHECK-UNALIGNED-RV32-NEXT:    lw a7, 4(a1)
1410; CHECK-UNALIGNED-RV32-NEXT:    lw t0, 8(a1)
1411; CHECK-UNALIGNED-RV32-NEXT:    lw t1, 12(a1)
1412; CHECK-UNALIGNED-RV32-NEXT:    xor a2, a2, a6
1413; CHECK-UNALIGNED-RV32-NEXT:    lw a6, 16(a0)
1414; CHECK-UNALIGNED-RV32-NEXT:    lw t2, 20(a0)
1415; CHECK-UNALIGNED-RV32-NEXT:    lw t3, 24(a0)
1416; CHECK-UNALIGNED-RV32-NEXT:    lw a0, 27(a0)
1417; CHECK-UNALIGNED-RV32-NEXT:    xor a3, a3, a7
1418; CHECK-UNALIGNED-RV32-NEXT:    xor a4, a4, t0
1419; CHECK-UNALIGNED-RV32-NEXT:    xor a5, a5, t1
1420; CHECK-UNALIGNED-RV32-NEXT:    lw a7, 16(a1)
1421; CHECK-UNALIGNED-RV32-NEXT:    lw t0, 20(a1)
1422; CHECK-UNALIGNED-RV32-NEXT:    lw t1, 24(a1)
1423; CHECK-UNALIGNED-RV32-NEXT:    lw a1, 27(a1)
1424; CHECK-UNALIGNED-RV32-NEXT:    xor a6, a6, a7
1425; CHECK-UNALIGNED-RV32-NEXT:    xor a7, t2, t0
1426; CHECK-UNALIGNED-RV32-NEXT:    xor t0, t3, t1
1427; CHECK-UNALIGNED-RV32-NEXT:    xor a0, a0, a1
1428; CHECK-UNALIGNED-RV32-NEXT:    or a2, a2, a3
1429; CHECK-UNALIGNED-RV32-NEXT:    or a4, a4, a5
1430; CHECK-UNALIGNED-RV32-NEXT:    or a1, a6, a7
1431; CHECK-UNALIGNED-RV32-NEXT:    or a0, t0, a0
1432; CHECK-UNALIGNED-RV32-NEXT:    or a2, a2, a4
1433; CHECK-UNALIGNED-RV32-NEXT:    or a0, a1, a0
1434; CHECK-UNALIGNED-RV32-NEXT:    or a0, a2, a0
1435; CHECK-UNALIGNED-RV32-NEXT:    snez a0, a0
1436; CHECK-UNALIGNED-RV32-NEXT:    ret
1437;
1438; CHECK-UNALIGNED-RV64-LABEL: bcmp_size_31:
1439; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
1440; CHECK-UNALIGNED-RV64-NEXT:    ld a2, 0(a0)
1441; CHECK-UNALIGNED-RV64-NEXT:    ld a3, 8(a0)
1442; CHECK-UNALIGNED-RV64-NEXT:    ld a4, 16(a0)
1443; CHECK-UNALIGNED-RV64-NEXT:    ld a0, 23(a0)
1444; CHECK-UNALIGNED-RV64-NEXT:    ld a5, 0(a1)
1445; CHECK-UNALIGNED-RV64-NEXT:    ld a6, 8(a1)
1446; CHECK-UNALIGNED-RV64-NEXT:    ld a7, 16(a1)
1447; CHECK-UNALIGNED-RV64-NEXT:    ld a1, 23(a1)
1448; CHECK-UNALIGNED-RV64-NEXT:    xor a2, a2, a5
1449; CHECK-UNALIGNED-RV64-NEXT:    xor a3, a3, a6
1450; CHECK-UNALIGNED-RV64-NEXT:    xor a4, a4, a7
1451; CHECK-UNALIGNED-RV64-NEXT:    xor a0, a0, a1
1452; CHECK-UNALIGNED-RV64-NEXT:    or a2, a2, a3
1453; CHECK-UNALIGNED-RV64-NEXT:    or a0, a4, a0
1454; CHECK-UNALIGNED-RV64-NEXT:    or a0, a2, a0
1455; CHECK-UNALIGNED-RV64-NEXT:    snez a0, a0
1456; CHECK-UNALIGNED-RV64-NEXT:    ret
1457;
1458; CHECK-UNALIGNED-RV32-ZBB-LABEL: bcmp_size_31:
1459; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
1460; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
1461; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a0)
1462; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a4, 8(a0)
1463; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a5, 12(a0)
1464; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a6, 0(a1)
1465; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a7, 4(a1)
1466; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t0, 8(a1)
1467; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t1, 12(a1)
1468; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a2, a2, a6
1469; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a6, 16(a0)
1470; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t2, 20(a0)
1471; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t3, 24(a0)
1472; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 27(a0)
1473; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a3, a3, a7
1474; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a4, a4, t0
1475; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a5, a5, t1
1476; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a7, 16(a1)
1477; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t0, 20(a1)
1478; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t1, 24(a1)
1479; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 27(a1)
1480; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a6, a6, a7
1481; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a7, t2, t0
1482; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor t0, t3, t1
1483; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a0, a0, a1
1484; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a2, a2, a3
1485; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a4, a4, a5
1486; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a1, a6, a7
1487; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, t0, a0
1488; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a2, a2, a4
1489; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a1, a0
1490; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a2, a0
1491; CHECK-UNALIGNED-RV32-ZBB-NEXT:    snez a0, a0
1492; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
1493;
1494; CHECK-UNALIGNED-RV64-ZBB-LABEL: bcmp_size_31:
1495; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
1496; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
1497; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a0)
1498; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a4, 16(a0)
1499; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 23(a0)
1500; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a5, 0(a1)
1501; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a6, 8(a1)
1502; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a7, 16(a1)
1503; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 23(a1)
1504; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a2, a2, a5
1505; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a3, a3, a6
1506; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a4, a4, a7
1507; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
1508; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a2, a2, a3
1509; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a4, a0
1510; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a2, a0
1511; CHECK-UNALIGNED-RV64-ZBB-NEXT:    snez a0, a0
1512; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
1513;
1514; CHECK-UNALIGNED-RV32-ZBKB-LABEL: bcmp_size_31:
1515; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
1516; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
1517; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a0)
1518; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a4, 8(a0)
1519; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a5, 12(a0)
1520; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a6, 0(a1)
1521; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a7, 4(a1)
1522; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t0, 8(a1)
1523; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t1, 12(a1)
1524; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a2, a2, a6
1525; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a6, 16(a0)
1526; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t2, 20(a0)
1527; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t3, 24(a0)
1528; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 27(a0)
1529; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a3, a3, a7
1530; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a4, a4, t0
1531; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a5, a5, t1
1532; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a7, 16(a1)
1533; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t0, 20(a1)
1534; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t1, 24(a1)
1535; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 27(a1)
1536; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a6, a6, a7
1537; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a7, t2, t0
1538; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor t0, t3, t1
1539; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a0, a0, a1
1540; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a2, a2, a3
1541; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a4, a4, a5
1542; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a1, a6, a7
1543; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, t0, a0
1544; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a2, a2, a4
1545; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a1, a0
1546; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a2, a0
1547; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    snez a0, a0
1548; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
1549;
1550; CHECK-UNALIGNED-RV64-ZBKB-LABEL: bcmp_size_31:
1551; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1552; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
1553; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a0)
1554; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a4, 16(a0)
1555; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 23(a0)
1556; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a5, 0(a1)
1557; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a6, 8(a1)
1558; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a7, 16(a1)
1559; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 23(a1)
1560; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a2, a2, a5
1561; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a3, a3, a6
1562; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a4, a4, a7
1563; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
1564; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a2, a2, a3
1565; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a4, a0
1566; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a2, a0
1567; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    snez a0, a0
1568; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
1569;
1570; CHECK-UNALIGNED-RV32-V-LABEL: bcmp_size_31:
1571; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
1572; CHECK-UNALIGNED-RV32-V-NEXT:    lw a2, 0(a0)
1573; CHECK-UNALIGNED-RV32-V-NEXT:    lw a3, 4(a0)
1574; CHECK-UNALIGNED-RV32-V-NEXT:    lw a4, 8(a0)
1575; CHECK-UNALIGNED-RV32-V-NEXT:    lw a5, 12(a0)
1576; CHECK-UNALIGNED-RV32-V-NEXT:    lw a6, 0(a1)
1577; CHECK-UNALIGNED-RV32-V-NEXT:    lw a7, 4(a1)
1578; CHECK-UNALIGNED-RV32-V-NEXT:    lw t0, 8(a1)
1579; CHECK-UNALIGNED-RV32-V-NEXT:    lw t1, 12(a1)
1580; CHECK-UNALIGNED-RV32-V-NEXT:    xor a2, a2, a6
1581; CHECK-UNALIGNED-RV32-V-NEXT:    lw a6, 16(a0)
1582; CHECK-UNALIGNED-RV32-V-NEXT:    lw t2, 20(a0)
1583; CHECK-UNALIGNED-RV32-V-NEXT:    lw t3, 24(a0)
1584; CHECK-UNALIGNED-RV32-V-NEXT:    lw a0, 27(a0)
1585; CHECK-UNALIGNED-RV32-V-NEXT:    xor a3, a3, a7
1586; CHECK-UNALIGNED-RV32-V-NEXT:    xor a4, a4, t0
1587; CHECK-UNALIGNED-RV32-V-NEXT:    xor a5, a5, t1
1588; CHECK-UNALIGNED-RV32-V-NEXT:    lw a7, 16(a1)
1589; CHECK-UNALIGNED-RV32-V-NEXT:    lw t0, 20(a1)
1590; CHECK-UNALIGNED-RV32-V-NEXT:    lw t1, 24(a1)
1591; CHECK-UNALIGNED-RV32-V-NEXT:    lw a1, 27(a1)
1592; CHECK-UNALIGNED-RV32-V-NEXT:    xor a6, a6, a7
1593; CHECK-UNALIGNED-RV32-V-NEXT:    xor a7, t2, t0
1594; CHECK-UNALIGNED-RV32-V-NEXT:    xor t0, t3, t1
1595; CHECK-UNALIGNED-RV32-V-NEXT:    xor a0, a0, a1
1596; CHECK-UNALIGNED-RV32-V-NEXT:    or a2, a2, a3
1597; CHECK-UNALIGNED-RV32-V-NEXT:    or a4, a4, a5
1598; CHECK-UNALIGNED-RV32-V-NEXT:    or a1, a6, a7
1599; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, t0, a0
1600; CHECK-UNALIGNED-RV32-V-NEXT:    or a2, a2, a4
1601; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a1, a0
1602; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a2, a0
1603; CHECK-UNALIGNED-RV32-V-NEXT:    snez a0, a0
1604; CHECK-UNALIGNED-RV32-V-NEXT:    ret
1605;
1606; CHECK-UNALIGNED-RV64-V-LABEL: bcmp_size_31:
1607; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
1608; CHECK-UNALIGNED-RV64-V-NEXT:    ld a2, 0(a0)
1609; CHECK-UNALIGNED-RV64-V-NEXT:    ld a3, 8(a0)
1610; CHECK-UNALIGNED-RV64-V-NEXT:    ld a4, 16(a0)
1611; CHECK-UNALIGNED-RV64-V-NEXT:    ld a0, 23(a0)
1612; CHECK-UNALIGNED-RV64-V-NEXT:    ld a5, 0(a1)
1613; CHECK-UNALIGNED-RV64-V-NEXT:    ld a6, 8(a1)
1614; CHECK-UNALIGNED-RV64-V-NEXT:    ld a7, 16(a1)
1615; CHECK-UNALIGNED-RV64-V-NEXT:    ld a1, 23(a1)
1616; CHECK-UNALIGNED-RV64-V-NEXT:    xor a2, a2, a5
1617; CHECK-UNALIGNED-RV64-V-NEXT:    xor a3, a3, a6
1618; CHECK-UNALIGNED-RV64-V-NEXT:    xor a4, a4, a7
1619; CHECK-UNALIGNED-RV64-V-NEXT:    xor a0, a0, a1
1620; CHECK-UNALIGNED-RV64-V-NEXT:    or a2, a2, a3
1621; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a4, a0
1622; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a2, a0
1623; CHECK-UNALIGNED-RV64-V-NEXT:    snez a0, a0
1624; CHECK-UNALIGNED-RV64-V-NEXT:    ret
1625entry:
1626  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 31)
1627  ret i32 %bcmp
1628}
1629
1630define i32 @bcmp_size_32(ptr %s1, ptr %s2) nounwind {
1631; CHECK-ALIGNED-RV32-LABEL: bcmp_size_32:
1632; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
1633; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
1634; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1635; CHECK-ALIGNED-RV32-NEXT:    li a2, 32
1636; CHECK-ALIGNED-RV32-NEXT:    call bcmp
1637; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1638; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
1639; CHECK-ALIGNED-RV32-NEXT:    ret
1640;
1641; CHECK-ALIGNED-RV64-LABEL: bcmp_size_32:
1642; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
1643; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
1644; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1645; CHECK-ALIGNED-RV64-NEXT:    li a2, 32
1646; CHECK-ALIGNED-RV64-NEXT:    call bcmp
1647; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1648; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
1649; CHECK-ALIGNED-RV64-NEXT:    ret
1650;
1651; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_size_32:
1652; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
1653; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
1654; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1655; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 32
1656; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
1657; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1658; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
1659; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
1660;
1661; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_32:
1662; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
1663; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
1664; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1665; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 32
1666; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
1667; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1668; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
1669; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
1670;
1671; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_size_32:
1672; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
1673; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
1674; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1675; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 32
1676; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
1677; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1678; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
1679; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
1680;
1681; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_32:
1682; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1683; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
1684; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1685; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 32
1686; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
1687; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1688; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
1689; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
1690;
1691; CHECK-ALIGNED-RV32-V-LABEL: bcmp_size_32:
1692; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
1693; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
1694; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1695; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 32
1696; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
1697; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1698; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
1699; CHECK-ALIGNED-RV32-V-NEXT:    ret
1700;
1701; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_32:
1702; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
1703; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
1704; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1705; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 32
1706; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
1707; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1708; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
1709; CHECK-ALIGNED-RV64-V-NEXT:    ret
1710;
1711; CHECK-UNALIGNED-RV32-LABEL: bcmp_size_32:
1712; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
1713; CHECK-UNALIGNED-RV32-NEXT:    lw a2, 0(a0)
1714; CHECK-UNALIGNED-RV32-NEXT:    lw a3, 4(a0)
1715; CHECK-UNALIGNED-RV32-NEXT:    lw a4, 8(a0)
1716; CHECK-UNALIGNED-RV32-NEXT:    lw a5, 12(a0)
1717; CHECK-UNALIGNED-RV32-NEXT:    lw a6, 0(a1)
1718; CHECK-UNALIGNED-RV32-NEXT:    lw a7, 4(a1)
1719; CHECK-UNALIGNED-RV32-NEXT:    lw t0, 8(a1)
1720; CHECK-UNALIGNED-RV32-NEXT:    lw t1, 12(a1)
1721; CHECK-UNALIGNED-RV32-NEXT:    xor a2, a2, a6
1722; CHECK-UNALIGNED-RV32-NEXT:    lw a6, 16(a0)
1723; CHECK-UNALIGNED-RV32-NEXT:    lw t2, 20(a0)
1724; CHECK-UNALIGNED-RV32-NEXT:    lw t3, 24(a0)
1725; CHECK-UNALIGNED-RV32-NEXT:    lw a0, 28(a0)
1726; CHECK-UNALIGNED-RV32-NEXT:    xor a3, a3, a7
1727; CHECK-UNALIGNED-RV32-NEXT:    xor a4, a4, t0
1728; CHECK-UNALIGNED-RV32-NEXT:    xor a5, a5, t1
1729; CHECK-UNALIGNED-RV32-NEXT:    lw a7, 16(a1)
1730; CHECK-UNALIGNED-RV32-NEXT:    lw t0, 20(a1)
1731; CHECK-UNALIGNED-RV32-NEXT:    lw t1, 24(a1)
1732; CHECK-UNALIGNED-RV32-NEXT:    lw a1, 28(a1)
1733; CHECK-UNALIGNED-RV32-NEXT:    xor a6, a6, a7
1734; CHECK-UNALIGNED-RV32-NEXT:    xor a7, t2, t0
1735; CHECK-UNALIGNED-RV32-NEXT:    xor t0, t3, t1
1736; CHECK-UNALIGNED-RV32-NEXT:    xor a0, a0, a1
1737; CHECK-UNALIGNED-RV32-NEXT:    or a2, a2, a3
1738; CHECK-UNALIGNED-RV32-NEXT:    or a4, a4, a5
1739; CHECK-UNALIGNED-RV32-NEXT:    or a1, a6, a7
1740; CHECK-UNALIGNED-RV32-NEXT:    or a0, t0, a0
1741; CHECK-UNALIGNED-RV32-NEXT:    or a2, a2, a4
1742; CHECK-UNALIGNED-RV32-NEXT:    or a0, a1, a0
1743; CHECK-UNALIGNED-RV32-NEXT:    or a0, a2, a0
1744; CHECK-UNALIGNED-RV32-NEXT:    snez a0, a0
1745; CHECK-UNALIGNED-RV32-NEXT:    ret
1746;
1747; CHECK-UNALIGNED-RV64-LABEL: bcmp_size_32:
1748; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
1749; CHECK-UNALIGNED-RV64-NEXT:    ld a2, 0(a0)
1750; CHECK-UNALIGNED-RV64-NEXT:    ld a3, 8(a0)
1751; CHECK-UNALIGNED-RV64-NEXT:    ld a4, 16(a0)
1752; CHECK-UNALIGNED-RV64-NEXT:    ld a0, 24(a0)
1753; CHECK-UNALIGNED-RV64-NEXT:    ld a5, 0(a1)
1754; CHECK-UNALIGNED-RV64-NEXT:    ld a6, 8(a1)
1755; CHECK-UNALIGNED-RV64-NEXT:    ld a7, 16(a1)
1756; CHECK-UNALIGNED-RV64-NEXT:    ld a1, 24(a1)
1757; CHECK-UNALIGNED-RV64-NEXT:    xor a2, a2, a5
1758; CHECK-UNALIGNED-RV64-NEXT:    xor a3, a3, a6
1759; CHECK-UNALIGNED-RV64-NEXT:    xor a4, a4, a7
1760; CHECK-UNALIGNED-RV64-NEXT:    xor a0, a0, a1
1761; CHECK-UNALIGNED-RV64-NEXT:    or a2, a2, a3
1762; CHECK-UNALIGNED-RV64-NEXT:    or a0, a4, a0
1763; CHECK-UNALIGNED-RV64-NEXT:    or a0, a2, a0
1764; CHECK-UNALIGNED-RV64-NEXT:    snez a0, a0
1765; CHECK-UNALIGNED-RV64-NEXT:    ret
1766;
1767; CHECK-UNALIGNED-RV32-ZBB-LABEL: bcmp_size_32:
1768; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
1769; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
1770; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a0)
1771; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a4, 8(a0)
1772; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a5, 12(a0)
1773; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a6, 0(a1)
1774; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a7, 4(a1)
1775; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t0, 8(a1)
1776; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t1, 12(a1)
1777; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a2, a2, a6
1778; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a6, 16(a0)
1779; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t2, 20(a0)
1780; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t3, 24(a0)
1781; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 28(a0)
1782; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a3, a3, a7
1783; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a4, a4, t0
1784; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a5, a5, t1
1785; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a7, 16(a1)
1786; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t0, 20(a1)
1787; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw t1, 24(a1)
1788; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 28(a1)
1789; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a6, a6, a7
1790; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a7, t2, t0
1791; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor t0, t3, t1
1792; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xor a0, a0, a1
1793; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a2, a2, a3
1794; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a4, a4, a5
1795; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a1, a6, a7
1796; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, t0, a0
1797; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a2, a2, a4
1798; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a1, a0
1799; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a2, a0
1800; CHECK-UNALIGNED-RV32-ZBB-NEXT:    snez a0, a0
1801; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
1802;
1803; CHECK-UNALIGNED-RV64-ZBB-LABEL: bcmp_size_32:
1804; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
1805; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
1806; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a0)
1807; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a4, 16(a0)
1808; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 24(a0)
1809; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a5, 0(a1)
1810; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a6, 8(a1)
1811; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a7, 16(a1)
1812; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 24(a1)
1813; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a2, a2, a5
1814; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a3, a3, a6
1815; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a4, a4, a7
1816; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
1817; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a2, a2, a3
1818; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a4, a0
1819; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a2, a0
1820; CHECK-UNALIGNED-RV64-ZBB-NEXT:    snez a0, a0
1821; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
1822;
1823; CHECK-UNALIGNED-RV32-ZBKB-LABEL: bcmp_size_32:
1824; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
1825; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
1826; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a0)
1827; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a4, 8(a0)
1828; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a5, 12(a0)
1829; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a6, 0(a1)
1830; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a7, 4(a1)
1831; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t0, 8(a1)
1832; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t1, 12(a1)
1833; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a2, a2, a6
1834; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a6, 16(a0)
1835; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t2, 20(a0)
1836; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t3, 24(a0)
1837; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 28(a0)
1838; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a3, a3, a7
1839; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a4, a4, t0
1840; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a5, a5, t1
1841; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a7, 16(a1)
1842; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t0, 20(a1)
1843; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw t1, 24(a1)
1844; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 28(a1)
1845; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a6, a6, a7
1846; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a7, t2, t0
1847; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor t0, t3, t1
1848; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xor a0, a0, a1
1849; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a2, a2, a3
1850; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a4, a4, a5
1851; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a1, a6, a7
1852; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, t0, a0
1853; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a2, a2, a4
1854; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a1, a0
1855; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    or a0, a2, a0
1856; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    snez a0, a0
1857; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
1858;
1859; CHECK-UNALIGNED-RV64-ZBKB-LABEL: bcmp_size_32:
1860; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1861; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
1862; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a0)
1863; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a4, 16(a0)
1864; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 24(a0)
1865; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a5, 0(a1)
1866; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a6, 8(a1)
1867; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a7, 16(a1)
1868; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 24(a1)
1869; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a2, a2, a5
1870; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a3, a3, a6
1871; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a4, a4, a7
1872; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
1873; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a2, a2, a3
1874; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a4, a0
1875; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a2, a0
1876; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    snez a0, a0
1877; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
1878;
1879; CHECK-UNALIGNED-RV32-V-LABEL: bcmp_size_32:
1880; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
1881; CHECK-UNALIGNED-RV32-V-NEXT:    lw a2, 0(a0)
1882; CHECK-UNALIGNED-RV32-V-NEXT:    lw a3, 4(a0)
1883; CHECK-UNALIGNED-RV32-V-NEXT:    lw a4, 8(a0)
1884; CHECK-UNALIGNED-RV32-V-NEXT:    lw a5, 12(a0)
1885; CHECK-UNALIGNED-RV32-V-NEXT:    lw a6, 0(a1)
1886; CHECK-UNALIGNED-RV32-V-NEXT:    lw a7, 4(a1)
1887; CHECK-UNALIGNED-RV32-V-NEXT:    lw t0, 8(a1)
1888; CHECK-UNALIGNED-RV32-V-NEXT:    lw t1, 12(a1)
1889; CHECK-UNALIGNED-RV32-V-NEXT:    xor a2, a2, a6
1890; CHECK-UNALIGNED-RV32-V-NEXT:    lw a6, 16(a0)
1891; CHECK-UNALIGNED-RV32-V-NEXT:    lw t2, 20(a0)
1892; CHECK-UNALIGNED-RV32-V-NEXT:    lw t3, 24(a0)
1893; CHECK-UNALIGNED-RV32-V-NEXT:    lw a0, 28(a0)
1894; CHECK-UNALIGNED-RV32-V-NEXT:    xor a3, a3, a7
1895; CHECK-UNALIGNED-RV32-V-NEXT:    xor a4, a4, t0
1896; CHECK-UNALIGNED-RV32-V-NEXT:    xor a5, a5, t1
1897; CHECK-UNALIGNED-RV32-V-NEXT:    lw a7, 16(a1)
1898; CHECK-UNALIGNED-RV32-V-NEXT:    lw t0, 20(a1)
1899; CHECK-UNALIGNED-RV32-V-NEXT:    lw t1, 24(a1)
1900; CHECK-UNALIGNED-RV32-V-NEXT:    lw a1, 28(a1)
1901; CHECK-UNALIGNED-RV32-V-NEXT:    xor a6, a6, a7
1902; CHECK-UNALIGNED-RV32-V-NEXT:    xor a7, t2, t0
1903; CHECK-UNALIGNED-RV32-V-NEXT:    xor t0, t3, t1
1904; CHECK-UNALIGNED-RV32-V-NEXT:    xor a0, a0, a1
1905; CHECK-UNALIGNED-RV32-V-NEXT:    or a2, a2, a3
1906; CHECK-UNALIGNED-RV32-V-NEXT:    or a4, a4, a5
1907; CHECK-UNALIGNED-RV32-V-NEXT:    or a1, a6, a7
1908; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, t0, a0
1909; CHECK-UNALIGNED-RV32-V-NEXT:    or a2, a2, a4
1910; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a1, a0
1911; CHECK-UNALIGNED-RV32-V-NEXT:    or a0, a2, a0
1912; CHECK-UNALIGNED-RV32-V-NEXT:    snez a0, a0
1913; CHECK-UNALIGNED-RV32-V-NEXT:    ret
1914;
1915; CHECK-UNALIGNED-RV64-V-LABEL: bcmp_size_32:
1916; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
1917; CHECK-UNALIGNED-RV64-V-NEXT:    ld a2, 0(a0)
1918; CHECK-UNALIGNED-RV64-V-NEXT:    ld a3, 8(a0)
1919; CHECK-UNALIGNED-RV64-V-NEXT:    ld a4, 16(a0)
1920; CHECK-UNALIGNED-RV64-V-NEXT:    ld a0, 24(a0)
1921; CHECK-UNALIGNED-RV64-V-NEXT:    ld a5, 0(a1)
1922; CHECK-UNALIGNED-RV64-V-NEXT:    ld a6, 8(a1)
1923; CHECK-UNALIGNED-RV64-V-NEXT:    ld a7, 16(a1)
1924; CHECK-UNALIGNED-RV64-V-NEXT:    ld a1, 24(a1)
1925; CHECK-UNALIGNED-RV64-V-NEXT:    xor a2, a2, a5
1926; CHECK-UNALIGNED-RV64-V-NEXT:    xor a3, a3, a6
1927; CHECK-UNALIGNED-RV64-V-NEXT:    xor a4, a4, a7
1928; CHECK-UNALIGNED-RV64-V-NEXT:    xor a0, a0, a1
1929; CHECK-UNALIGNED-RV64-V-NEXT:    or a2, a2, a3
1930; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a4, a0
1931; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a2, a0
1932; CHECK-UNALIGNED-RV64-V-NEXT:    snez a0, a0
1933; CHECK-UNALIGNED-RV64-V-NEXT:    ret
1934entry:
1935  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 32)
1936  ret i32 %bcmp
1937}
1938
1939define i32 @bcmp_size_63(ptr %s1, ptr %s2) nounwind {
1940; CHECK-RV32-LABEL: bcmp_size_63:
1941; CHECK-RV32:       # %bb.0: # %entry
1942; CHECK-RV32-NEXT:    addi sp, sp, -16
1943; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1944; CHECK-RV32-NEXT:    li a2, 63
1945; CHECK-RV32-NEXT:    call bcmp
1946; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1947; CHECK-RV32-NEXT:    addi sp, sp, 16
1948; CHECK-RV32-NEXT:    ret
1949;
1950; CHECK-ALIGNED-RV64-LABEL: bcmp_size_63:
1951; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
1952; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
1953; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1954; CHECK-ALIGNED-RV64-NEXT:    li a2, 63
1955; CHECK-ALIGNED-RV64-NEXT:    call bcmp
1956; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1957; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
1958; CHECK-ALIGNED-RV64-NEXT:    ret
1959;
1960; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_63:
1961; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
1962; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
1963; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1964; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 63
1965; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
1966; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1967; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
1968; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
1969;
1970; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_63:
1971; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
1972; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
1973; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1974; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 63
1975; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
1976; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1977; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
1978; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
1979;
1980; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_63:
1981; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
1982; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
1983; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1984; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 63
1985; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
1986; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1987; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
1988; CHECK-ALIGNED-RV64-V-NEXT:    ret
1989;
1990; CHECK-UNALIGNED-RV64-LABEL: bcmp_size_63:
1991; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
1992; CHECK-UNALIGNED-RV64-NEXT:    ld a2, 0(a0)
1993; CHECK-UNALIGNED-RV64-NEXT:    ld a3, 8(a0)
1994; CHECK-UNALIGNED-RV64-NEXT:    ld a4, 16(a0)
1995; CHECK-UNALIGNED-RV64-NEXT:    ld a5, 24(a0)
1996; CHECK-UNALIGNED-RV64-NEXT:    ld a6, 0(a1)
1997; CHECK-UNALIGNED-RV64-NEXT:    ld a7, 8(a1)
1998; CHECK-UNALIGNED-RV64-NEXT:    ld t0, 16(a1)
1999; CHECK-UNALIGNED-RV64-NEXT:    ld t1, 24(a1)
2000; CHECK-UNALIGNED-RV64-NEXT:    xor a2, a2, a6
2001; CHECK-UNALIGNED-RV64-NEXT:    ld a6, 32(a0)
2002; CHECK-UNALIGNED-RV64-NEXT:    ld t2, 40(a0)
2003; CHECK-UNALIGNED-RV64-NEXT:    ld t3, 48(a0)
2004; CHECK-UNALIGNED-RV64-NEXT:    ld a0, 55(a0)
2005; CHECK-UNALIGNED-RV64-NEXT:    xor a3, a3, a7
2006; CHECK-UNALIGNED-RV64-NEXT:    xor a4, a4, t0
2007; CHECK-UNALIGNED-RV64-NEXT:    xor a5, a5, t1
2008; CHECK-UNALIGNED-RV64-NEXT:    ld a7, 32(a1)
2009; CHECK-UNALIGNED-RV64-NEXT:    ld t0, 40(a1)
2010; CHECK-UNALIGNED-RV64-NEXT:    ld t1, 48(a1)
2011; CHECK-UNALIGNED-RV64-NEXT:    ld a1, 55(a1)
2012; CHECK-UNALIGNED-RV64-NEXT:    xor a6, a6, a7
2013; CHECK-UNALIGNED-RV64-NEXT:    xor a7, t2, t0
2014; CHECK-UNALIGNED-RV64-NEXT:    xor t0, t3, t1
2015; CHECK-UNALIGNED-RV64-NEXT:    xor a0, a0, a1
2016; CHECK-UNALIGNED-RV64-NEXT:    or a2, a2, a3
2017; CHECK-UNALIGNED-RV64-NEXT:    or a4, a4, a5
2018; CHECK-UNALIGNED-RV64-NEXT:    or a1, a6, a7
2019; CHECK-UNALIGNED-RV64-NEXT:    or a0, t0, a0
2020; CHECK-UNALIGNED-RV64-NEXT:    or a2, a2, a4
2021; CHECK-UNALIGNED-RV64-NEXT:    or a0, a1, a0
2022; CHECK-UNALIGNED-RV64-NEXT:    or a0, a2, a0
2023; CHECK-UNALIGNED-RV64-NEXT:    snez a0, a0
2024; CHECK-UNALIGNED-RV64-NEXT:    ret
2025;
2026; CHECK-UNALIGNED-RV64-ZBB-LABEL: bcmp_size_63:
2027; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
2028; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
2029; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a0)
2030; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a4, 16(a0)
2031; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a5, 24(a0)
2032; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a6, 0(a1)
2033; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a7, 8(a1)
2034; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t0, 16(a1)
2035; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t1, 24(a1)
2036; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a2, a2, a6
2037; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a6, 32(a0)
2038; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t2, 40(a0)
2039; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t3, 48(a0)
2040; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 55(a0)
2041; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a3, a3, a7
2042; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a4, a4, t0
2043; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a5, a5, t1
2044; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a7, 32(a1)
2045; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t0, 40(a1)
2046; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t1, 48(a1)
2047; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 55(a1)
2048; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a6, a6, a7
2049; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a7, t2, t0
2050; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor t0, t3, t1
2051; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
2052; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a2, a2, a3
2053; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a4, a4, a5
2054; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a1, a6, a7
2055; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, t0, a0
2056; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a2, a2, a4
2057; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a1, a0
2058; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a2, a0
2059; CHECK-UNALIGNED-RV64-ZBB-NEXT:    snez a0, a0
2060; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
2061;
2062; CHECK-UNALIGNED-RV64-ZBKB-LABEL: bcmp_size_63:
2063; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2064; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
2065; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a0)
2066; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a4, 16(a0)
2067; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a5, 24(a0)
2068; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a6, 0(a1)
2069; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a7, 8(a1)
2070; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t0, 16(a1)
2071; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t1, 24(a1)
2072; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a2, a2, a6
2073; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a6, 32(a0)
2074; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t2, 40(a0)
2075; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t3, 48(a0)
2076; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 55(a0)
2077; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a3, a3, a7
2078; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a4, a4, t0
2079; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a5, a5, t1
2080; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a7, 32(a1)
2081; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t0, 40(a1)
2082; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t1, 48(a1)
2083; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 55(a1)
2084; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a6, a6, a7
2085; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a7, t2, t0
2086; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor t0, t3, t1
2087; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
2088; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a2, a2, a3
2089; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a4, a4, a5
2090; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a1, a6, a7
2091; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, t0, a0
2092; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a2, a2, a4
2093; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a1, a0
2094; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a2, a0
2095; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    snez a0, a0
2096; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
2097;
2098; CHECK-UNALIGNED-RV64-V-LABEL: bcmp_size_63:
2099; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
2100; CHECK-UNALIGNED-RV64-V-NEXT:    ld a2, 0(a0)
2101; CHECK-UNALIGNED-RV64-V-NEXT:    ld a3, 8(a0)
2102; CHECK-UNALIGNED-RV64-V-NEXT:    ld a4, 16(a0)
2103; CHECK-UNALIGNED-RV64-V-NEXT:    ld a5, 24(a0)
2104; CHECK-UNALIGNED-RV64-V-NEXT:    ld a6, 0(a1)
2105; CHECK-UNALIGNED-RV64-V-NEXT:    ld a7, 8(a1)
2106; CHECK-UNALIGNED-RV64-V-NEXT:    ld t0, 16(a1)
2107; CHECK-UNALIGNED-RV64-V-NEXT:    ld t1, 24(a1)
2108; CHECK-UNALIGNED-RV64-V-NEXT:    xor a2, a2, a6
2109; CHECK-UNALIGNED-RV64-V-NEXT:    ld a6, 32(a0)
2110; CHECK-UNALIGNED-RV64-V-NEXT:    ld t2, 40(a0)
2111; CHECK-UNALIGNED-RV64-V-NEXT:    ld t3, 48(a0)
2112; CHECK-UNALIGNED-RV64-V-NEXT:    ld a0, 55(a0)
2113; CHECK-UNALIGNED-RV64-V-NEXT:    xor a3, a3, a7
2114; CHECK-UNALIGNED-RV64-V-NEXT:    xor a4, a4, t0
2115; CHECK-UNALIGNED-RV64-V-NEXT:    xor a5, a5, t1
2116; CHECK-UNALIGNED-RV64-V-NEXT:    ld a7, 32(a1)
2117; CHECK-UNALIGNED-RV64-V-NEXT:    ld t0, 40(a1)
2118; CHECK-UNALIGNED-RV64-V-NEXT:    ld t1, 48(a1)
2119; CHECK-UNALIGNED-RV64-V-NEXT:    ld a1, 55(a1)
2120; CHECK-UNALIGNED-RV64-V-NEXT:    xor a6, a6, a7
2121; CHECK-UNALIGNED-RV64-V-NEXT:    xor a7, t2, t0
2122; CHECK-UNALIGNED-RV64-V-NEXT:    xor t0, t3, t1
2123; CHECK-UNALIGNED-RV64-V-NEXT:    xor a0, a0, a1
2124; CHECK-UNALIGNED-RV64-V-NEXT:    or a2, a2, a3
2125; CHECK-UNALIGNED-RV64-V-NEXT:    or a4, a4, a5
2126; CHECK-UNALIGNED-RV64-V-NEXT:    or a1, a6, a7
2127; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, t0, a0
2128; CHECK-UNALIGNED-RV64-V-NEXT:    or a2, a2, a4
2129; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a1, a0
2130; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a2, a0
2131; CHECK-UNALIGNED-RV64-V-NEXT:    snez a0, a0
2132; CHECK-UNALIGNED-RV64-V-NEXT:    ret
2133entry:
2134  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 63)
2135  ret i32 %bcmp
2136}
2137
2138define i32 @bcmp_size_64(ptr %s1, ptr %s2) nounwind {
2139; CHECK-RV32-LABEL: bcmp_size_64:
2140; CHECK-RV32:       # %bb.0: # %entry
2141; CHECK-RV32-NEXT:    addi sp, sp, -16
2142; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2143; CHECK-RV32-NEXT:    li a2, 64
2144; CHECK-RV32-NEXT:    call bcmp
2145; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2146; CHECK-RV32-NEXT:    addi sp, sp, 16
2147; CHECK-RV32-NEXT:    ret
2148;
2149; CHECK-ALIGNED-RV64-LABEL: bcmp_size_64:
2150; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
2151; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
2152; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2153; CHECK-ALIGNED-RV64-NEXT:    li a2, 64
2154; CHECK-ALIGNED-RV64-NEXT:    call bcmp
2155; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2156; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
2157; CHECK-ALIGNED-RV64-NEXT:    ret
2158;
2159; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_size_64:
2160; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
2161; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
2162; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2163; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 64
2164; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
2165; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2166; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
2167; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
2168;
2169; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_size_64:
2170; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2171; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
2172; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2173; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 64
2174; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
2175; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2176; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
2177; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
2178;
2179; CHECK-ALIGNED-RV64-V-LABEL: bcmp_size_64:
2180; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
2181; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
2182; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2183; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 64
2184; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
2185; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2186; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
2187; CHECK-ALIGNED-RV64-V-NEXT:    ret
2188;
2189; CHECK-UNALIGNED-RV64-LABEL: bcmp_size_64:
2190; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
2191; CHECK-UNALIGNED-RV64-NEXT:    ld a2, 0(a0)
2192; CHECK-UNALIGNED-RV64-NEXT:    ld a3, 8(a0)
2193; CHECK-UNALIGNED-RV64-NEXT:    ld a4, 16(a0)
2194; CHECK-UNALIGNED-RV64-NEXT:    ld a5, 24(a0)
2195; CHECK-UNALIGNED-RV64-NEXT:    ld a6, 0(a1)
2196; CHECK-UNALIGNED-RV64-NEXT:    ld a7, 8(a1)
2197; CHECK-UNALIGNED-RV64-NEXT:    ld t0, 16(a1)
2198; CHECK-UNALIGNED-RV64-NEXT:    ld t1, 24(a1)
2199; CHECK-UNALIGNED-RV64-NEXT:    xor a2, a2, a6
2200; CHECK-UNALIGNED-RV64-NEXT:    ld a6, 32(a0)
2201; CHECK-UNALIGNED-RV64-NEXT:    ld t2, 40(a0)
2202; CHECK-UNALIGNED-RV64-NEXT:    ld t3, 48(a0)
2203; CHECK-UNALIGNED-RV64-NEXT:    ld a0, 56(a0)
2204; CHECK-UNALIGNED-RV64-NEXT:    xor a3, a3, a7
2205; CHECK-UNALIGNED-RV64-NEXT:    xor a4, a4, t0
2206; CHECK-UNALIGNED-RV64-NEXT:    xor a5, a5, t1
2207; CHECK-UNALIGNED-RV64-NEXT:    ld a7, 32(a1)
2208; CHECK-UNALIGNED-RV64-NEXT:    ld t0, 40(a1)
2209; CHECK-UNALIGNED-RV64-NEXT:    ld t1, 48(a1)
2210; CHECK-UNALIGNED-RV64-NEXT:    ld a1, 56(a1)
2211; CHECK-UNALIGNED-RV64-NEXT:    xor a6, a6, a7
2212; CHECK-UNALIGNED-RV64-NEXT:    xor a7, t2, t0
2213; CHECK-UNALIGNED-RV64-NEXT:    xor t0, t3, t1
2214; CHECK-UNALIGNED-RV64-NEXT:    xor a0, a0, a1
2215; CHECK-UNALIGNED-RV64-NEXT:    or a2, a2, a3
2216; CHECK-UNALIGNED-RV64-NEXT:    or a4, a4, a5
2217; CHECK-UNALIGNED-RV64-NEXT:    or a1, a6, a7
2218; CHECK-UNALIGNED-RV64-NEXT:    or a0, t0, a0
2219; CHECK-UNALIGNED-RV64-NEXT:    or a2, a2, a4
2220; CHECK-UNALIGNED-RV64-NEXT:    or a0, a1, a0
2221; CHECK-UNALIGNED-RV64-NEXT:    or a0, a2, a0
2222; CHECK-UNALIGNED-RV64-NEXT:    snez a0, a0
2223; CHECK-UNALIGNED-RV64-NEXT:    ret
2224;
2225; CHECK-UNALIGNED-RV64-ZBB-LABEL: bcmp_size_64:
2226; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
2227; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
2228; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a0)
2229; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a4, 16(a0)
2230; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a5, 24(a0)
2231; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a6, 0(a1)
2232; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a7, 8(a1)
2233; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t0, 16(a1)
2234; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t1, 24(a1)
2235; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a2, a2, a6
2236; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a6, 32(a0)
2237; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t2, 40(a0)
2238; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t3, 48(a0)
2239; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 56(a0)
2240; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a3, a3, a7
2241; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a4, a4, t0
2242; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a5, a5, t1
2243; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a7, 32(a1)
2244; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t0, 40(a1)
2245; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld t1, 48(a1)
2246; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 56(a1)
2247; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a6, a6, a7
2248; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a7, t2, t0
2249; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor t0, t3, t1
2250; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
2251; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a2, a2, a3
2252; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a4, a4, a5
2253; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a1, a6, a7
2254; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, t0, a0
2255; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a2, a2, a4
2256; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a1, a0
2257; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a2, a0
2258; CHECK-UNALIGNED-RV64-ZBB-NEXT:    snez a0, a0
2259; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
2260;
2261; CHECK-UNALIGNED-RV64-ZBKB-LABEL: bcmp_size_64:
2262; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2263; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
2264; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a0)
2265; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a4, 16(a0)
2266; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a5, 24(a0)
2267; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a6, 0(a1)
2268; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a7, 8(a1)
2269; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t0, 16(a1)
2270; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t1, 24(a1)
2271; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a2, a2, a6
2272; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a6, 32(a0)
2273; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t2, 40(a0)
2274; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t3, 48(a0)
2275; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 56(a0)
2276; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a3, a3, a7
2277; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a4, a4, t0
2278; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a5, a5, t1
2279; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a7, 32(a1)
2280; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t0, 40(a1)
2281; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld t1, 48(a1)
2282; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 56(a1)
2283; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a6, a6, a7
2284; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a7, t2, t0
2285; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor t0, t3, t1
2286; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
2287; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a2, a2, a3
2288; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a4, a4, a5
2289; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a1, a6, a7
2290; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, t0, a0
2291; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a2, a2, a4
2292; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a1, a0
2293; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a2, a0
2294; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    snez a0, a0
2295; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
2296;
2297; CHECK-UNALIGNED-RV64-V-LABEL: bcmp_size_64:
2298; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
2299; CHECK-UNALIGNED-RV64-V-NEXT:    ld a2, 0(a0)
2300; CHECK-UNALIGNED-RV64-V-NEXT:    ld a3, 8(a0)
2301; CHECK-UNALIGNED-RV64-V-NEXT:    ld a4, 16(a0)
2302; CHECK-UNALIGNED-RV64-V-NEXT:    ld a5, 24(a0)
2303; CHECK-UNALIGNED-RV64-V-NEXT:    ld a6, 0(a1)
2304; CHECK-UNALIGNED-RV64-V-NEXT:    ld a7, 8(a1)
2305; CHECK-UNALIGNED-RV64-V-NEXT:    ld t0, 16(a1)
2306; CHECK-UNALIGNED-RV64-V-NEXT:    ld t1, 24(a1)
2307; CHECK-UNALIGNED-RV64-V-NEXT:    xor a2, a2, a6
2308; CHECK-UNALIGNED-RV64-V-NEXT:    ld a6, 32(a0)
2309; CHECK-UNALIGNED-RV64-V-NEXT:    ld t2, 40(a0)
2310; CHECK-UNALIGNED-RV64-V-NEXT:    ld t3, 48(a0)
2311; CHECK-UNALIGNED-RV64-V-NEXT:    ld a0, 56(a0)
2312; CHECK-UNALIGNED-RV64-V-NEXT:    xor a3, a3, a7
2313; CHECK-UNALIGNED-RV64-V-NEXT:    xor a4, a4, t0
2314; CHECK-UNALIGNED-RV64-V-NEXT:    xor a5, a5, t1
2315; CHECK-UNALIGNED-RV64-V-NEXT:    ld a7, 32(a1)
2316; CHECK-UNALIGNED-RV64-V-NEXT:    ld t0, 40(a1)
2317; CHECK-UNALIGNED-RV64-V-NEXT:    ld t1, 48(a1)
2318; CHECK-UNALIGNED-RV64-V-NEXT:    ld a1, 56(a1)
2319; CHECK-UNALIGNED-RV64-V-NEXT:    xor a6, a6, a7
2320; CHECK-UNALIGNED-RV64-V-NEXT:    xor a7, t2, t0
2321; CHECK-UNALIGNED-RV64-V-NEXT:    xor t0, t3, t1
2322; CHECK-UNALIGNED-RV64-V-NEXT:    xor a0, a0, a1
2323; CHECK-UNALIGNED-RV64-V-NEXT:    or a2, a2, a3
2324; CHECK-UNALIGNED-RV64-V-NEXT:    or a4, a4, a5
2325; CHECK-UNALIGNED-RV64-V-NEXT:    or a1, a6, a7
2326; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, t0, a0
2327; CHECK-UNALIGNED-RV64-V-NEXT:    or a2, a2, a4
2328; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a1, a0
2329; CHECK-UNALIGNED-RV64-V-NEXT:    or a0, a2, a0
2330; CHECK-UNALIGNED-RV64-V-NEXT:    snez a0, a0
2331; CHECK-UNALIGNED-RV64-V-NEXT:    ret
2332entry:
2333  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 64)
2334  ret i32 %bcmp
2335}
2336
2337define i32 @bcmp_size_127(ptr %s1, ptr %s2) nounwind {
2338; CHECK-RV32-LABEL: bcmp_size_127:
2339; CHECK-RV32:       # %bb.0: # %entry
2340; CHECK-RV32-NEXT:    addi sp, sp, -16
2341; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2342; CHECK-RV32-NEXT:    li a2, 127
2343; CHECK-RV32-NEXT:    call bcmp
2344; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2345; CHECK-RV32-NEXT:    addi sp, sp, 16
2346; CHECK-RV32-NEXT:    ret
2347;
2348; CHECK-RV64-LABEL: bcmp_size_127:
2349; CHECK-RV64:       # %bb.0: # %entry
2350; CHECK-RV64-NEXT:    addi sp, sp, -16
2351; CHECK-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2352; CHECK-RV64-NEXT:    li a2, 127
2353; CHECK-RV64-NEXT:    call bcmp
2354; CHECK-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2355; CHECK-RV64-NEXT:    addi sp, sp, 16
2356; CHECK-RV64-NEXT:    ret
2357entry:
2358  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 127)
2359  ret i32 %bcmp
2360}
2361
2362define i32 @bcmp_size_128(ptr %s1, ptr %s2) nounwind {
2363; CHECK-RV32-LABEL: bcmp_size_128:
2364; CHECK-RV32:       # %bb.0: # %entry
2365; CHECK-RV32-NEXT:    addi sp, sp, -16
2366; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2367; CHECK-RV32-NEXT:    li a2, 128
2368; CHECK-RV32-NEXT:    call bcmp
2369; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2370; CHECK-RV32-NEXT:    addi sp, sp, 16
2371; CHECK-RV32-NEXT:    ret
2372;
2373; CHECK-RV64-LABEL: bcmp_size_128:
2374; CHECK-RV64:       # %bb.0: # %entry
2375; CHECK-RV64-NEXT:    addi sp, sp, -16
2376; CHECK-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2377; CHECK-RV64-NEXT:    li a2, 128
2378; CHECK-RV64-NEXT:    call bcmp
2379; CHECK-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2380; CHECK-RV64-NEXT:    addi sp, sp, 16
2381; CHECK-RV64-NEXT:    ret
2382entry:
2383  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 128)
2384  ret i32 %bcmp
2385}
2386
2387define i32 @bcmp_size_runtime(ptr %s1, ptr %s2, iXLen %len) nounwind {
2388; CHECK-RV32-LABEL: bcmp_size_runtime:
2389; CHECK-RV32:       # %bb.0: # %entry
2390; CHECK-RV32-NEXT:    addi sp, sp, -16
2391; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2392; CHECK-RV32-NEXT:    call bcmp
2393; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2394; CHECK-RV32-NEXT:    addi sp, sp, 16
2395; CHECK-RV32-NEXT:    ret
2396;
2397; CHECK-RV64-LABEL: bcmp_size_runtime:
2398; CHECK-RV64:       # %bb.0: # %entry
2399; CHECK-RV64-NEXT:    addi sp, sp, -16
2400; CHECK-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2401; CHECK-RV64-NEXT:    call bcmp
2402; CHECK-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2403; CHECK-RV64-NEXT:    addi sp, sp, 16
2404; CHECK-RV64-NEXT:    ret
2405entry:
2406  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen %len)
2407  ret i32 %bcmp
2408}
2409
2410define i1 @bcmp_eq_zero(ptr %s1, ptr %s2) nounwind {
2411; CHECK-ALIGNED-RV32-LABEL: bcmp_eq_zero:
2412; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
2413; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
2414; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2415; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
2416; CHECK-ALIGNED-RV32-NEXT:    call bcmp
2417; CHECK-ALIGNED-RV32-NEXT:    seqz a0, a0
2418; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2419; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
2420; CHECK-ALIGNED-RV32-NEXT:    ret
2421;
2422; CHECK-ALIGNED-RV64-LABEL: bcmp_eq_zero:
2423; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
2424; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
2425; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2426; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
2427; CHECK-ALIGNED-RV64-NEXT:    call bcmp
2428; CHECK-ALIGNED-RV64-NEXT:    seqz a0, a0
2429; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2430; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
2431; CHECK-ALIGNED-RV64-NEXT:    ret
2432;
2433; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_eq_zero:
2434; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
2435; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
2436; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2437; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
2438; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
2439; CHECK-ALIGNED-RV32-ZBB-NEXT:    seqz a0, a0
2440; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2441; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
2442; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
2443;
2444; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_eq_zero:
2445; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
2446; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
2447; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2448; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
2449; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
2450; CHECK-ALIGNED-RV64-ZBB-NEXT:    seqz a0, a0
2451; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2452; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
2453; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
2454;
2455; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_eq_zero:
2456; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
2457; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
2458; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2459; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
2460; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
2461; CHECK-ALIGNED-RV32-ZBKB-NEXT:    seqz a0, a0
2462; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2463; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
2464; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
2465;
2466; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_eq_zero:
2467; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2468; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
2469; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2470; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
2471; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
2472; CHECK-ALIGNED-RV64-ZBKB-NEXT:    seqz a0, a0
2473; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2474; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
2475; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
2476;
2477; CHECK-ALIGNED-RV32-V-LABEL: bcmp_eq_zero:
2478; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
2479; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
2480; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2481; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
2482; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
2483; CHECK-ALIGNED-RV32-V-NEXT:    seqz a0, a0
2484; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2485; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
2486; CHECK-ALIGNED-RV32-V-NEXT:    ret
2487;
2488; CHECK-ALIGNED-RV64-V-LABEL: bcmp_eq_zero:
2489; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
2490; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
2491; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2492; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
2493; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
2494; CHECK-ALIGNED-RV64-V-NEXT:    seqz a0, a0
2495; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2496; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
2497; CHECK-ALIGNED-RV64-V-NEXT:    ret
2498;
2499; CHECK-UNALIGNED-LABEL: bcmp_eq_zero:
2500; CHECK-UNALIGNED:       # %bb.0: # %entry
2501; CHECK-UNALIGNED-NEXT:    lw a0, 0(a0)
2502; CHECK-UNALIGNED-NEXT:    lw a1, 0(a1)
2503; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
2504; CHECK-UNALIGNED-NEXT:    seqz a0, a0
2505; CHECK-UNALIGNED-NEXT:    ret
2506entry:
2507  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 4)
2508  %ret = icmp eq i32 %bcmp, 0
2509  ret i1 %ret
2510}
2511
2512define i1 @bcmp_lt_zero(ptr %s1, ptr %s2) nounwind {
2513; CHECK-ALIGNED-RV32-LABEL: bcmp_lt_zero:
2514; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
2515; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
2516; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2517; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
2518; CHECK-ALIGNED-RV32-NEXT:    call bcmp
2519; CHECK-ALIGNED-RV32-NEXT:    srli a0, a0, 31
2520; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2521; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
2522; CHECK-ALIGNED-RV32-NEXT:    ret
2523;
2524; CHECK-ALIGNED-RV64-LABEL: bcmp_lt_zero:
2525; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
2526; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
2527; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2528; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
2529; CHECK-ALIGNED-RV64-NEXT:    call bcmp
2530; CHECK-ALIGNED-RV64-NEXT:    slti a0, a0, 0
2531; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2532; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
2533; CHECK-ALIGNED-RV64-NEXT:    ret
2534;
2535; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_lt_zero:
2536; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
2537; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
2538; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2539; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
2540; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
2541; CHECK-ALIGNED-RV32-ZBB-NEXT:    srli a0, a0, 31
2542; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2543; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
2544; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
2545;
2546; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_lt_zero:
2547; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
2548; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
2549; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2550; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
2551; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
2552; CHECK-ALIGNED-RV64-ZBB-NEXT:    slti a0, a0, 0
2553; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2554; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
2555; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
2556;
2557; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_lt_zero:
2558; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
2559; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
2560; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2561; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
2562; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
2563; CHECK-ALIGNED-RV32-ZBKB-NEXT:    srli a0, a0, 31
2564; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2565; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
2566; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
2567;
2568; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_lt_zero:
2569; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2570; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
2571; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2572; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
2573; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
2574; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slti a0, a0, 0
2575; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2576; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
2577; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
2578;
2579; CHECK-ALIGNED-RV32-V-LABEL: bcmp_lt_zero:
2580; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
2581; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
2582; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2583; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
2584; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
2585; CHECK-ALIGNED-RV32-V-NEXT:    srli a0, a0, 31
2586; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2587; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
2588; CHECK-ALIGNED-RV32-V-NEXT:    ret
2589;
2590; CHECK-ALIGNED-RV64-V-LABEL: bcmp_lt_zero:
2591; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
2592; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
2593; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2594; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
2595; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
2596; CHECK-ALIGNED-RV64-V-NEXT:    slti a0, a0, 0
2597; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2598; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
2599; CHECK-ALIGNED-RV64-V-NEXT:    ret
2600;
2601; CHECK-UNALIGNED-LABEL: bcmp_lt_zero:
2602; CHECK-UNALIGNED:       # %bb.0: # %entry
2603; CHECK-UNALIGNED-NEXT:    li a0, 0
2604; CHECK-UNALIGNED-NEXT:    ret
2605entry:
2606  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 4)
2607  %ret = icmp slt i32 %bcmp, 0
2608  ret i1 %ret
2609}
2610
2611define i1 @bcmp_gt_zero(ptr %s1, ptr %s2) nounwind {
2612; CHECK-ALIGNED-RV32-LABEL: bcmp_gt_zero:
2613; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
2614; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
2615; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2616; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
2617; CHECK-ALIGNED-RV32-NEXT:    call bcmp
2618; CHECK-ALIGNED-RV32-NEXT:    sgtz a0, a0
2619; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2620; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
2621; CHECK-ALIGNED-RV32-NEXT:    ret
2622;
2623; CHECK-ALIGNED-RV64-LABEL: bcmp_gt_zero:
2624; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
2625; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
2626; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2627; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
2628; CHECK-ALIGNED-RV64-NEXT:    call bcmp
2629; CHECK-ALIGNED-RV64-NEXT:    sgtz a0, a0
2630; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2631; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
2632; CHECK-ALIGNED-RV64-NEXT:    ret
2633;
2634; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_gt_zero:
2635; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
2636; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
2637; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2638; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
2639; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
2640; CHECK-ALIGNED-RV32-ZBB-NEXT:    sgtz a0, a0
2641; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2642; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
2643; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
2644;
2645; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_gt_zero:
2646; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
2647; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
2648; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2649; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
2650; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
2651; CHECK-ALIGNED-RV64-ZBB-NEXT:    sgtz a0, a0
2652; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2653; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
2654; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
2655;
2656; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_gt_zero:
2657; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
2658; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
2659; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2660; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
2661; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
2662; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sgtz a0, a0
2663; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2664; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
2665; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
2666;
2667; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_gt_zero:
2668; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2669; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
2670; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2671; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
2672; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
2673; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sgtz a0, a0
2674; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2675; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
2676; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
2677;
2678; CHECK-ALIGNED-RV32-V-LABEL: bcmp_gt_zero:
2679; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
2680; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
2681; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2682; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
2683; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
2684; CHECK-ALIGNED-RV32-V-NEXT:    sgtz a0, a0
2685; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2686; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
2687; CHECK-ALIGNED-RV32-V-NEXT:    ret
2688;
2689; CHECK-ALIGNED-RV64-V-LABEL: bcmp_gt_zero:
2690; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
2691; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
2692; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2693; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
2694; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
2695; CHECK-ALIGNED-RV64-V-NEXT:    sgtz a0, a0
2696; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2697; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
2698; CHECK-ALIGNED-RV64-V-NEXT:    ret
2699;
2700; CHECK-UNALIGNED-LABEL: bcmp_gt_zero:
2701; CHECK-UNALIGNED:       # %bb.0: # %entry
2702; CHECK-UNALIGNED-NEXT:    lw a0, 0(a0)
2703; CHECK-UNALIGNED-NEXT:    lw a1, 0(a1)
2704; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
2705; CHECK-UNALIGNED-NEXT:    snez a0, a0
2706; CHECK-UNALIGNED-NEXT:    ret
2707entry:
2708  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 4)
2709  %ret = icmp sgt i32 %bcmp, 0
2710  ret i1 %ret
2711}
2712
2713define i1 @bcmp_le_zero(ptr %s1, ptr %s2) nounwind {
2714; CHECK-ALIGNED-RV32-LABEL: bcmp_le_zero:
2715; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
2716; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
2717; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2718; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
2719; CHECK-ALIGNED-RV32-NEXT:    call bcmp
2720; CHECK-ALIGNED-RV32-NEXT:    slti a0, a0, 1
2721; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2722; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
2723; CHECK-ALIGNED-RV32-NEXT:    ret
2724;
2725; CHECK-ALIGNED-RV64-LABEL: bcmp_le_zero:
2726; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
2727; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
2728; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2729; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
2730; CHECK-ALIGNED-RV64-NEXT:    call bcmp
2731; CHECK-ALIGNED-RV64-NEXT:    slti a0, a0, 1
2732; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2733; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
2734; CHECK-ALIGNED-RV64-NEXT:    ret
2735;
2736; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_le_zero:
2737; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
2738; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
2739; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2740; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
2741; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
2742; CHECK-ALIGNED-RV32-ZBB-NEXT:    slti a0, a0, 1
2743; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2744; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
2745; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
2746;
2747; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_le_zero:
2748; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
2749; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
2750; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2751; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
2752; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
2753; CHECK-ALIGNED-RV64-ZBB-NEXT:    slti a0, a0, 1
2754; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2755; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
2756; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
2757;
2758; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_le_zero:
2759; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
2760; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
2761; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2762; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
2763; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
2764; CHECK-ALIGNED-RV32-ZBKB-NEXT:    slti a0, a0, 1
2765; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2766; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
2767; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
2768;
2769; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_le_zero:
2770; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2771; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
2772; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2773; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
2774; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
2775; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slti a0, a0, 1
2776; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2777; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
2778; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
2779;
2780; CHECK-ALIGNED-RV32-V-LABEL: bcmp_le_zero:
2781; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
2782; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
2783; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2784; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
2785; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
2786; CHECK-ALIGNED-RV32-V-NEXT:    slti a0, a0, 1
2787; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2788; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
2789; CHECK-ALIGNED-RV32-V-NEXT:    ret
2790;
2791; CHECK-ALIGNED-RV64-V-LABEL: bcmp_le_zero:
2792; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
2793; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
2794; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2795; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
2796; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
2797; CHECK-ALIGNED-RV64-V-NEXT:    slti a0, a0, 1
2798; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2799; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
2800; CHECK-ALIGNED-RV64-V-NEXT:    ret
2801;
2802; CHECK-UNALIGNED-LABEL: bcmp_le_zero:
2803; CHECK-UNALIGNED:       # %bb.0: # %entry
2804; CHECK-UNALIGNED-NEXT:    lw a0, 0(a0)
2805; CHECK-UNALIGNED-NEXT:    lw a1, 0(a1)
2806; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
2807; CHECK-UNALIGNED-NEXT:    snez a0, a0
2808; CHECK-UNALIGNED-NEXT:    slti a0, a0, 1
2809; CHECK-UNALIGNED-NEXT:    ret
2810entry:
2811  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 4)
2812  %ret = icmp slt i32 %bcmp, 1
2813  ret i1 %ret
2814}
2815
2816define i1 @bcmp_ge_zero(ptr %s1, ptr %s2) nounwind {
2817; CHECK-ALIGNED-RV32-LABEL: bcmp_ge_zero:
2818; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
2819; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
2820; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2821; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
2822; CHECK-ALIGNED-RV32-NEXT:    call bcmp
2823; CHECK-ALIGNED-RV32-NEXT:    slti a0, a0, 0
2824; CHECK-ALIGNED-RV32-NEXT:    xori a0, a0, 1
2825; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2826; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
2827; CHECK-ALIGNED-RV32-NEXT:    ret
2828;
2829; CHECK-ALIGNED-RV64-LABEL: bcmp_ge_zero:
2830; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
2831; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
2832; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2833; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
2834; CHECK-ALIGNED-RV64-NEXT:    call bcmp
2835; CHECK-ALIGNED-RV64-NEXT:    slti a0, a0, 0
2836; CHECK-ALIGNED-RV64-NEXT:    xori a0, a0, 1
2837; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2838; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
2839; CHECK-ALIGNED-RV64-NEXT:    ret
2840;
2841; CHECK-ALIGNED-RV32-ZBB-LABEL: bcmp_ge_zero:
2842; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
2843; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
2844; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2845; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
2846; CHECK-ALIGNED-RV32-ZBB-NEXT:    call bcmp
2847; CHECK-ALIGNED-RV32-ZBB-NEXT:    slti a0, a0, 0
2848; CHECK-ALIGNED-RV32-ZBB-NEXT:    xori a0, a0, 1
2849; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2850; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
2851; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
2852;
2853; CHECK-ALIGNED-RV64-ZBB-LABEL: bcmp_ge_zero:
2854; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
2855; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
2856; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2857; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
2858; CHECK-ALIGNED-RV64-ZBB-NEXT:    call bcmp
2859; CHECK-ALIGNED-RV64-ZBB-NEXT:    slti a0, a0, 0
2860; CHECK-ALIGNED-RV64-ZBB-NEXT:    xori a0, a0, 1
2861; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2862; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
2863; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
2864;
2865; CHECK-ALIGNED-RV32-ZBKB-LABEL: bcmp_ge_zero:
2866; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
2867; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
2868; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2869; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
2870; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call bcmp
2871; CHECK-ALIGNED-RV32-ZBKB-NEXT:    slti a0, a0, 0
2872; CHECK-ALIGNED-RV32-ZBKB-NEXT:    xori a0, a0, 1
2873; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2874; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
2875; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
2876;
2877; CHECK-ALIGNED-RV64-ZBKB-LABEL: bcmp_ge_zero:
2878; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2879; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
2880; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2881; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
2882; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call bcmp
2883; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slti a0, a0, 0
2884; CHECK-ALIGNED-RV64-ZBKB-NEXT:    xori a0, a0, 1
2885; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2886; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
2887; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
2888;
2889; CHECK-ALIGNED-RV32-V-LABEL: bcmp_ge_zero:
2890; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
2891; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
2892; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2893; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
2894; CHECK-ALIGNED-RV32-V-NEXT:    call bcmp
2895; CHECK-ALIGNED-RV32-V-NEXT:    slti a0, a0, 0
2896; CHECK-ALIGNED-RV32-V-NEXT:    xori a0, a0, 1
2897; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2898; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
2899; CHECK-ALIGNED-RV32-V-NEXT:    ret
2900;
2901; CHECK-ALIGNED-RV64-V-LABEL: bcmp_ge_zero:
2902; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
2903; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
2904; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2905; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
2906; CHECK-ALIGNED-RV64-V-NEXT:    call bcmp
2907; CHECK-ALIGNED-RV64-V-NEXT:    slti a0, a0, 0
2908; CHECK-ALIGNED-RV64-V-NEXT:    xori a0, a0, 1
2909; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2910; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
2911; CHECK-ALIGNED-RV64-V-NEXT:    ret
2912;
2913; CHECK-UNALIGNED-LABEL: bcmp_ge_zero:
2914; CHECK-UNALIGNED:       # %bb.0: # %entry
2915; CHECK-UNALIGNED-NEXT:    li a0, 1
2916; CHECK-UNALIGNED-NEXT:    ret
2917entry:
2918  %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iXLen 4)
2919  %ret = icmp sgt i32 %bcmp, -1
2920  ret i1 %ret
2921}
2922
2923define i32 @memcmp_size_0(ptr %s1, ptr %s2) nounwind {
2924; CHECK-LABEL: memcmp_size_0:
2925; CHECK:       # %bb.0: # %entry
2926; CHECK-NEXT:    li a0, 0
2927; CHECK-NEXT:    ret
2928entry:
2929  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 0)
2930  ret i32 %memcmp
2931}
2932
2933define i32 @memcmp_size_1(ptr %s1, ptr %s2) nounwind {
2934; CHECK-ALIGNED-RV32-LABEL: memcmp_size_1:
2935; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
2936; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
2937; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2938; CHECK-ALIGNED-RV32-NEXT:    li a2, 1
2939; CHECK-ALIGNED-RV32-NEXT:    call memcmp
2940; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2941; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
2942; CHECK-ALIGNED-RV32-NEXT:    ret
2943;
2944; CHECK-ALIGNED-RV64-LABEL: memcmp_size_1:
2945; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
2946; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
2947; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2948; CHECK-ALIGNED-RV64-NEXT:    li a2, 1
2949; CHECK-ALIGNED-RV64-NEXT:    call memcmp
2950; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2951; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
2952; CHECK-ALIGNED-RV64-NEXT:    ret
2953;
2954; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_1:
2955; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
2956; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
2957; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2958; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 1
2959; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
2960; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2961; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
2962; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
2963;
2964; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_1:
2965; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
2966; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
2967; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2968; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 1
2969; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
2970; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2971; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
2972; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
2973;
2974; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_1:
2975; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
2976; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
2977; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2978; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 1
2979; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
2980; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2981; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
2982; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
2983;
2984; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_1:
2985; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
2986; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
2987; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2988; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 1
2989; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
2990; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2991; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
2992; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
2993;
2994; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_1:
2995; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
2996; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
2997; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2998; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 1
2999; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
3000; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3001; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3002; CHECK-ALIGNED-RV32-V-NEXT:    ret
3003;
3004; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_1:
3005; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
3006; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3007; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3008; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 1
3009; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
3010; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3011; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3012; CHECK-ALIGNED-RV64-V-NEXT:    ret
3013;
3014; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_1:
3015; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
3016; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
3017; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3018; CHECK-UNALIGNED-RV32-NEXT:    li a2, 1
3019; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
3020; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3021; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
3022; CHECK-UNALIGNED-RV32-NEXT:    ret
3023;
3024; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_1:
3025; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
3026; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
3027; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3028; CHECK-UNALIGNED-RV64-NEXT:    li a2, 1
3029; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
3030; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3031; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
3032; CHECK-UNALIGNED-RV64-NEXT:    ret
3033;
3034; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_1:
3035; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
3036; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lbu a0, 0(a0)
3037; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lbu a1, 0(a1)
3038; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sub a0, a0, a1
3039; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3040;
3041; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_1:
3042; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
3043; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lbu a0, 0(a0)
3044; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lbu a1, 0(a1)
3045; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sub a0, a0, a1
3046; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
3047;
3048; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_1:
3049; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3050; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lbu a0, 0(a0)
3051; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lbu a1, 0(a1)
3052; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sub a0, a0, a1
3053; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3054;
3055; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_1:
3056; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3057; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lbu a0, 0(a0)
3058; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lbu a1, 0(a1)
3059; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sub a0, a0, a1
3060; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
3061;
3062; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_1:
3063; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
3064; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3065; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3066; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 1
3067; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
3068; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3069; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3070; CHECK-UNALIGNED-RV32-V-NEXT:    ret
3071;
3072; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_1:
3073; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
3074; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3075; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3076; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 1
3077; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
3078; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3079; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3080; CHECK-UNALIGNED-RV64-V-NEXT:    ret
3081entry:
3082  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 1)
3083  ret i32 %memcmp
3084}
3085
3086define i32 @memcmp_size_2(ptr %s1, ptr %s2) nounwind {
3087; CHECK-ALIGNED-RV32-LABEL: memcmp_size_2:
3088; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
3089; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
3090; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3091; CHECK-ALIGNED-RV32-NEXT:    li a2, 2
3092; CHECK-ALIGNED-RV32-NEXT:    call memcmp
3093; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3094; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
3095; CHECK-ALIGNED-RV32-NEXT:    ret
3096;
3097; CHECK-ALIGNED-RV64-LABEL: memcmp_size_2:
3098; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
3099; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
3100; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3101; CHECK-ALIGNED-RV64-NEXT:    li a2, 2
3102; CHECK-ALIGNED-RV64-NEXT:    call memcmp
3103; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3104; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
3105; CHECK-ALIGNED-RV64-NEXT:    ret
3106;
3107; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_2:
3108; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
3109; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
3110; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3111; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 2
3112; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
3113; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3114; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
3115; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
3116;
3117; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_2:
3118; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
3119; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
3120; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3121; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 2
3122; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
3123; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3124; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
3125; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
3126;
3127; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_2:
3128; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3129; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
3130; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3131; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 2
3132; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
3133; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3134; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
3135; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
3136;
3137; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_2:
3138; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3139; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
3140; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3141; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 2
3142; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
3143; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3144; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
3145; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
3146;
3147; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_2:
3148; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
3149; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3150; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3151; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 2
3152; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
3153; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3154; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3155; CHECK-ALIGNED-RV32-V-NEXT:    ret
3156;
3157; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_2:
3158; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
3159; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3160; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3161; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 2
3162; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
3163; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3164; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3165; CHECK-ALIGNED-RV64-V-NEXT:    ret
3166;
3167; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_2:
3168; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
3169; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
3170; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3171; CHECK-UNALIGNED-RV32-NEXT:    li a2, 2
3172; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
3173; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3174; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
3175; CHECK-UNALIGNED-RV32-NEXT:    ret
3176;
3177; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_2:
3178; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
3179; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
3180; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3181; CHECK-UNALIGNED-RV64-NEXT:    li a2, 2
3182; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
3183; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3184; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
3185; CHECK-UNALIGNED-RV64-NEXT:    ret
3186;
3187; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_2:
3188; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
3189; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lh a0, 0(a0)
3190; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lh a1, 0(a1)
3191; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a0, a0
3192; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a1, a1
3193; CHECK-UNALIGNED-RV32-ZBB-NEXT:    srli a0, a0, 16
3194; CHECK-UNALIGNED-RV32-ZBB-NEXT:    srli a1, a1, 16
3195; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sub a0, a0, a1
3196; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3197;
3198; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_2:
3199; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
3200; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lh a0, 0(a0)
3201; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lh a1, 0(a1)
3202; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
3203; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
3204; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a0, a0, 48
3205; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a1, a1, 48
3206; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sub a0, a0, a1
3207; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
3208;
3209; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_2:
3210; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3211; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lh a0, 0(a0)
3212; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lh a1, 0(a1)
3213; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a0, a0
3214; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a1, a1
3215; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    srli a0, a0, 16
3216; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    srli a1, a1, 16
3217; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sub a0, a0, a1
3218; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3219;
3220; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_2:
3221; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3222; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lh a0, 0(a0)
3223; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lh a1, 0(a1)
3224; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
3225; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
3226; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a0, a0, 48
3227; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a1, a1, 48
3228; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sub a0, a0, a1
3229; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
3230;
3231; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_2:
3232; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
3233; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3234; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3235; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 2
3236; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
3237; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3238; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3239; CHECK-UNALIGNED-RV32-V-NEXT:    ret
3240;
3241; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_2:
3242; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
3243; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3244; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3245; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 2
3246; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
3247; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3248; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3249; CHECK-UNALIGNED-RV64-V-NEXT:    ret
3250entry:
3251  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 2)
3252  ret i32 %memcmp
3253}
3254
3255define i32 @memcmp_size_3(ptr %s1, ptr %s2) nounwind {
3256; CHECK-ALIGNED-RV32-LABEL: memcmp_size_3:
3257; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
3258; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
3259; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3260; CHECK-ALIGNED-RV32-NEXT:    li a2, 3
3261; CHECK-ALIGNED-RV32-NEXT:    call memcmp
3262; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3263; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
3264; CHECK-ALIGNED-RV32-NEXT:    ret
3265;
3266; CHECK-ALIGNED-RV64-LABEL: memcmp_size_3:
3267; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
3268; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
3269; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3270; CHECK-ALIGNED-RV64-NEXT:    li a2, 3
3271; CHECK-ALIGNED-RV64-NEXT:    call memcmp
3272; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3273; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
3274; CHECK-ALIGNED-RV64-NEXT:    ret
3275;
3276; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_3:
3277; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
3278; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
3279; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3280; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 3
3281; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
3282; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3283; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
3284; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
3285;
3286; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_3:
3287; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
3288; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
3289; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3290; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 3
3291; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
3292; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3293; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
3294; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
3295;
3296; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_3:
3297; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3298; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
3299; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3300; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 3
3301; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
3302; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3303; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
3304; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
3305;
3306; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_3:
3307; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3308; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
3309; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3310; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 3
3311; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
3312; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3313; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
3314; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
3315;
3316; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_3:
3317; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
3318; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3319; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3320; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 3
3321; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
3322; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3323; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3324; CHECK-ALIGNED-RV32-V-NEXT:    ret
3325;
3326; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_3:
3327; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
3328; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3329; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3330; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 3
3331; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
3332; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3333; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3334; CHECK-ALIGNED-RV64-V-NEXT:    ret
3335;
3336; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_3:
3337; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
3338; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
3339; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3340; CHECK-UNALIGNED-RV32-NEXT:    li a2, 3
3341; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
3342; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3343; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
3344; CHECK-UNALIGNED-RV32-NEXT:    ret
3345;
3346; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_3:
3347; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
3348; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
3349; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3350; CHECK-UNALIGNED-RV64-NEXT:    li a2, 3
3351; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
3352; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3353; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
3354; CHECK-UNALIGNED-RV64-NEXT:    ret
3355;
3356; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_3:
3357; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
3358; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lbu a2, 2(a0)
3359; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lhu a0, 0(a0)
3360; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lbu a3, 2(a1)
3361; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lhu a1, 0(a1)
3362; CHECK-UNALIGNED-RV32-ZBB-NEXT:    slli a2, a2, 16
3363; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a0, a0, a2
3364; CHECK-UNALIGNED-RV32-ZBB-NEXT:    slli a3, a3, 16
3365; CHECK-UNALIGNED-RV32-ZBB-NEXT:    or a1, a1, a3
3366; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a0, a0
3367; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a1, a1
3368; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a2, a0, a1
3369; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a1, a0
3370; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sub a0, a0, a2
3371; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3372;
3373; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_3:
3374; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
3375; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lbu a2, 2(a0)
3376; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lhu a0, 0(a0)
3377; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lbu a3, 2(a1)
3378; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lhu a1, 0(a1)
3379; CHECK-UNALIGNED-RV64-ZBB-NEXT:    slli a2, a2, 16
3380; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a0, a2
3381; CHECK-UNALIGNED-RV64-ZBB-NEXT:    slli a3, a3, 16
3382; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a1, a1, a3
3383; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
3384; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
3385; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a0, a0, 32
3386; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a1, a1, 32
3387; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a2, a0, a1
3388; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a1, a0
3389; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sub a0, a0, a2
3390; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
3391;
3392; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_3:
3393; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3394; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lhu a2, 0(a0)
3395; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lbu a0, 2(a0)
3396; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lhu a3, 0(a1)
3397; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lbu a1, 2(a1)
3398; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    pack a0, a2, a0
3399; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    pack a1, a3, a1
3400; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a0, a0
3401; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a1, a1
3402; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a2, a0, a1
3403; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a1, a0
3404; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sub a0, a0, a2
3405; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3406;
3407; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_3:
3408; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3409; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lbu a2, 2(a0)
3410; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lhu a0, 0(a0)
3411; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lbu a3, 2(a1)
3412; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lhu a1, 0(a1)
3413; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    slli a2, a2, 16
3414; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a0, a0, a2
3415; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    slli a3, a3, 16
3416; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    or a1, a1, a3
3417; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
3418; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
3419; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a0, a0, 32
3420; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a1, a1, 32
3421; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a2, a0, a1
3422; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a1, a0
3423; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sub a0, a0, a2
3424; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
3425;
3426; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_3:
3427; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
3428; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3429; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3430; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 3
3431; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
3432; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3433; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3434; CHECK-UNALIGNED-RV32-V-NEXT:    ret
3435;
3436; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_3:
3437; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
3438; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3439; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3440; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 3
3441; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
3442; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3443; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3444; CHECK-UNALIGNED-RV64-V-NEXT:    ret
3445entry:
3446  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 3)
3447  ret i32 %memcmp
3448}
3449
3450define i32 @memcmp_size_4(ptr %s1, ptr %s2) nounwind {
3451; CHECK-ALIGNED-RV32-LABEL: memcmp_size_4:
3452; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
3453; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
3454; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3455; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
3456; CHECK-ALIGNED-RV32-NEXT:    call memcmp
3457; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3458; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
3459; CHECK-ALIGNED-RV32-NEXT:    ret
3460;
3461; CHECK-ALIGNED-RV64-LABEL: memcmp_size_4:
3462; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
3463; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
3464; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3465; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
3466; CHECK-ALIGNED-RV64-NEXT:    call memcmp
3467; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3468; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
3469; CHECK-ALIGNED-RV64-NEXT:    ret
3470;
3471; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_4:
3472; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
3473; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
3474; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3475; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
3476; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
3477; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3478; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
3479; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
3480;
3481; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_4:
3482; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
3483; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
3484; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3485; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
3486; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
3487; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3488; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
3489; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
3490;
3491; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_4:
3492; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3493; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
3494; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3495; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
3496; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
3497; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3498; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
3499; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
3500;
3501; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_4:
3502; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3503; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
3504; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3505; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
3506; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
3507; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3508; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
3509; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
3510;
3511; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_4:
3512; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
3513; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3514; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3515; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
3516; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
3517; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3518; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3519; CHECK-ALIGNED-RV32-V-NEXT:    ret
3520;
3521; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_4:
3522; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
3523; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3524; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3525; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
3526; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
3527; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3528; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3529; CHECK-ALIGNED-RV64-V-NEXT:    ret
3530;
3531; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_4:
3532; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
3533; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
3534; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3535; CHECK-UNALIGNED-RV32-NEXT:    li a2, 4
3536; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
3537; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3538; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
3539; CHECK-UNALIGNED-RV32-NEXT:    ret
3540;
3541; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_4:
3542; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
3543; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
3544; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3545; CHECK-UNALIGNED-RV64-NEXT:    li a2, 4
3546; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
3547; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3548; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
3549; CHECK-UNALIGNED-RV64-NEXT:    ret
3550;
3551; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_4:
3552; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
3553; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 0(a0)
3554; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 0(a1)
3555; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a0, a0
3556; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a1, a1
3557; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a2, a0, a1
3558; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a1, a0
3559; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sub a0, a0, a2
3560; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3561;
3562; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_4:
3563; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
3564; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a0, 0(a0)
3565; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a1, 0(a1)
3566; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
3567; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
3568; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a0, a0, 32
3569; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a1, a1, 32
3570; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a2, a0, a1
3571; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a1, a0
3572; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sub a0, a0, a2
3573; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
3574;
3575; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_4:
3576; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3577; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 0(a0)
3578; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 0(a1)
3579; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a0, a0
3580; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a1, a1
3581; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a2, a0, a1
3582; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a1, a0
3583; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sub a0, a0, a2
3584; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3585;
3586; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_4:
3587; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3588; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a0, 0(a0)
3589; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a1, 0(a1)
3590; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
3591; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
3592; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a0, a0, 32
3593; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a1, a1, 32
3594; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a2, a0, a1
3595; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a1, a0
3596; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sub a0, a0, a2
3597; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
3598;
3599; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_4:
3600; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
3601; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3602; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3603; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 4
3604; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
3605; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3606; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3607; CHECK-UNALIGNED-RV32-V-NEXT:    ret
3608;
3609; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_4:
3610; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
3611; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3612; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3613; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 4
3614; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
3615; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3616; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3617; CHECK-UNALIGNED-RV64-V-NEXT:    ret
3618entry:
3619  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 4)
3620  ret i32 %memcmp
3621}
3622
3623define i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind {
3624; CHECK-ALIGNED-RV32-LABEL: memcmp_size_5:
3625; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
3626; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
3627; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3628; CHECK-ALIGNED-RV32-NEXT:    li a2, 5
3629; CHECK-ALIGNED-RV32-NEXT:    call memcmp
3630; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3631; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
3632; CHECK-ALIGNED-RV32-NEXT:    ret
3633;
3634; CHECK-ALIGNED-RV64-LABEL: memcmp_size_5:
3635; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
3636; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
3637; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3638; CHECK-ALIGNED-RV64-NEXT:    li a2, 5
3639; CHECK-ALIGNED-RV64-NEXT:    call memcmp
3640; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3641; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
3642; CHECK-ALIGNED-RV64-NEXT:    ret
3643;
3644; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_5:
3645; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
3646; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
3647; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3648; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 5
3649; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
3650; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3651; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
3652; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
3653;
3654; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_5:
3655; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
3656; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
3657; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3658; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 5
3659; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
3660; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3661; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
3662; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
3663;
3664; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_5:
3665; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3666; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
3667; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3668; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 5
3669; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
3670; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3671; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
3672; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
3673;
3674; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
3675; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3676; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
3677; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3678; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 5
3679; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
3680; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3681; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
3682; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
3683;
3684; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_5:
3685; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
3686; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3687; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3688; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 5
3689; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
3690; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3691; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3692; CHECK-ALIGNED-RV32-V-NEXT:    ret
3693;
3694; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_5:
3695; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
3696; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3697; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3698; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 5
3699; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
3700; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3701; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3702; CHECK-ALIGNED-RV64-V-NEXT:    ret
3703;
3704; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_5:
3705; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
3706; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
3707; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3708; CHECK-UNALIGNED-RV32-NEXT:    li a2, 5
3709; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
3710; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3711; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
3712; CHECK-UNALIGNED-RV32-NEXT:    ret
3713;
3714; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_5:
3715; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
3716; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
3717; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3718; CHECK-UNALIGNED-RV64-NEXT:    li a2, 5
3719; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
3720; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3721; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
3722; CHECK-UNALIGNED-RV64-NEXT:    ret
3723;
3724; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_5:
3725; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
3726; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
3727; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
3728; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
3729; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
3730; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB28_2
3731; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
3732; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lbu a0, 4(a0)
3733; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lbu a1, 4(a1)
3734; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sub a0, a0, a1
3735; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3736; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB28_2: # %res_block
3737; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
3738; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
3739; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
3740; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3741;
3742; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_5:
3743; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
3744; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lbu a2, 4(a0)
3745; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lwu a0, 0(a0)
3746; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lbu a3, 4(a1)
3747; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lwu a1, 0(a1)
3748; CHECK-UNALIGNED-RV64-ZBB-NEXT:    slli a2, a2, 32
3749; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a0, a2
3750; CHECK-UNALIGNED-RV64-ZBB-NEXT:    slli a3, a3, 32
3751; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a1, a1, a3
3752; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
3753; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
3754; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a2, a0, a1
3755; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a1, a0
3756; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sub a0, a0, a2
3757; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
3758;
3759; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_5:
3760; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3761; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
3762; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
3763; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
3764; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
3765; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB28_2
3766; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
3767; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lbu a0, 4(a0)
3768; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lbu a1, 4(a1)
3769; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sub a0, a0, a1
3770; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3771; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB28_2: # %res_block
3772; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
3773; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
3774; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
3775; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3776;
3777; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
3778; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3779; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lwu a2, 0(a0)
3780; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lbu a0, 4(a0)
3781; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lwu a3, 0(a1)
3782; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lbu a1, 4(a1)
3783; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    pack a0, a2, a0
3784; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    pack a1, a3, a1
3785; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
3786; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
3787; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a2, a0, a1
3788; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a1, a0
3789; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sub a0, a0, a2
3790; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
3791;
3792; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_5:
3793; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
3794; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3795; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3796; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 5
3797; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
3798; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3799; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3800; CHECK-UNALIGNED-RV32-V-NEXT:    ret
3801;
3802; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_5:
3803; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
3804; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3805; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3806; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 5
3807; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
3808; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3809; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3810; CHECK-UNALIGNED-RV64-V-NEXT:    ret
3811entry:
3812  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 5)
3813  ret i32 %memcmp
3814}
3815
3816define i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind {
3817; CHECK-ALIGNED-RV32-LABEL: memcmp_size_6:
3818; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
3819; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
3820; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3821; CHECK-ALIGNED-RV32-NEXT:    li a2, 6
3822; CHECK-ALIGNED-RV32-NEXT:    call memcmp
3823; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3824; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
3825; CHECK-ALIGNED-RV32-NEXT:    ret
3826;
3827; CHECK-ALIGNED-RV64-LABEL: memcmp_size_6:
3828; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
3829; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
3830; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3831; CHECK-ALIGNED-RV64-NEXT:    li a2, 6
3832; CHECK-ALIGNED-RV64-NEXT:    call memcmp
3833; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3834; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
3835; CHECK-ALIGNED-RV64-NEXT:    ret
3836;
3837; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_6:
3838; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
3839; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
3840; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3841; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 6
3842; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
3843; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3844; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
3845; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
3846;
3847; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_6:
3848; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
3849; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
3850; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3851; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 6
3852; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
3853; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3854; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
3855; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
3856;
3857; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_6:
3858; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3859; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
3860; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3861; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 6
3862; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
3863; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3864; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
3865; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
3866;
3867; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
3868; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3869; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
3870; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3871; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 6
3872; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
3873; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3874; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
3875; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
3876;
3877; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_6:
3878; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
3879; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
3880; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3881; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 6
3882; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
3883; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3884; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
3885; CHECK-ALIGNED-RV32-V-NEXT:    ret
3886;
3887; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_6:
3888; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
3889; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
3890; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3891; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 6
3892; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
3893; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3894; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
3895; CHECK-ALIGNED-RV64-V-NEXT:    ret
3896;
3897; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_6:
3898; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
3899; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
3900; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3901; CHECK-UNALIGNED-RV32-NEXT:    li a2, 6
3902; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
3903; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3904; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
3905; CHECK-UNALIGNED-RV32-NEXT:    ret
3906;
3907; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_6:
3908; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
3909; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
3910; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3911; CHECK-UNALIGNED-RV64-NEXT:    li a2, 6
3912; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
3913; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3914; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
3915; CHECK-UNALIGNED-RV64-NEXT:    ret
3916;
3917; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_6:
3918; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
3919; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
3920; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
3921; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
3922; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
3923; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB29_3
3924; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
3925; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lh a0, 4(a0)
3926; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lh a1, 4(a1)
3927; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a0
3928; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a1
3929; CHECK-UNALIGNED-RV32-ZBB-NEXT:    srli a2, a2, 16
3930; CHECK-UNALIGNED-RV32-ZBB-NEXT:    srli a3, a3, 16
3931; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB29_3
3932; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.2:
3933; CHECK-UNALIGNED-RV32-ZBB-NEXT:    li a0, 0
3934; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3935; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB29_3: # %res_block
3936; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
3937; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
3938; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
3939; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
3940;
3941; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_6:
3942; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
3943; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lhu a2, 4(a0)
3944; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lwu a0, 0(a0)
3945; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lhu a3, 4(a1)
3946; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lwu a1, 0(a1)
3947; CHECK-UNALIGNED-RV64-ZBB-NEXT:    slli a2, a2, 32
3948; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a0, a0, a2
3949; CHECK-UNALIGNED-RV64-ZBB-NEXT:    slli a3, a3, 32
3950; CHECK-UNALIGNED-RV64-ZBB-NEXT:    or a1, a1, a3
3951; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
3952; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
3953; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a2, a0, a1
3954; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a1, a0
3955; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sub a0, a0, a2
3956; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
3957;
3958; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_6:
3959; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
3960; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
3961; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
3962; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
3963; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
3964; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB29_3
3965; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
3966; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lh a0, 4(a0)
3967; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lh a1, 4(a1)
3968; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a0
3969; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a1
3970; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    srli a2, a2, 16
3971; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    srli a3, a3, 16
3972; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB29_3
3973; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.2:
3974; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    li a0, 0
3975; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3976; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB29_3: # %res_block
3977; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
3978; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
3979; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
3980; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
3981;
3982; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
3983; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
3984; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lwu a2, 0(a0)
3985; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lhu a0, 4(a0)
3986; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lwu a3, 0(a1)
3987; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lhu a1, 4(a1)
3988; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    pack a0, a2, a0
3989; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    pack a1, a3, a1
3990; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
3991; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
3992; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a2, a0, a1
3993; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a1, a0
3994; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sub a0, a0, a2
3995; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
3996;
3997; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_6:
3998; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
3999; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4000; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4001; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 6
4002; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
4003; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4004; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4005; CHECK-UNALIGNED-RV32-V-NEXT:    ret
4006;
4007; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_6:
4008; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
4009; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4010; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4011; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 6
4012; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
4013; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4014; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4015; CHECK-UNALIGNED-RV64-V-NEXT:    ret
4016entry:
4017  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 6)
4018  ret i32 %memcmp
4019}
4020
4021define i32 @memcmp_size_7(ptr %s1, ptr %s2) nounwind {
4022; CHECK-ALIGNED-RV32-LABEL: memcmp_size_7:
4023; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
4024; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
4025; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4026; CHECK-ALIGNED-RV32-NEXT:    li a2, 7
4027; CHECK-ALIGNED-RV32-NEXT:    call memcmp
4028; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4029; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
4030; CHECK-ALIGNED-RV32-NEXT:    ret
4031;
4032; CHECK-ALIGNED-RV64-LABEL: memcmp_size_7:
4033; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
4034; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
4035; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4036; CHECK-ALIGNED-RV64-NEXT:    li a2, 7
4037; CHECK-ALIGNED-RV64-NEXT:    call memcmp
4038; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4039; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
4040; CHECK-ALIGNED-RV64-NEXT:    ret
4041;
4042; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_7:
4043; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
4044; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
4045; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4046; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 7
4047; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
4048; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4049; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
4050; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
4051;
4052; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_7:
4053; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
4054; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
4055; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4056; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 7
4057; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
4058; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4059; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
4060; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
4061;
4062; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_7:
4063; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4064; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
4065; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4066; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 7
4067; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
4068; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4069; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
4070; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
4071;
4072; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_7:
4073; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4074; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
4075; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4076; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 7
4077; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
4078; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4079; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
4080; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
4081;
4082; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_7:
4083; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
4084; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4085; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4086; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 7
4087; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
4088; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4089; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4090; CHECK-ALIGNED-RV32-V-NEXT:    ret
4091;
4092; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_7:
4093; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
4094; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4095; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4096; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 7
4097; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
4098; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4099; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4100; CHECK-ALIGNED-RV64-V-NEXT:    ret
4101;
4102; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_7:
4103; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
4104; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
4105; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4106; CHECK-UNALIGNED-RV32-NEXT:    li a2, 7
4107; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
4108; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4109; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
4110; CHECK-UNALIGNED-RV32-NEXT:    ret
4111;
4112; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_7:
4113; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
4114; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
4115; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4116; CHECK-UNALIGNED-RV64-NEXT:    li a2, 7
4117; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
4118; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4119; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
4120; CHECK-UNALIGNED-RV64-NEXT:    ret
4121;
4122; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_7:
4123; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
4124; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
4125; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
4126; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4127; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4128; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB30_3
4129; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
4130; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 3(a0)
4131; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 3(a1)
4132; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a0
4133; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a1
4134; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB30_3
4135; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.2:
4136; CHECK-UNALIGNED-RV32-ZBB-NEXT:    li a0, 0
4137; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4138; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB30_3: # %res_block
4139; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
4140; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
4141; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
4142; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4143;
4144; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_7:
4145; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
4146; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a2, 0(a0)
4147; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a3, 0(a1)
4148; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
4149; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
4150; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a2, a2, 32
4151; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a3, a3, 32
4152; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB30_3
4153; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.1: # %loadbb1
4154; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a0, 3(a0)
4155; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a1, 3(a1)
4156; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a0
4157; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a1
4158; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a2, a2, 32
4159; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a3, a3, 32
4160; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB30_3
4161; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.2:
4162; CHECK-UNALIGNED-RV64-ZBB-NEXT:    li a0, 0
4163; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
4164; CHECK-UNALIGNED-RV64-ZBB-NEXT:  .LBB30_3: # %res_block
4165; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a2, a3
4166; CHECK-UNALIGNED-RV64-ZBB-NEXT:    neg a0, a0
4167; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ori a0, a0, 1
4168; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
4169;
4170; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_7:
4171; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4172; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
4173; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
4174; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4175; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4176; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB30_3
4177; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
4178; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 3(a0)
4179; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 3(a1)
4180; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a0
4181; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a1
4182; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB30_3
4183; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.2:
4184; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    li a0, 0
4185; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4186; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB30_3: # %res_block
4187; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
4188; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
4189; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
4190; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4191;
4192; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_7:
4193; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4194; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a2, 0(a0)
4195; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a3, 0(a1)
4196; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
4197; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
4198; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a2, a2, 32
4199; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a3, a3, 32
4200; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB30_3
4201; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.1: # %loadbb1
4202; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a0, 3(a0)
4203; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a1, 3(a1)
4204; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a0
4205; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a1
4206; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a2, a2, 32
4207; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a3, a3, 32
4208; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB30_3
4209; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.2:
4210; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    li a0, 0
4211; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
4212; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  .LBB30_3: # %res_block
4213; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a2, a3
4214; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    neg a0, a0
4215; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ori a0, a0, 1
4216; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
4217;
4218; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_7:
4219; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
4220; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4221; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4222; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 7
4223; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
4224; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4225; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4226; CHECK-UNALIGNED-RV32-V-NEXT:    ret
4227;
4228; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_7:
4229; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
4230; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4231; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4232; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 7
4233; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
4234; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4235; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4236; CHECK-UNALIGNED-RV64-V-NEXT:    ret
4237entry:
4238  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 7)
4239  ret i32 %memcmp
4240}
4241
4242define i32 @memcmp_size_8(ptr %s1, ptr %s2) nounwind {
4243; CHECK-ALIGNED-RV32-LABEL: memcmp_size_8:
4244; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
4245; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
4246; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4247; CHECK-ALIGNED-RV32-NEXT:    li a2, 8
4248; CHECK-ALIGNED-RV32-NEXT:    call memcmp
4249; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4250; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
4251; CHECK-ALIGNED-RV32-NEXT:    ret
4252;
4253; CHECK-ALIGNED-RV64-LABEL: memcmp_size_8:
4254; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
4255; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
4256; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4257; CHECK-ALIGNED-RV64-NEXT:    li a2, 8
4258; CHECK-ALIGNED-RV64-NEXT:    call memcmp
4259; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4260; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
4261; CHECK-ALIGNED-RV64-NEXT:    ret
4262;
4263; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_8:
4264; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
4265; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
4266; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4267; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 8
4268; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
4269; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4270; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
4271; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
4272;
4273; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_8:
4274; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
4275; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
4276; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4277; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 8
4278; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
4279; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4280; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
4281; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
4282;
4283; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_8:
4284; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4285; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
4286; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4287; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 8
4288; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
4289; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4290; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
4291; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
4292;
4293; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_8:
4294; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4295; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
4296; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4297; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 8
4298; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
4299; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4300; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
4301; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
4302;
4303; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_8:
4304; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
4305; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4306; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4307; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 8
4308; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
4309; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4310; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4311; CHECK-ALIGNED-RV32-V-NEXT:    ret
4312;
4313; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_8:
4314; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
4315; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4316; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4317; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 8
4318; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
4319; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4320; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4321; CHECK-ALIGNED-RV64-V-NEXT:    ret
4322;
4323; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_8:
4324; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
4325; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
4326; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4327; CHECK-UNALIGNED-RV32-NEXT:    li a2, 8
4328; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
4329; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4330; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
4331; CHECK-UNALIGNED-RV32-NEXT:    ret
4332;
4333; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_8:
4334; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
4335; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
4336; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4337; CHECK-UNALIGNED-RV64-NEXT:    li a2, 8
4338; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
4339; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4340; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
4341; CHECK-UNALIGNED-RV64-NEXT:    ret
4342;
4343; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_8:
4344; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
4345; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
4346; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
4347; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4348; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4349; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB31_3
4350; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
4351; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 4(a0)
4352; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 4(a1)
4353; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a0
4354; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a1
4355; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB31_3
4356; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.2:
4357; CHECK-UNALIGNED-RV32-ZBB-NEXT:    li a0, 0
4358; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4359; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB31_3: # %res_block
4360; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
4361; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
4362; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
4363; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4364;
4365; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_8:
4366; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
4367; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 0(a0)
4368; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 0(a1)
4369; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
4370; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
4371; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a2, a0, a1
4372; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a1, a0
4373; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sub a0, a0, a2
4374; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
4375;
4376; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_8:
4377; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4378; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
4379; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
4380; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4381; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4382; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB31_3
4383; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
4384; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 4(a0)
4385; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 4(a1)
4386; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a0
4387; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a1
4388; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB31_3
4389; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.2:
4390; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    li a0, 0
4391; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4392; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB31_3: # %res_block
4393; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
4394; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
4395; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
4396; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4397;
4398; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_8:
4399; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4400; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 0(a0)
4401; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 0(a1)
4402; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
4403; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
4404; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a2, a0, a1
4405; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a1, a0
4406; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sub a0, a0, a2
4407; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
4408;
4409; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_8:
4410; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
4411; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4412; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4413; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 8
4414; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
4415; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4416; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4417; CHECK-UNALIGNED-RV32-V-NEXT:    ret
4418;
4419; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_8:
4420; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
4421; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4422; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4423; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 8
4424; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
4425; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4426; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4427; CHECK-UNALIGNED-RV64-V-NEXT:    ret
4428entry:
4429  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 8)
4430  ret i32 %memcmp
4431}
4432
4433define i32 @memcmp_size_15(ptr %s1, ptr %s2) nounwind {
4434; CHECK-ALIGNED-RV32-LABEL: memcmp_size_15:
4435; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
4436; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
4437; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4438; CHECK-ALIGNED-RV32-NEXT:    li a2, 15
4439; CHECK-ALIGNED-RV32-NEXT:    call memcmp
4440; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4441; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
4442; CHECK-ALIGNED-RV32-NEXT:    ret
4443;
4444; CHECK-ALIGNED-RV64-LABEL: memcmp_size_15:
4445; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
4446; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
4447; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4448; CHECK-ALIGNED-RV64-NEXT:    li a2, 15
4449; CHECK-ALIGNED-RV64-NEXT:    call memcmp
4450; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4451; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
4452; CHECK-ALIGNED-RV64-NEXT:    ret
4453;
4454; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_15:
4455; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
4456; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
4457; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4458; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 15
4459; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
4460; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4461; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
4462; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
4463;
4464; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_15:
4465; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
4466; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
4467; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4468; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 15
4469; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
4470; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4471; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
4472; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
4473;
4474; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_15:
4475; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4476; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
4477; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4478; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 15
4479; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
4480; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4481; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
4482; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
4483;
4484; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_15:
4485; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4486; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
4487; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4488; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 15
4489; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
4490; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4491; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
4492; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
4493;
4494; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_15:
4495; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
4496; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4497; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4498; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 15
4499; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
4500; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4501; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4502; CHECK-ALIGNED-RV32-V-NEXT:    ret
4503;
4504; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_15:
4505; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
4506; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4507; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4508; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 15
4509; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
4510; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4511; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4512; CHECK-ALIGNED-RV64-V-NEXT:    ret
4513;
4514; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_15:
4515; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
4516; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
4517; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4518; CHECK-UNALIGNED-RV32-NEXT:    li a2, 15
4519; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
4520; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4521; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
4522; CHECK-UNALIGNED-RV32-NEXT:    ret
4523;
4524; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_15:
4525; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
4526; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
4527; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4528; CHECK-UNALIGNED-RV64-NEXT:    li a2, 15
4529; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
4530; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4531; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
4532; CHECK-UNALIGNED-RV64-NEXT:    ret
4533;
4534; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_15:
4535; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
4536; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
4537; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
4538; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4539; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4540; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB32_5
4541; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
4542; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 4(a0)
4543; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a1)
4544; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4545; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4546; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB32_5
4547; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.2: # %loadbb2
4548; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 8(a0)
4549; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 8(a1)
4550; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4551; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4552; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB32_5
4553; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.3: # %loadbb3
4554; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 11(a0)
4555; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 11(a1)
4556; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a0
4557; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a1
4558; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB32_5
4559; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.4:
4560; CHECK-UNALIGNED-RV32-ZBB-NEXT:    li a0, 0
4561; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4562; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB32_5: # %res_block
4563; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
4564; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
4565; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
4566; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4567;
4568; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_15:
4569; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
4570; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
4571; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
4572; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
4573; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
4574; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB32_3
4575; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.1: # %loadbb1
4576; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 7(a0)
4577; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 7(a1)
4578; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a0
4579; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a1
4580; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB32_3
4581; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.2:
4582; CHECK-UNALIGNED-RV64-ZBB-NEXT:    li a0, 0
4583; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
4584; CHECK-UNALIGNED-RV64-ZBB-NEXT:  .LBB32_3: # %res_block
4585; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a2, a3
4586; CHECK-UNALIGNED-RV64-ZBB-NEXT:    neg a0, a0
4587; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ori a0, a0, 1
4588; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
4589;
4590; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_15:
4591; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4592; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
4593; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
4594; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4595; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4596; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB32_5
4597; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
4598; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 4(a0)
4599; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a1)
4600; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4601; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4602; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB32_5
4603; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.2: # %loadbb2
4604; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 8(a0)
4605; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 8(a1)
4606; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4607; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4608; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB32_5
4609; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.3: # %loadbb3
4610; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 11(a0)
4611; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 11(a1)
4612; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a0
4613; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a1
4614; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB32_5
4615; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.4:
4616; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    li a0, 0
4617; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4618; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB32_5: # %res_block
4619; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
4620; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
4621; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
4622; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4623;
4624; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_15:
4625; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4626; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
4627; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
4628; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
4629; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
4630; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB32_3
4631; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.1: # %loadbb1
4632; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 7(a0)
4633; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 7(a1)
4634; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a0
4635; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a1
4636; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB32_3
4637; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.2:
4638; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    li a0, 0
4639; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
4640; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  .LBB32_3: # %res_block
4641; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a2, a3
4642; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    neg a0, a0
4643; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ori a0, a0, 1
4644; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
4645;
4646; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_15:
4647; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
4648; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4649; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4650; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 15
4651; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
4652; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4653; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4654; CHECK-UNALIGNED-RV32-V-NEXT:    ret
4655;
4656; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_15:
4657; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
4658; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4659; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4660; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 15
4661; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
4662; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4663; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4664; CHECK-UNALIGNED-RV64-V-NEXT:    ret
4665entry:
4666  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 15)
4667  ret i32 %memcmp
4668}
4669
4670define i32 @memcmp_size_16(ptr %s1, ptr %s2) nounwind {
4671; CHECK-ALIGNED-RV32-LABEL: memcmp_size_16:
4672; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
4673; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
4674; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4675; CHECK-ALIGNED-RV32-NEXT:    li a2, 16
4676; CHECK-ALIGNED-RV32-NEXT:    call memcmp
4677; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4678; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
4679; CHECK-ALIGNED-RV32-NEXT:    ret
4680;
4681; CHECK-ALIGNED-RV64-LABEL: memcmp_size_16:
4682; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
4683; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
4684; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4685; CHECK-ALIGNED-RV64-NEXT:    li a2, 16
4686; CHECK-ALIGNED-RV64-NEXT:    call memcmp
4687; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4688; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
4689; CHECK-ALIGNED-RV64-NEXT:    ret
4690;
4691; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_16:
4692; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
4693; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
4694; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4695; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 16
4696; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
4697; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4698; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
4699; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
4700;
4701; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_16:
4702; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
4703; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
4704; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4705; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 16
4706; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
4707; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4708; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
4709; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
4710;
4711; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_16:
4712; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4713; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
4714; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4715; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 16
4716; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
4717; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4718; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
4719; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
4720;
4721; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_16:
4722; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4723; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
4724; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4725; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 16
4726; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
4727; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4728; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
4729; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
4730;
4731; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_16:
4732; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
4733; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4734; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4735; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 16
4736; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
4737; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4738; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4739; CHECK-ALIGNED-RV32-V-NEXT:    ret
4740;
4741; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_16:
4742; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
4743; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4744; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4745; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 16
4746; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
4747; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4748; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4749; CHECK-ALIGNED-RV64-V-NEXT:    ret
4750;
4751; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_16:
4752; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
4753; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
4754; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4755; CHECK-UNALIGNED-RV32-NEXT:    li a2, 16
4756; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
4757; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4758; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
4759; CHECK-UNALIGNED-RV32-NEXT:    ret
4760;
4761; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_16:
4762; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
4763; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
4764; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4765; CHECK-UNALIGNED-RV64-NEXT:    li a2, 16
4766; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
4767; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4768; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
4769; CHECK-UNALIGNED-RV64-NEXT:    ret
4770;
4771; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_16:
4772; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
4773; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
4774; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
4775; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4776; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4777; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB33_5
4778; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
4779; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 4(a0)
4780; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a1)
4781; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4782; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4783; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB33_5
4784; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.2: # %loadbb2
4785; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 8(a0)
4786; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 8(a1)
4787; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
4788; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
4789; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB33_5
4790; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.3: # %loadbb3
4791; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 12(a0)
4792; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 12(a1)
4793; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a0
4794; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a1
4795; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB33_5
4796; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.4:
4797; CHECK-UNALIGNED-RV32-ZBB-NEXT:    li a0, 0
4798; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4799; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB33_5: # %res_block
4800; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
4801; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
4802; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
4803; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
4804;
4805; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_16:
4806; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
4807; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
4808; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
4809; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
4810; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
4811; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB33_3
4812; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.1: # %loadbb1
4813; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 8(a0)
4814; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 8(a1)
4815; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a0
4816; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a1
4817; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB33_3
4818; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.2:
4819; CHECK-UNALIGNED-RV64-ZBB-NEXT:    li a0, 0
4820; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
4821; CHECK-UNALIGNED-RV64-ZBB-NEXT:  .LBB33_3: # %res_block
4822; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a2, a3
4823; CHECK-UNALIGNED-RV64-ZBB-NEXT:    neg a0, a0
4824; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ori a0, a0, 1
4825; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
4826;
4827; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_16:
4828; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4829; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
4830; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
4831; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4832; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4833; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB33_5
4834; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
4835; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 4(a0)
4836; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a1)
4837; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4838; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4839; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB33_5
4840; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.2: # %loadbb2
4841; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 8(a0)
4842; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 8(a1)
4843; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
4844; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
4845; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB33_5
4846; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.3: # %loadbb3
4847; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 12(a0)
4848; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 12(a1)
4849; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a0
4850; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a1
4851; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB33_5
4852; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.4:
4853; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    li a0, 0
4854; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4855; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB33_5: # %res_block
4856; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
4857; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
4858; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
4859; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
4860;
4861; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_16:
4862; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4863; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
4864; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
4865; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
4866; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
4867; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB33_3
4868; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.1: # %loadbb1
4869; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 8(a0)
4870; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 8(a1)
4871; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a0
4872; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a1
4873; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB33_3
4874; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.2:
4875; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    li a0, 0
4876; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
4877; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  .LBB33_3: # %res_block
4878; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a2, a3
4879; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    neg a0, a0
4880; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ori a0, a0, 1
4881; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
4882;
4883; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_16:
4884; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
4885; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4886; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4887; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 16
4888; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
4889; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4890; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4891; CHECK-UNALIGNED-RV32-V-NEXT:    ret
4892;
4893; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_16:
4894; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
4895; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4896; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4897; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 16
4898; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
4899; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4900; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4901; CHECK-UNALIGNED-RV64-V-NEXT:    ret
4902entry:
4903  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 16)
4904  ret i32 %memcmp
4905}
4906
4907define i32 @memcmp_size_31(ptr %s1, ptr %s2) nounwind {
4908; CHECK-ALIGNED-RV32-LABEL: memcmp_size_31:
4909; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
4910; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
4911; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4912; CHECK-ALIGNED-RV32-NEXT:    li a2, 31
4913; CHECK-ALIGNED-RV32-NEXT:    call memcmp
4914; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4915; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
4916; CHECK-ALIGNED-RV32-NEXT:    ret
4917;
4918; CHECK-ALIGNED-RV64-LABEL: memcmp_size_31:
4919; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
4920; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
4921; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4922; CHECK-ALIGNED-RV64-NEXT:    li a2, 31
4923; CHECK-ALIGNED-RV64-NEXT:    call memcmp
4924; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4925; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
4926; CHECK-ALIGNED-RV64-NEXT:    ret
4927;
4928; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_31:
4929; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
4930; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
4931; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4932; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 31
4933; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
4934; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4935; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
4936; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
4937;
4938; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_31:
4939; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
4940; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
4941; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4942; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 31
4943; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
4944; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4945; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
4946; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
4947;
4948; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_31:
4949; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
4950; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
4951; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4952; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 31
4953; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
4954; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4955; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
4956; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
4957;
4958; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_31:
4959; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
4960; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
4961; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4962; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 31
4963; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
4964; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4965; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
4966; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
4967;
4968; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_31:
4969; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
4970; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
4971; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4972; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 31
4973; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
4974; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4975; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
4976; CHECK-ALIGNED-RV32-V-NEXT:    ret
4977;
4978; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_31:
4979; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
4980; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
4981; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4982; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 31
4983; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
4984; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4985; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
4986; CHECK-ALIGNED-RV64-V-NEXT:    ret
4987;
4988; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_31:
4989; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
4990; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
4991; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4992; CHECK-UNALIGNED-RV32-NEXT:    li a2, 31
4993; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
4994; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4995; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
4996; CHECK-UNALIGNED-RV32-NEXT:    ret
4997;
4998; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_31:
4999; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
5000; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
5001; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5002; CHECK-UNALIGNED-RV64-NEXT:    li a2, 31
5003; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
5004; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5005; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
5006; CHECK-UNALIGNED-RV64-NEXT:    ret
5007;
5008; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_31:
5009; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
5010; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
5011; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
5012; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5013; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5014; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5015; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
5016; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 4(a0)
5017; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a1)
5018; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5019; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5020; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5021; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.2: # %loadbb2
5022; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 8(a0)
5023; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 8(a1)
5024; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5025; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5026; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5027; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.3: # %loadbb3
5028; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 12(a0)
5029; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 12(a1)
5030; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5031; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5032; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5033; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.4: # %loadbb4
5034; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 16(a0)
5035; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 16(a1)
5036; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5037; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5038; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5039; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.5: # %loadbb5
5040; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 20(a0)
5041; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 20(a1)
5042; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5043; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5044; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5045; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.6: # %loadbb6
5046; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 24(a0)
5047; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 24(a1)
5048; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5049; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5050; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5051; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.7: # %loadbb7
5052; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 27(a0)
5053; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 27(a1)
5054; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a0
5055; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a1
5056; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB34_9
5057; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.8:
5058; CHECK-UNALIGNED-RV32-ZBB-NEXT:    li a0, 0
5059; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
5060; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB34_9: # %res_block
5061; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
5062; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
5063; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
5064; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
5065;
5066; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_31:
5067; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
5068; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
5069; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
5070; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5071; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5072; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB34_5
5073; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.1: # %loadbb1
5074; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 8(a0)
5075; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a1)
5076; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5077; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5078; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB34_5
5079; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.2: # %loadbb2
5080; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 16(a0)
5081; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 16(a1)
5082; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5083; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5084; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB34_5
5085; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.3: # %loadbb3
5086; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 23(a0)
5087; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 23(a1)
5088; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a0
5089; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a1
5090; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB34_5
5091; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.4:
5092; CHECK-UNALIGNED-RV64-ZBB-NEXT:    li a0, 0
5093; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5094; CHECK-UNALIGNED-RV64-ZBB-NEXT:  .LBB34_5: # %res_block
5095; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a2, a3
5096; CHECK-UNALIGNED-RV64-ZBB-NEXT:    neg a0, a0
5097; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ori a0, a0, 1
5098; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5099;
5100; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_31:
5101; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
5102; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
5103; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
5104; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5105; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5106; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5107; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
5108; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 4(a0)
5109; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a1)
5110; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5111; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5112; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5113; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.2: # %loadbb2
5114; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 8(a0)
5115; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 8(a1)
5116; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5117; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5118; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5119; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.3: # %loadbb3
5120; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 12(a0)
5121; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 12(a1)
5122; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5123; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5124; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5125; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.4: # %loadbb4
5126; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 16(a0)
5127; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 16(a1)
5128; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5129; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5130; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5131; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.5: # %loadbb5
5132; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 20(a0)
5133; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 20(a1)
5134; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5135; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5136; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5137; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.6: # %loadbb6
5138; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 24(a0)
5139; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 24(a1)
5140; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5141; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5142; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5143; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.7: # %loadbb7
5144; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 27(a0)
5145; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 27(a1)
5146; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a0
5147; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a1
5148; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB34_9
5149; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.8:
5150; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    li a0, 0
5151; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
5152; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB34_9: # %res_block
5153; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
5154; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
5155; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
5156; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
5157;
5158; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_31:
5159; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
5160; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
5161; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
5162; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5163; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5164; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB34_5
5165; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.1: # %loadbb1
5166; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 8(a0)
5167; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a1)
5168; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5169; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5170; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB34_5
5171; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.2: # %loadbb2
5172; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 16(a0)
5173; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 16(a1)
5174; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5175; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5176; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB34_5
5177; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.3: # %loadbb3
5178; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 23(a0)
5179; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 23(a1)
5180; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a0
5181; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a1
5182; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB34_5
5183; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.4:
5184; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    li a0, 0
5185; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5186; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  .LBB34_5: # %res_block
5187; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a2, a3
5188; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    neg a0, a0
5189; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ori a0, a0, 1
5190; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5191;
5192; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_31:
5193; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
5194; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
5195; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5196; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 31
5197; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
5198; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5199; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
5200; CHECK-UNALIGNED-RV32-V-NEXT:    ret
5201;
5202; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_31:
5203; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
5204; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
5205; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5206; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 31
5207; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
5208; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5209; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
5210; CHECK-UNALIGNED-RV64-V-NEXT:    ret
5211entry:
5212  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 31)
5213  ret i32 %memcmp
5214}
5215
5216define i32 @memcmp_size_32(ptr %s1, ptr %s2) nounwind {
5217; CHECK-ALIGNED-RV32-LABEL: memcmp_size_32:
5218; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
5219; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
5220; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5221; CHECK-ALIGNED-RV32-NEXT:    li a2, 32
5222; CHECK-ALIGNED-RV32-NEXT:    call memcmp
5223; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5224; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
5225; CHECK-ALIGNED-RV32-NEXT:    ret
5226;
5227; CHECK-ALIGNED-RV64-LABEL: memcmp_size_32:
5228; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
5229; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
5230; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5231; CHECK-ALIGNED-RV64-NEXT:    li a2, 32
5232; CHECK-ALIGNED-RV64-NEXT:    call memcmp
5233; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5234; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
5235; CHECK-ALIGNED-RV64-NEXT:    ret
5236;
5237; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_size_32:
5238; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
5239; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
5240; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5241; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 32
5242; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
5243; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5244; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
5245; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
5246;
5247; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_32:
5248; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
5249; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
5250; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5251; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 32
5252; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
5253; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5254; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
5255; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
5256;
5257; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_size_32:
5258; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
5259; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
5260; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5261; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 32
5262; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
5263; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5264; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
5265; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
5266;
5267; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_32:
5268; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
5269; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
5270; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5271; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 32
5272; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
5273; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5274; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
5275; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
5276;
5277; CHECK-ALIGNED-RV32-V-LABEL: memcmp_size_32:
5278; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
5279; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
5280; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5281; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 32
5282; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
5283; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5284; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
5285; CHECK-ALIGNED-RV32-V-NEXT:    ret
5286;
5287; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_32:
5288; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
5289; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
5290; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5291; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 32
5292; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
5293; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5294; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
5295; CHECK-ALIGNED-RV64-V-NEXT:    ret
5296;
5297; CHECK-UNALIGNED-RV32-LABEL: memcmp_size_32:
5298; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
5299; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
5300; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5301; CHECK-UNALIGNED-RV32-NEXT:    li a2, 32
5302; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
5303; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5304; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
5305; CHECK-UNALIGNED-RV32-NEXT:    ret
5306;
5307; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_32:
5308; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
5309; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
5310; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5311; CHECK-UNALIGNED-RV64-NEXT:    li a2, 32
5312; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
5313; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5314; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
5315; CHECK-UNALIGNED-RV64-NEXT:    ret
5316;
5317; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_32:
5318; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
5319; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 0(a0)
5320; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 0(a1)
5321; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5322; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5323; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5324; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.1: # %loadbb1
5325; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 4(a0)
5326; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 4(a1)
5327; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5328; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5329; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5330; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.2: # %loadbb2
5331; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 8(a0)
5332; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 8(a1)
5333; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5334; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5335; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5336; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.3: # %loadbb3
5337; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 12(a0)
5338; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 12(a1)
5339; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5340; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5341; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5342; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.4: # %loadbb4
5343; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 16(a0)
5344; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 16(a1)
5345; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5346; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5347; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5348; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.5: # %loadbb5
5349; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 20(a0)
5350; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 20(a1)
5351; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5352; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5353; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5354; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.6: # %loadbb6
5355; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a2, 24(a0)
5356; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a3, 24(a1)
5357; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a2
5358; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a3
5359; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5360; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.7: # %loadbb7
5361; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 28(a0)
5362; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 28(a1)
5363; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a2, a0
5364; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a3, a1
5365; CHECK-UNALIGNED-RV32-ZBB-NEXT:    bne a2, a3, .LBB35_9
5366; CHECK-UNALIGNED-RV32-ZBB-NEXT:  # %bb.8:
5367; CHECK-UNALIGNED-RV32-ZBB-NEXT:    li a0, 0
5368; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
5369; CHECK-UNALIGNED-RV32-ZBB-NEXT:  .LBB35_9: # %res_block
5370; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a2, a3
5371; CHECK-UNALIGNED-RV32-ZBB-NEXT:    neg a0, a0
5372; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ori a0, a0, 1
5373; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
5374;
5375; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_32:
5376; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
5377; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
5378; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
5379; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5380; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5381; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB35_5
5382; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.1: # %loadbb1
5383; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 8(a0)
5384; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a1)
5385; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5386; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5387; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB35_5
5388; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.2: # %loadbb2
5389; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 16(a0)
5390; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 16(a1)
5391; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5392; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5393; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB35_5
5394; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.3: # %loadbb3
5395; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 24(a0)
5396; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 24(a1)
5397; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a0
5398; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a1
5399; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB35_5
5400; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.4:
5401; CHECK-UNALIGNED-RV64-ZBB-NEXT:    li a0, 0
5402; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5403; CHECK-UNALIGNED-RV64-ZBB-NEXT:  .LBB35_5: # %res_block
5404; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a2, a3
5405; CHECK-UNALIGNED-RV64-ZBB-NEXT:    neg a0, a0
5406; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ori a0, a0, 1
5407; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5408;
5409; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_32:
5410; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
5411; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 0(a0)
5412; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 0(a1)
5413; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5414; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5415; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5416; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.1: # %loadbb1
5417; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 4(a0)
5418; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 4(a1)
5419; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5420; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5421; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5422; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.2: # %loadbb2
5423; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 8(a0)
5424; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 8(a1)
5425; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5426; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5427; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5428; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.3: # %loadbb3
5429; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 12(a0)
5430; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 12(a1)
5431; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5432; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5433; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5434; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.4: # %loadbb4
5435; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 16(a0)
5436; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 16(a1)
5437; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5438; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5439; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5440; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.5: # %loadbb5
5441; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 20(a0)
5442; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 20(a1)
5443; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5444; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5445; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5446; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.6: # %loadbb6
5447; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a2, 24(a0)
5448; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a3, 24(a1)
5449; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a2
5450; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a3
5451; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5452; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.7: # %loadbb7
5453; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 28(a0)
5454; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 28(a1)
5455; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a2, a0
5456; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a3, a1
5457; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    bne a2, a3, .LBB35_9
5458; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  # %bb.8:
5459; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    li a0, 0
5460; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
5461; CHECK-UNALIGNED-RV32-ZBKB-NEXT:  .LBB35_9: # %res_block
5462; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a2, a3
5463; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    neg a0, a0
5464; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ori a0, a0, 1
5465; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
5466;
5467; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_32:
5468; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
5469; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
5470; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
5471; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5472; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5473; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB35_5
5474; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.1: # %loadbb1
5475; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 8(a0)
5476; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a1)
5477; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5478; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5479; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB35_5
5480; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.2: # %loadbb2
5481; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 16(a0)
5482; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 16(a1)
5483; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5484; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5485; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB35_5
5486; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.3: # %loadbb3
5487; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 24(a0)
5488; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 24(a1)
5489; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a0
5490; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a1
5491; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB35_5
5492; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.4:
5493; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    li a0, 0
5494; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5495; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  .LBB35_5: # %res_block
5496; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a2, a3
5497; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    neg a0, a0
5498; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ori a0, a0, 1
5499; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5500;
5501; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_32:
5502; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
5503; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
5504; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5505; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 32
5506; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
5507; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5508; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
5509; CHECK-UNALIGNED-RV32-V-NEXT:    ret
5510;
5511; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_32:
5512; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
5513; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
5514; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5515; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 32
5516; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
5517; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5518; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
5519; CHECK-UNALIGNED-RV64-V-NEXT:    ret
5520entry:
5521  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 32)
5522  ret i32 %memcmp
5523}
5524
5525define i32 @memcmp_size_63(ptr %s1, ptr %s2) nounwind {
5526; CHECK-RV32-LABEL: memcmp_size_63:
5527; CHECK-RV32:       # %bb.0: # %entry
5528; CHECK-RV32-NEXT:    addi sp, sp, -16
5529; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5530; CHECK-RV32-NEXT:    li a2, 63
5531; CHECK-RV32-NEXT:    call memcmp
5532; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5533; CHECK-RV32-NEXT:    addi sp, sp, 16
5534; CHECK-RV32-NEXT:    ret
5535;
5536; CHECK-ALIGNED-RV64-LABEL: memcmp_size_63:
5537; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
5538; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
5539; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5540; CHECK-ALIGNED-RV64-NEXT:    li a2, 63
5541; CHECK-ALIGNED-RV64-NEXT:    call memcmp
5542; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5543; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
5544; CHECK-ALIGNED-RV64-NEXT:    ret
5545;
5546; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_63:
5547; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
5548; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
5549; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5550; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 63
5551; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
5552; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5553; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
5554; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
5555;
5556; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_63:
5557; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
5558; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
5559; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5560; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 63
5561; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
5562; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5563; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
5564; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
5565;
5566; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_63:
5567; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
5568; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
5569; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5570; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 63
5571; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
5572; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5573; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
5574; CHECK-ALIGNED-RV64-V-NEXT:    ret
5575;
5576; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_63:
5577; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
5578; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
5579; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5580; CHECK-UNALIGNED-RV64-NEXT:    li a2, 63
5581; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
5582; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5583; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
5584; CHECK-UNALIGNED-RV64-NEXT:    ret
5585;
5586; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_63:
5587; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
5588; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
5589; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
5590; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5591; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5592; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5593; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.1: # %loadbb1
5594; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 8(a0)
5595; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a1)
5596; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5597; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5598; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5599; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.2: # %loadbb2
5600; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 16(a0)
5601; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 16(a1)
5602; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5603; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5604; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5605; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.3: # %loadbb3
5606; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 24(a0)
5607; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 24(a1)
5608; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5609; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5610; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5611; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.4: # %loadbb4
5612; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 32(a0)
5613; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 32(a1)
5614; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5615; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5616; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5617; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.5: # %loadbb5
5618; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 40(a0)
5619; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 40(a1)
5620; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5621; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5622; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5623; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.6: # %loadbb6
5624; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 48(a0)
5625; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 48(a1)
5626; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5627; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5628; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5629; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.7: # %loadbb7
5630; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 55(a0)
5631; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 55(a1)
5632; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a0
5633; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a1
5634; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB36_9
5635; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.8:
5636; CHECK-UNALIGNED-RV64-ZBB-NEXT:    li a0, 0
5637; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5638; CHECK-UNALIGNED-RV64-ZBB-NEXT:  .LBB36_9: # %res_block
5639; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a2, a3
5640; CHECK-UNALIGNED-RV64-ZBB-NEXT:    neg a0, a0
5641; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ori a0, a0, 1
5642; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5643;
5644; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_63:
5645; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
5646; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
5647; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
5648; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5649; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5650; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5651; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.1: # %loadbb1
5652; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 8(a0)
5653; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a1)
5654; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5655; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5656; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5657; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.2: # %loadbb2
5658; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 16(a0)
5659; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 16(a1)
5660; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5661; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5662; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5663; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.3: # %loadbb3
5664; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 24(a0)
5665; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 24(a1)
5666; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5667; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5668; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5669; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.4: # %loadbb4
5670; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 32(a0)
5671; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 32(a1)
5672; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5673; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5674; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5675; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.5: # %loadbb5
5676; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 40(a0)
5677; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 40(a1)
5678; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5679; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5680; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5681; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.6: # %loadbb6
5682; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 48(a0)
5683; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 48(a1)
5684; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5685; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5686; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5687; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.7: # %loadbb7
5688; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 55(a0)
5689; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 55(a1)
5690; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a0
5691; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a1
5692; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB36_9
5693; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.8:
5694; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    li a0, 0
5695; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5696; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  .LBB36_9: # %res_block
5697; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a2, a3
5698; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    neg a0, a0
5699; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ori a0, a0, 1
5700; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5701;
5702; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_63:
5703; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
5704; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
5705; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5706; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 63
5707; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
5708; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5709; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
5710; CHECK-UNALIGNED-RV64-V-NEXT:    ret
5711entry:
5712  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 63)
5713  ret i32 %memcmp
5714}
5715
5716define i32 @memcmp_size_64(ptr %s1, ptr %s2) nounwind {
5717; CHECK-RV32-LABEL: memcmp_size_64:
5718; CHECK-RV32:       # %bb.0: # %entry
5719; CHECK-RV32-NEXT:    addi sp, sp, -16
5720; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5721; CHECK-RV32-NEXT:    li a2, 64
5722; CHECK-RV32-NEXT:    call memcmp
5723; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5724; CHECK-RV32-NEXT:    addi sp, sp, 16
5725; CHECK-RV32-NEXT:    ret
5726;
5727; CHECK-ALIGNED-RV64-LABEL: memcmp_size_64:
5728; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
5729; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
5730; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5731; CHECK-ALIGNED-RV64-NEXT:    li a2, 64
5732; CHECK-ALIGNED-RV64-NEXT:    call memcmp
5733; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5734; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
5735; CHECK-ALIGNED-RV64-NEXT:    ret
5736;
5737; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_size_64:
5738; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
5739; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
5740; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5741; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 64
5742; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
5743; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5744; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
5745; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
5746;
5747; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_size_64:
5748; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
5749; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
5750; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5751; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 64
5752; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
5753; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5754; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
5755; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
5756;
5757; CHECK-ALIGNED-RV64-V-LABEL: memcmp_size_64:
5758; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
5759; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
5760; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5761; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 64
5762; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
5763; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5764; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
5765; CHECK-ALIGNED-RV64-V-NEXT:    ret
5766;
5767; CHECK-UNALIGNED-RV64-LABEL: memcmp_size_64:
5768; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
5769; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
5770; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5771; CHECK-UNALIGNED-RV64-NEXT:    li a2, 64
5772; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
5773; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5774; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
5775; CHECK-UNALIGNED-RV64-NEXT:    ret
5776;
5777; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_64:
5778; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
5779; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 0(a0)
5780; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 0(a1)
5781; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5782; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5783; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5784; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.1: # %loadbb1
5785; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 8(a0)
5786; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 8(a1)
5787; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5788; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5789; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5790; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.2: # %loadbb2
5791; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 16(a0)
5792; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 16(a1)
5793; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5794; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5795; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5796; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.3: # %loadbb3
5797; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 24(a0)
5798; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 24(a1)
5799; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5800; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5801; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5802; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.4: # %loadbb4
5803; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 32(a0)
5804; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 32(a1)
5805; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5806; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5807; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5808; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.5: # %loadbb5
5809; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 40(a0)
5810; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 40(a1)
5811; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5812; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5813; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5814; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.6: # %loadbb6
5815; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a2, 48(a0)
5816; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a3, 48(a1)
5817; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a2
5818; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a3
5819; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5820; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.7: # %loadbb7
5821; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a0, 56(a0)
5822; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ld a1, 56(a1)
5823; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a2, a0
5824; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a3, a1
5825; CHECK-UNALIGNED-RV64-ZBB-NEXT:    bne a2, a3, .LBB37_9
5826; CHECK-UNALIGNED-RV64-ZBB-NEXT:  # %bb.8:
5827; CHECK-UNALIGNED-RV64-ZBB-NEXT:    li a0, 0
5828; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5829; CHECK-UNALIGNED-RV64-ZBB-NEXT:  .LBB37_9: # %res_block
5830; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a2, a3
5831; CHECK-UNALIGNED-RV64-ZBB-NEXT:    neg a0, a0
5832; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ori a0, a0, 1
5833; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
5834;
5835; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_64:
5836; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
5837; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 0(a0)
5838; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 0(a1)
5839; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5840; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5841; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5842; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.1: # %loadbb1
5843; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 8(a0)
5844; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 8(a1)
5845; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5846; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5847; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5848; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.2: # %loadbb2
5849; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 16(a0)
5850; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 16(a1)
5851; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5852; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5853; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5854; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.3: # %loadbb3
5855; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 24(a0)
5856; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 24(a1)
5857; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5858; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5859; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5860; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.4: # %loadbb4
5861; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 32(a0)
5862; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 32(a1)
5863; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5864; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5865; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5866; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.5: # %loadbb5
5867; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 40(a0)
5868; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 40(a1)
5869; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5870; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5871; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5872; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.6: # %loadbb6
5873; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a2, 48(a0)
5874; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a3, 48(a1)
5875; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a2
5876; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a3
5877; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5878; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.7: # %loadbb7
5879; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a0, 56(a0)
5880; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ld a1, 56(a1)
5881; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a2, a0
5882; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a3, a1
5883; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    bne a2, a3, .LBB37_9
5884; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  # %bb.8:
5885; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    li a0, 0
5886; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5887; CHECK-UNALIGNED-RV64-ZBKB-NEXT:  .LBB37_9: # %res_block
5888; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a2, a3
5889; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    neg a0, a0
5890; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ori a0, a0, 1
5891; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
5892;
5893; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_size_64:
5894; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
5895; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
5896; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5897; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 64
5898; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
5899; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5900; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
5901; CHECK-UNALIGNED-RV64-V-NEXT:    ret
5902entry:
5903  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 64)
5904  ret i32 %memcmp
5905}
5906
5907define i32 @memcmp_size_127(ptr %s1, ptr %s2) nounwind {
5908; CHECK-RV32-LABEL: memcmp_size_127:
5909; CHECK-RV32:       # %bb.0: # %entry
5910; CHECK-RV32-NEXT:    addi sp, sp, -16
5911; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5912; CHECK-RV32-NEXT:    li a2, 127
5913; CHECK-RV32-NEXT:    call memcmp
5914; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5915; CHECK-RV32-NEXT:    addi sp, sp, 16
5916; CHECK-RV32-NEXT:    ret
5917;
5918; CHECK-RV64-LABEL: memcmp_size_127:
5919; CHECK-RV64:       # %bb.0: # %entry
5920; CHECK-RV64-NEXT:    addi sp, sp, -16
5921; CHECK-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5922; CHECK-RV64-NEXT:    li a2, 127
5923; CHECK-RV64-NEXT:    call memcmp
5924; CHECK-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5925; CHECK-RV64-NEXT:    addi sp, sp, 16
5926; CHECK-RV64-NEXT:    ret
5927entry:
5928  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 127)
5929  ret i32 %memcmp
5930}
5931
5932define i32 @memcmp_size_128(ptr %s1, ptr %s2) nounwind {
5933; CHECK-RV32-LABEL: memcmp_size_128:
5934; CHECK-RV32:       # %bb.0: # %entry
5935; CHECK-RV32-NEXT:    addi sp, sp, -16
5936; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5937; CHECK-RV32-NEXT:    li a2, 128
5938; CHECK-RV32-NEXT:    call memcmp
5939; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5940; CHECK-RV32-NEXT:    addi sp, sp, 16
5941; CHECK-RV32-NEXT:    ret
5942;
5943; CHECK-RV64-LABEL: memcmp_size_128:
5944; CHECK-RV64:       # %bb.0: # %entry
5945; CHECK-RV64-NEXT:    addi sp, sp, -16
5946; CHECK-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5947; CHECK-RV64-NEXT:    li a2, 128
5948; CHECK-RV64-NEXT:    call memcmp
5949; CHECK-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5950; CHECK-RV64-NEXT:    addi sp, sp, 16
5951; CHECK-RV64-NEXT:    ret
5952entry:
5953  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 128)
5954  ret i32 %memcmp
5955}
5956
5957define i32 @memcmp_size_runtime(ptr %s1, ptr %s2, iXLen %len) nounwind {
5958; CHECK-RV32-LABEL: memcmp_size_runtime:
5959; CHECK-RV32:       # %bb.0: # %entry
5960; CHECK-RV32-NEXT:    addi sp, sp, -16
5961; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5962; CHECK-RV32-NEXT:    call memcmp
5963; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5964; CHECK-RV32-NEXT:    addi sp, sp, 16
5965; CHECK-RV32-NEXT:    ret
5966;
5967; CHECK-RV64-LABEL: memcmp_size_runtime:
5968; CHECK-RV64:       # %bb.0: # %entry
5969; CHECK-RV64-NEXT:    addi sp, sp, -16
5970; CHECK-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5971; CHECK-RV64-NEXT:    call memcmp
5972; CHECK-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5973; CHECK-RV64-NEXT:    addi sp, sp, 16
5974; CHECK-RV64-NEXT:    ret
5975entry:
5976  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen %len)
5977  ret i32 %memcmp
5978}
5979
5980define i1 @memcmp_eq_zero(ptr %s1, ptr %s2) nounwind {
5981; CHECK-ALIGNED-RV32-LABEL: memcmp_eq_zero:
5982; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
5983; CHECK-ALIGNED-RV32-NEXT:    lbu a2, 1(a1)
5984; CHECK-ALIGNED-RV32-NEXT:    lbu a3, 2(a1)
5985; CHECK-ALIGNED-RV32-NEXT:    lbu a4, 3(a1)
5986; CHECK-ALIGNED-RV32-NEXT:    lbu a1, 0(a1)
5987; CHECK-ALIGNED-RV32-NEXT:    slli a2, a2, 8
5988; CHECK-ALIGNED-RV32-NEXT:    slli a3, a3, 16
5989; CHECK-ALIGNED-RV32-NEXT:    slli a4, a4, 24
5990; CHECK-ALIGNED-RV32-NEXT:    or a1, a2, a1
5991; CHECK-ALIGNED-RV32-NEXT:    lbu a2, 0(a0)
5992; CHECK-ALIGNED-RV32-NEXT:    lbu a5, 1(a0)
5993; CHECK-ALIGNED-RV32-NEXT:    or a3, a4, a3
5994; CHECK-ALIGNED-RV32-NEXT:    lbu a4, 2(a0)
5995; CHECK-ALIGNED-RV32-NEXT:    lbu a0, 3(a0)
5996; CHECK-ALIGNED-RV32-NEXT:    slli a5, a5, 8
5997; CHECK-ALIGNED-RV32-NEXT:    or a2, a5, a2
5998; CHECK-ALIGNED-RV32-NEXT:    slli a4, a4, 16
5999; CHECK-ALIGNED-RV32-NEXT:    slli a0, a0, 24
6000; CHECK-ALIGNED-RV32-NEXT:    or a0, a0, a4
6001; CHECK-ALIGNED-RV32-NEXT:    or a1, a3, a1
6002; CHECK-ALIGNED-RV32-NEXT:    or a0, a0, a2
6003; CHECK-ALIGNED-RV32-NEXT:    xor a0, a0, a1
6004; CHECK-ALIGNED-RV32-NEXT:    seqz a0, a0
6005; CHECK-ALIGNED-RV32-NEXT:    ret
6006;
6007; CHECK-ALIGNED-RV64-LABEL: memcmp_eq_zero:
6008; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
6009; CHECK-ALIGNED-RV64-NEXT:    lbu a2, 1(a1)
6010; CHECK-ALIGNED-RV64-NEXT:    lbu a3, 2(a1)
6011; CHECK-ALIGNED-RV64-NEXT:    lb a4, 3(a1)
6012; CHECK-ALIGNED-RV64-NEXT:    lbu a1, 0(a1)
6013; CHECK-ALIGNED-RV64-NEXT:    slli a2, a2, 8
6014; CHECK-ALIGNED-RV64-NEXT:    slli a3, a3, 16
6015; CHECK-ALIGNED-RV64-NEXT:    slli a4, a4, 24
6016; CHECK-ALIGNED-RV64-NEXT:    or a1, a2, a1
6017; CHECK-ALIGNED-RV64-NEXT:    lbu a2, 0(a0)
6018; CHECK-ALIGNED-RV64-NEXT:    lbu a5, 1(a0)
6019; CHECK-ALIGNED-RV64-NEXT:    or a3, a4, a3
6020; CHECK-ALIGNED-RV64-NEXT:    lbu a4, 2(a0)
6021; CHECK-ALIGNED-RV64-NEXT:    lb a0, 3(a0)
6022; CHECK-ALIGNED-RV64-NEXT:    slli a5, a5, 8
6023; CHECK-ALIGNED-RV64-NEXT:    or a2, a5, a2
6024; CHECK-ALIGNED-RV64-NEXT:    slli a4, a4, 16
6025; CHECK-ALIGNED-RV64-NEXT:    slli a0, a0, 24
6026; CHECK-ALIGNED-RV64-NEXT:    or a0, a0, a4
6027; CHECK-ALIGNED-RV64-NEXT:    or a1, a3, a1
6028; CHECK-ALIGNED-RV64-NEXT:    or a0, a0, a2
6029; CHECK-ALIGNED-RV64-NEXT:    xor a0, a0, a1
6030; CHECK-ALIGNED-RV64-NEXT:    seqz a0, a0
6031; CHECK-ALIGNED-RV64-NEXT:    ret
6032;
6033; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_eq_zero:
6034; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
6035; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a2, 1(a1)
6036; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a3, 2(a1)
6037; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a4, 3(a1)
6038; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a1, 0(a1)
6039; CHECK-ALIGNED-RV32-ZBB-NEXT:    slli a2, a2, 8
6040; CHECK-ALIGNED-RV32-ZBB-NEXT:    slli a3, a3, 16
6041; CHECK-ALIGNED-RV32-ZBB-NEXT:    slli a4, a4, 24
6042; CHECK-ALIGNED-RV32-ZBB-NEXT:    or a1, a2, a1
6043; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a2, 0(a0)
6044; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a5, 1(a0)
6045; CHECK-ALIGNED-RV32-ZBB-NEXT:    or a3, a4, a3
6046; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a4, 2(a0)
6047; CHECK-ALIGNED-RV32-ZBB-NEXT:    lbu a0, 3(a0)
6048; CHECK-ALIGNED-RV32-ZBB-NEXT:    slli a5, a5, 8
6049; CHECK-ALIGNED-RV32-ZBB-NEXT:    or a2, a5, a2
6050; CHECK-ALIGNED-RV32-ZBB-NEXT:    slli a4, a4, 16
6051; CHECK-ALIGNED-RV32-ZBB-NEXT:    slli a0, a0, 24
6052; CHECK-ALIGNED-RV32-ZBB-NEXT:    or a0, a0, a4
6053; CHECK-ALIGNED-RV32-ZBB-NEXT:    or a1, a3, a1
6054; CHECK-ALIGNED-RV32-ZBB-NEXT:    or a0, a0, a2
6055; CHECK-ALIGNED-RV32-ZBB-NEXT:    xor a0, a0, a1
6056; CHECK-ALIGNED-RV32-ZBB-NEXT:    seqz a0, a0
6057; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
6058;
6059; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_eq_zero:
6060; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
6061; CHECK-ALIGNED-RV64-ZBB-NEXT:    lbu a2, 1(a1)
6062; CHECK-ALIGNED-RV64-ZBB-NEXT:    lbu a3, 2(a1)
6063; CHECK-ALIGNED-RV64-ZBB-NEXT:    lb a4, 3(a1)
6064; CHECK-ALIGNED-RV64-ZBB-NEXT:    lbu a1, 0(a1)
6065; CHECK-ALIGNED-RV64-ZBB-NEXT:    slli a2, a2, 8
6066; CHECK-ALIGNED-RV64-ZBB-NEXT:    slli a3, a3, 16
6067; CHECK-ALIGNED-RV64-ZBB-NEXT:    slli a4, a4, 24
6068; CHECK-ALIGNED-RV64-ZBB-NEXT:    or a1, a2, a1
6069; CHECK-ALIGNED-RV64-ZBB-NEXT:    lbu a2, 0(a0)
6070; CHECK-ALIGNED-RV64-ZBB-NEXT:    lbu a5, 1(a0)
6071; CHECK-ALIGNED-RV64-ZBB-NEXT:    or a3, a4, a3
6072; CHECK-ALIGNED-RV64-ZBB-NEXT:    lbu a4, 2(a0)
6073; CHECK-ALIGNED-RV64-ZBB-NEXT:    lb a0, 3(a0)
6074; CHECK-ALIGNED-RV64-ZBB-NEXT:    slli a5, a5, 8
6075; CHECK-ALIGNED-RV64-ZBB-NEXT:    or a2, a5, a2
6076; CHECK-ALIGNED-RV64-ZBB-NEXT:    slli a4, a4, 16
6077; CHECK-ALIGNED-RV64-ZBB-NEXT:    slli a0, a0, 24
6078; CHECK-ALIGNED-RV64-ZBB-NEXT:    or a0, a0, a4
6079; CHECK-ALIGNED-RV64-ZBB-NEXT:    or a1, a3, a1
6080; CHECK-ALIGNED-RV64-ZBB-NEXT:    or a0, a0, a2
6081; CHECK-ALIGNED-RV64-ZBB-NEXT:    xor a0, a0, a1
6082; CHECK-ALIGNED-RV64-ZBB-NEXT:    seqz a0, a0
6083; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
6084;
6085; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_eq_zero:
6086; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6087; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a2, 0(a1)
6088; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a3, 1(a1)
6089; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a4, 2(a1)
6090; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a1, 3(a1)
6091; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a5, 1(a0)
6092; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a6, 2(a0)
6093; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a7, 3(a0)
6094; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lbu a0, 0(a0)
6095; CHECK-ALIGNED-RV32-ZBKB-NEXT:    packh a1, a4, a1
6096; CHECK-ALIGNED-RV32-ZBKB-NEXT:    packh a2, a2, a3
6097; CHECK-ALIGNED-RV32-ZBKB-NEXT:    packh a3, a6, a7
6098; CHECK-ALIGNED-RV32-ZBKB-NEXT:    packh a0, a0, a5
6099; CHECK-ALIGNED-RV32-ZBKB-NEXT:    pack a1, a2, a1
6100; CHECK-ALIGNED-RV32-ZBKB-NEXT:    pack a0, a0, a3
6101; CHECK-ALIGNED-RV32-ZBKB-NEXT:    xor a0, a0, a1
6102; CHECK-ALIGNED-RV32-ZBKB-NEXT:    seqz a0, a0
6103; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
6104;
6105; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_eq_zero:
6106; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6107; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lbu a2, 0(a1)
6108; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lbu a3, 1(a1)
6109; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lbu a4, 2(a1)
6110; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lb a1, 3(a1)
6111; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lbu a5, 0(a0)
6112; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lbu a6, 1(a0)
6113; CHECK-ALIGNED-RV64-ZBKB-NEXT:    packh a2, a2, a3
6114; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lbu a3, 2(a0)
6115; CHECK-ALIGNED-RV64-ZBKB-NEXT:    lb a0, 3(a0)
6116; CHECK-ALIGNED-RV64-ZBKB-NEXT:    packh a5, a5, a6
6117; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slli a4, a4, 16
6118; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slli a1, a1, 24
6119; CHECK-ALIGNED-RV64-ZBKB-NEXT:    or a1, a1, a4
6120; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slli a3, a3, 16
6121; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slli a0, a0, 24
6122; CHECK-ALIGNED-RV64-ZBKB-NEXT:    or a0, a0, a3
6123; CHECK-ALIGNED-RV64-ZBKB-NEXT:    or a1, a1, a2
6124; CHECK-ALIGNED-RV64-ZBKB-NEXT:    or a0, a0, a5
6125; CHECK-ALIGNED-RV64-ZBKB-NEXT:    xor a0, a0, a1
6126; CHECK-ALIGNED-RV64-ZBKB-NEXT:    seqz a0, a0
6127; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
6128;
6129; CHECK-ALIGNED-RV32-V-LABEL: memcmp_eq_zero:
6130; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
6131; CHECK-ALIGNED-RV32-V-NEXT:    lbu a2, 1(a1)
6132; CHECK-ALIGNED-RV32-V-NEXT:    lbu a3, 2(a1)
6133; CHECK-ALIGNED-RV32-V-NEXT:    lbu a4, 3(a1)
6134; CHECK-ALIGNED-RV32-V-NEXT:    lbu a1, 0(a1)
6135; CHECK-ALIGNED-RV32-V-NEXT:    slli a2, a2, 8
6136; CHECK-ALIGNED-RV32-V-NEXT:    slli a3, a3, 16
6137; CHECK-ALIGNED-RV32-V-NEXT:    slli a4, a4, 24
6138; CHECK-ALIGNED-RV32-V-NEXT:    or a1, a2, a1
6139; CHECK-ALIGNED-RV32-V-NEXT:    lbu a2, 0(a0)
6140; CHECK-ALIGNED-RV32-V-NEXT:    lbu a5, 1(a0)
6141; CHECK-ALIGNED-RV32-V-NEXT:    or a3, a4, a3
6142; CHECK-ALIGNED-RV32-V-NEXT:    lbu a4, 2(a0)
6143; CHECK-ALIGNED-RV32-V-NEXT:    lbu a0, 3(a0)
6144; CHECK-ALIGNED-RV32-V-NEXT:    slli a5, a5, 8
6145; CHECK-ALIGNED-RV32-V-NEXT:    or a2, a5, a2
6146; CHECK-ALIGNED-RV32-V-NEXT:    slli a4, a4, 16
6147; CHECK-ALIGNED-RV32-V-NEXT:    slli a0, a0, 24
6148; CHECK-ALIGNED-RV32-V-NEXT:    or a0, a0, a4
6149; CHECK-ALIGNED-RV32-V-NEXT:    or a1, a3, a1
6150; CHECK-ALIGNED-RV32-V-NEXT:    or a0, a0, a2
6151; CHECK-ALIGNED-RV32-V-NEXT:    xor a0, a0, a1
6152; CHECK-ALIGNED-RV32-V-NEXT:    seqz a0, a0
6153; CHECK-ALIGNED-RV32-V-NEXT:    ret
6154;
6155; CHECK-ALIGNED-RV64-V-LABEL: memcmp_eq_zero:
6156; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
6157; CHECK-ALIGNED-RV64-V-NEXT:    lbu a2, 1(a1)
6158; CHECK-ALIGNED-RV64-V-NEXT:    lbu a3, 2(a1)
6159; CHECK-ALIGNED-RV64-V-NEXT:    lb a4, 3(a1)
6160; CHECK-ALIGNED-RV64-V-NEXT:    lbu a1, 0(a1)
6161; CHECK-ALIGNED-RV64-V-NEXT:    slli a2, a2, 8
6162; CHECK-ALIGNED-RV64-V-NEXT:    slli a3, a3, 16
6163; CHECK-ALIGNED-RV64-V-NEXT:    slli a4, a4, 24
6164; CHECK-ALIGNED-RV64-V-NEXT:    or a1, a2, a1
6165; CHECK-ALIGNED-RV64-V-NEXT:    lbu a2, 0(a0)
6166; CHECK-ALIGNED-RV64-V-NEXT:    lbu a5, 1(a0)
6167; CHECK-ALIGNED-RV64-V-NEXT:    or a3, a4, a3
6168; CHECK-ALIGNED-RV64-V-NEXT:    lbu a4, 2(a0)
6169; CHECK-ALIGNED-RV64-V-NEXT:    lb a0, 3(a0)
6170; CHECK-ALIGNED-RV64-V-NEXT:    slli a5, a5, 8
6171; CHECK-ALIGNED-RV64-V-NEXT:    or a2, a5, a2
6172; CHECK-ALIGNED-RV64-V-NEXT:    slli a4, a4, 16
6173; CHECK-ALIGNED-RV64-V-NEXT:    slli a0, a0, 24
6174; CHECK-ALIGNED-RV64-V-NEXT:    or a0, a0, a4
6175; CHECK-ALIGNED-RV64-V-NEXT:    or a1, a3, a1
6176; CHECK-ALIGNED-RV64-V-NEXT:    or a0, a0, a2
6177; CHECK-ALIGNED-RV64-V-NEXT:    xor a0, a0, a1
6178; CHECK-ALIGNED-RV64-V-NEXT:    seqz a0, a0
6179; CHECK-ALIGNED-RV64-V-NEXT:    ret
6180;
6181; CHECK-UNALIGNED-LABEL: memcmp_eq_zero:
6182; CHECK-UNALIGNED:       # %bb.0: # %entry
6183; CHECK-UNALIGNED-NEXT:    lw a0, 0(a0)
6184; CHECK-UNALIGNED-NEXT:    lw a1, 0(a1)
6185; CHECK-UNALIGNED-NEXT:    xor a0, a0, a1
6186; CHECK-UNALIGNED-NEXT:    seqz a0, a0
6187; CHECK-UNALIGNED-NEXT:    ret
6188entry:
6189  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 4)
6190  %ret = icmp eq i32 %memcmp, 0
6191  ret i1 %ret
6192}
6193
6194define i1 @memcmp_lt_zero(ptr %s1, ptr %s2) nounwind {
6195; CHECK-ALIGNED-RV32-LABEL: memcmp_lt_zero:
6196; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
6197; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
6198; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6199; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
6200; CHECK-ALIGNED-RV32-NEXT:    call memcmp
6201; CHECK-ALIGNED-RV32-NEXT:    srli a0, a0, 31
6202; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6203; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
6204; CHECK-ALIGNED-RV32-NEXT:    ret
6205;
6206; CHECK-ALIGNED-RV64-LABEL: memcmp_lt_zero:
6207; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
6208; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
6209; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6210; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
6211; CHECK-ALIGNED-RV64-NEXT:    call memcmp
6212; CHECK-ALIGNED-RV64-NEXT:    slti a0, a0, 0
6213; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6214; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
6215; CHECK-ALIGNED-RV64-NEXT:    ret
6216;
6217; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_lt_zero:
6218; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
6219; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
6220; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6221; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
6222; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
6223; CHECK-ALIGNED-RV32-ZBB-NEXT:    srli a0, a0, 31
6224; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6225; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
6226; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
6227;
6228; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_lt_zero:
6229; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
6230; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
6231; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6232; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
6233; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
6234; CHECK-ALIGNED-RV64-ZBB-NEXT:    slti a0, a0, 0
6235; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6236; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
6237; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
6238;
6239; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_lt_zero:
6240; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6241; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
6242; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6243; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
6244; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
6245; CHECK-ALIGNED-RV32-ZBKB-NEXT:    srli a0, a0, 31
6246; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6247; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
6248; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
6249;
6250; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_lt_zero:
6251; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6252; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
6253; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6254; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
6255; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
6256; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slti a0, a0, 0
6257; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6258; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
6259; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
6260;
6261; CHECK-ALIGNED-RV32-V-LABEL: memcmp_lt_zero:
6262; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
6263; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6264; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6265; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
6266; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
6267; CHECK-ALIGNED-RV32-V-NEXT:    srli a0, a0, 31
6268; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6269; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6270; CHECK-ALIGNED-RV32-V-NEXT:    ret
6271;
6272; CHECK-ALIGNED-RV64-V-LABEL: memcmp_lt_zero:
6273; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
6274; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6275; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6276; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
6277; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
6278; CHECK-ALIGNED-RV64-V-NEXT:    slti a0, a0, 0
6279; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6280; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6281; CHECK-ALIGNED-RV64-V-NEXT:    ret
6282;
6283; CHECK-UNALIGNED-RV32-LABEL: memcmp_lt_zero:
6284; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
6285; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
6286; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6287; CHECK-UNALIGNED-RV32-NEXT:    li a2, 4
6288; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
6289; CHECK-UNALIGNED-RV32-NEXT:    srli a0, a0, 31
6290; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6291; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
6292; CHECK-UNALIGNED-RV32-NEXT:    ret
6293;
6294; CHECK-UNALIGNED-RV64-LABEL: memcmp_lt_zero:
6295; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
6296; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
6297; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6298; CHECK-UNALIGNED-RV64-NEXT:    li a2, 4
6299; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
6300; CHECK-UNALIGNED-RV64-NEXT:    slti a0, a0, 0
6301; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6302; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
6303; CHECK-UNALIGNED-RV64-NEXT:    ret
6304;
6305; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_lt_zero:
6306; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
6307; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 0(a0)
6308; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 0(a1)
6309; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a0, a0
6310; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a1, a1
6311; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a0, a1
6312; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
6313;
6314; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_lt_zero:
6315; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
6316; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a0, 0(a0)
6317; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a1, 0(a1)
6318; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
6319; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
6320; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a0, a0, 32
6321; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a1, a1, 32
6322; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a0, a1
6323; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
6324;
6325; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_lt_zero:
6326; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6327; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 0(a0)
6328; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 0(a1)
6329; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a0, a0
6330; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a1, a1
6331; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a0, a1
6332; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
6333;
6334; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_lt_zero:
6335; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6336; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a0, 0(a0)
6337; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a1, 0(a1)
6338; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
6339; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
6340; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a0, a0, 32
6341; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a1, a1, 32
6342; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a0, a1
6343; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
6344;
6345; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_lt_zero:
6346; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
6347; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6348; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6349; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 4
6350; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
6351; CHECK-UNALIGNED-RV32-V-NEXT:    srli a0, a0, 31
6352; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6353; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6354; CHECK-UNALIGNED-RV32-V-NEXT:    ret
6355;
6356; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_lt_zero:
6357; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
6358; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6359; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6360; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 4
6361; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
6362; CHECK-UNALIGNED-RV64-V-NEXT:    slti a0, a0, 0
6363; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6364; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6365; CHECK-UNALIGNED-RV64-V-NEXT:    ret
6366entry:
6367  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 4)
6368  %ret = icmp slt i32 %memcmp, 0
6369  ret i1 %ret
6370}
6371
6372define i1 @memcmp_gt_zero(ptr %s1, ptr %s2) nounwind {
6373; CHECK-ALIGNED-RV32-LABEL: memcmp_gt_zero:
6374; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
6375; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
6376; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6377; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
6378; CHECK-ALIGNED-RV32-NEXT:    call memcmp
6379; CHECK-ALIGNED-RV32-NEXT:    sgtz a0, a0
6380; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6381; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
6382; CHECK-ALIGNED-RV32-NEXT:    ret
6383;
6384; CHECK-ALIGNED-RV64-LABEL: memcmp_gt_zero:
6385; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
6386; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
6387; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6388; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
6389; CHECK-ALIGNED-RV64-NEXT:    call memcmp
6390; CHECK-ALIGNED-RV64-NEXT:    sgtz a0, a0
6391; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6392; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
6393; CHECK-ALIGNED-RV64-NEXT:    ret
6394;
6395; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_gt_zero:
6396; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
6397; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
6398; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6399; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
6400; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
6401; CHECK-ALIGNED-RV32-ZBB-NEXT:    sgtz a0, a0
6402; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6403; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
6404; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
6405;
6406; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_gt_zero:
6407; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
6408; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
6409; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6410; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
6411; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
6412; CHECK-ALIGNED-RV64-ZBB-NEXT:    sgtz a0, a0
6413; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6414; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
6415; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
6416;
6417; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_gt_zero:
6418; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6419; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
6420; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6421; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
6422; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
6423; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sgtz a0, a0
6424; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6425; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
6426; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
6427;
6428; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_gt_zero:
6429; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6430; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
6431; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6432; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
6433; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
6434; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sgtz a0, a0
6435; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6436; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
6437; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
6438;
6439; CHECK-ALIGNED-RV32-V-LABEL: memcmp_gt_zero:
6440; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
6441; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6442; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6443; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
6444; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
6445; CHECK-ALIGNED-RV32-V-NEXT:    sgtz a0, a0
6446; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6447; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6448; CHECK-ALIGNED-RV32-V-NEXT:    ret
6449;
6450; CHECK-ALIGNED-RV64-V-LABEL: memcmp_gt_zero:
6451; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
6452; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6453; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6454; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
6455; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
6456; CHECK-ALIGNED-RV64-V-NEXT:    sgtz a0, a0
6457; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6458; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6459; CHECK-ALIGNED-RV64-V-NEXT:    ret
6460;
6461; CHECK-UNALIGNED-RV32-LABEL: memcmp_gt_zero:
6462; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
6463; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
6464; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6465; CHECK-UNALIGNED-RV32-NEXT:    li a2, 4
6466; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
6467; CHECK-UNALIGNED-RV32-NEXT:    sgtz a0, a0
6468; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6469; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
6470; CHECK-UNALIGNED-RV32-NEXT:    ret
6471;
6472; CHECK-UNALIGNED-RV64-LABEL: memcmp_gt_zero:
6473; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
6474; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
6475; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6476; CHECK-UNALIGNED-RV64-NEXT:    li a2, 4
6477; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
6478; CHECK-UNALIGNED-RV64-NEXT:    sgtz a0, a0
6479; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6480; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
6481; CHECK-UNALIGNED-RV64-NEXT:    ret
6482;
6483; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_gt_zero:
6484; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
6485; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 0(a0)
6486; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 0(a1)
6487; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a0, a0
6488; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a1, a1
6489; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a1, a0
6490; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
6491;
6492; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_gt_zero:
6493; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
6494; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a0, 0(a0)
6495; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a1, 0(a1)
6496; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
6497; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
6498; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a0, a0, 32
6499; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a1, a1, 32
6500; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a1, a0
6501; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
6502;
6503; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_gt_zero:
6504; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6505; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 0(a0)
6506; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 0(a1)
6507; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a0, a0
6508; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a1, a1
6509; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a1, a0
6510; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
6511;
6512; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_gt_zero:
6513; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6514; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a0, 0(a0)
6515; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a1, 0(a1)
6516; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
6517; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
6518; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a0, a0, 32
6519; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a1, a1, 32
6520; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a1, a0
6521; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
6522;
6523; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_gt_zero:
6524; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
6525; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6526; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6527; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 4
6528; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
6529; CHECK-UNALIGNED-RV32-V-NEXT:    sgtz a0, a0
6530; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6531; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6532; CHECK-UNALIGNED-RV32-V-NEXT:    ret
6533;
6534; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_gt_zero:
6535; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
6536; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6537; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6538; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 4
6539; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
6540; CHECK-UNALIGNED-RV64-V-NEXT:    sgtz a0, a0
6541; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6542; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6543; CHECK-UNALIGNED-RV64-V-NEXT:    ret
6544entry:
6545  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 4)
6546  %ret = icmp sgt i32 %memcmp, 0
6547  ret i1 %ret
6548}
6549
6550define i1 @memcmp_le_zero(ptr %s1, ptr %s2) nounwind {
6551; CHECK-ALIGNED-RV32-LABEL: memcmp_le_zero:
6552; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
6553; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
6554; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6555; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
6556; CHECK-ALIGNED-RV32-NEXT:    call memcmp
6557; CHECK-ALIGNED-RV32-NEXT:    slti a0, a0, 1
6558; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6559; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
6560; CHECK-ALIGNED-RV32-NEXT:    ret
6561;
6562; CHECK-ALIGNED-RV64-LABEL: memcmp_le_zero:
6563; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
6564; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
6565; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6566; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
6567; CHECK-ALIGNED-RV64-NEXT:    call memcmp
6568; CHECK-ALIGNED-RV64-NEXT:    slti a0, a0, 1
6569; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6570; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
6571; CHECK-ALIGNED-RV64-NEXT:    ret
6572;
6573; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_le_zero:
6574; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
6575; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
6576; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6577; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
6578; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
6579; CHECK-ALIGNED-RV32-ZBB-NEXT:    slti a0, a0, 1
6580; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6581; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
6582; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
6583;
6584; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_le_zero:
6585; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
6586; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
6587; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6588; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
6589; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
6590; CHECK-ALIGNED-RV64-ZBB-NEXT:    slti a0, a0, 1
6591; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6592; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
6593; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
6594;
6595; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_le_zero:
6596; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6597; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
6598; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6599; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
6600; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
6601; CHECK-ALIGNED-RV32-ZBKB-NEXT:    slti a0, a0, 1
6602; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6603; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
6604; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
6605;
6606; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_le_zero:
6607; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6608; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
6609; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6610; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
6611; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
6612; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slti a0, a0, 1
6613; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6614; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
6615; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
6616;
6617; CHECK-ALIGNED-RV32-V-LABEL: memcmp_le_zero:
6618; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
6619; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6620; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6621; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
6622; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
6623; CHECK-ALIGNED-RV32-V-NEXT:    slti a0, a0, 1
6624; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6625; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6626; CHECK-ALIGNED-RV32-V-NEXT:    ret
6627;
6628; CHECK-ALIGNED-RV64-V-LABEL: memcmp_le_zero:
6629; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
6630; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6631; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6632; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
6633; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
6634; CHECK-ALIGNED-RV64-V-NEXT:    slti a0, a0, 1
6635; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6636; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6637; CHECK-ALIGNED-RV64-V-NEXT:    ret
6638;
6639; CHECK-UNALIGNED-RV32-LABEL: memcmp_le_zero:
6640; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
6641; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
6642; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6643; CHECK-UNALIGNED-RV32-NEXT:    li a2, 4
6644; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
6645; CHECK-UNALIGNED-RV32-NEXT:    slti a0, a0, 1
6646; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6647; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
6648; CHECK-UNALIGNED-RV32-NEXT:    ret
6649;
6650; CHECK-UNALIGNED-RV64-LABEL: memcmp_le_zero:
6651; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
6652; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
6653; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6654; CHECK-UNALIGNED-RV64-NEXT:    li a2, 4
6655; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
6656; CHECK-UNALIGNED-RV64-NEXT:    slti a0, a0, 1
6657; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6658; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
6659; CHECK-UNALIGNED-RV64-NEXT:    ret
6660;
6661; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_le_zero:
6662; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
6663; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 0(a0)
6664; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 0(a1)
6665; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a0, a0
6666; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a1, a1
6667; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a1, a0
6668; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xori a0, a0, 1
6669; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
6670;
6671; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_le_zero:
6672; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
6673; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a0, 0(a0)
6674; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a1, 0(a1)
6675; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
6676; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
6677; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a0, a0, 32
6678; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a1, a1, 32
6679; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a1, a0
6680; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xori a0, a0, 1
6681; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
6682;
6683; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_le_zero:
6684; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6685; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 0(a0)
6686; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 0(a1)
6687; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a0, a0
6688; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a1, a1
6689; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a1, a0
6690; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xori a0, a0, 1
6691; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
6692;
6693; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_le_zero:
6694; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6695; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a0, 0(a0)
6696; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a1, 0(a1)
6697; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
6698; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
6699; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a0, a0, 32
6700; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a1, a1, 32
6701; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a1, a0
6702; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xori a0, a0, 1
6703; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
6704;
6705; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_le_zero:
6706; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
6707; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6708; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6709; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 4
6710; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
6711; CHECK-UNALIGNED-RV32-V-NEXT:    slti a0, a0, 1
6712; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6713; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6714; CHECK-UNALIGNED-RV32-V-NEXT:    ret
6715;
6716; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_le_zero:
6717; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
6718; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6719; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6720; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 4
6721; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
6722; CHECK-UNALIGNED-RV64-V-NEXT:    slti a0, a0, 1
6723; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6724; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6725; CHECK-UNALIGNED-RV64-V-NEXT:    ret
6726entry:
6727  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 4)
6728  %ret = icmp slt i32 %memcmp, 1
6729  ret i1 %ret
6730}
6731
6732define i1 @memcmp_ge_zero(ptr %s1, ptr %s2) nounwind {
6733; CHECK-ALIGNED-RV32-LABEL: memcmp_ge_zero:
6734; CHECK-ALIGNED-RV32:       # %bb.0: # %entry
6735; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, -16
6736; CHECK-ALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6737; CHECK-ALIGNED-RV32-NEXT:    li a2, 4
6738; CHECK-ALIGNED-RV32-NEXT:    call memcmp
6739; CHECK-ALIGNED-RV32-NEXT:    slti a0, a0, 0
6740; CHECK-ALIGNED-RV32-NEXT:    xori a0, a0, 1
6741; CHECK-ALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6742; CHECK-ALIGNED-RV32-NEXT:    addi sp, sp, 16
6743; CHECK-ALIGNED-RV32-NEXT:    ret
6744;
6745; CHECK-ALIGNED-RV64-LABEL: memcmp_ge_zero:
6746; CHECK-ALIGNED-RV64:       # %bb.0: # %entry
6747; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, -16
6748; CHECK-ALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6749; CHECK-ALIGNED-RV64-NEXT:    li a2, 4
6750; CHECK-ALIGNED-RV64-NEXT:    call memcmp
6751; CHECK-ALIGNED-RV64-NEXT:    slti a0, a0, 0
6752; CHECK-ALIGNED-RV64-NEXT:    xori a0, a0, 1
6753; CHECK-ALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6754; CHECK-ALIGNED-RV64-NEXT:    addi sp, sp, 16
6755; CHECK-ALIGNED-RV64-NEXT:    ret
6756;
6757; CHECK-ALIGNED-RV32-ZBB-LABEL: memcmp_ge_zero:
6758; CHECK-ALIGNED-RV32-ZBB:       # %bb.0: # %entry
6759; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, -16
6760; CHECK-ALIGNED-RV32-ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6761; CHECK-ALIGNED-RV32-ZBB-NEXT:    li a2, 4
6762; CHECK-ALIGNED-RV32-ZBB-NEXT:    call memcmp
6763; CHECK-ALIGNED-RV32-ZBB-NEXT:    slti a0, a0, 0
6764; CHECK-ALIGNED-RV32-ZBB-NEXT:    xori a0, a0, 1
6765; CHECK-ALIGNED-RV32-ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6766; CHECK-ALIGNED-RV32-ZBB-NEXT:    addi sp, sp, 16
6767; CHECK-ALIGNED-RV32-ZBB-NEXT:    ret
6768;
6769; CHECK-ALIGNED-RV64-ZBB-LABEL: memcmp_ge_zero:
6770; CHECK-ALIGNED-RV64-ZBB:       # %bb.0: # %entry
6771; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, -16
6772; CHECK-ALIGNED-RV64-ZBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6773; CHECK-ALIGNED-RV64-ZBB-NEXT:    li a2, 4
6774; CHECK-ALIGNED-RV64-ZBB-NEXT:    call memcmp
6775; CHECK-ALIGNED-RV64-ZBB-NEXT:    slti a0, a0, 0
6776; CHECK-ALIGNED-RV64-ZBB-NEXT:    xori a0, a0, 1
6777; CHECK-ALIGNED-RV64-ZBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6778; CHECK-ALIGNED-RV64-ZBB-NEXT:    addi sp, sp, 16
6779; CHECK-ALIGNED-RV64-ZBB-NEXT:    ret
6780;
6781; CHECK-ALIGNED-RV32-ZBKB-LABEL: memcmp_ge_zero:
6782; CHECK-ALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6783; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, -16
6784; CHECK-ALIGNED-RV32-ZBKB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6785; CHECK-ALIGNED-RV32-ZBKB-NEXT:    li a2, 4
6786; CHECK-ALIGNED-RV32-ZBKB-NEXT:    call memcmp
6787; CHECK-ALIGNED-RV32-ZBKB-NEXT:    slti a0, a0, 0
6788; CHECK-ALIGNED-RV32-ZBKB-NEXT:    xori a0, a0, 1
6789; CHECK-ALIGNED-RV32-ZBKB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6790; CHECK-ALIGNED-RV32-ZBKB-NEXT:    addi sp, sp, 16
6791; CHECK-ALIGNED-RV32-ZBKB-NEXT:    ret
6792;
6793; CHECK-ALIGNED-RV64-ZBKB-LABEL: memcmp_ge_zero:
6794; CHECK-ALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6795; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, -16
6796; CHECK-ALIGNED-RV64-ZBKB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6797; CHECK-ALIGNED-RV64-ZBKB-NEXT:    li a2, 4
6798; CHECK-ALIGNED-RV64-ZBKB-NEXT:    call memcmp
6799; CHECK-ALIGNED-RV64-ZBKB-NEXT:    slti a0, a0, 0
6800; CHECK-ALIGNED-RV64-ZBKB-NEXT:    xori a0, a0, 1
6801; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6802; CHECK-ALIGNED-RV64-ZBKB-NEXT:    addi sp, sp, 16
6803; CHECK-ALIGNED-RV64-ZBKB-NEXT:    ret
6804;
6805; CHECK-ALIGNED-RV32-V-LABEL: memcmp_ge_zero:
6806; CHECK-ALIGNED-RV32-V:       # %bb.0: # %entry
6807; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6808; CHECK-ALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6809; CHECK-ALIGNED-RV32-V-NEXT:    li a2, 4
6810; CHECK-ALIGNED-RV32-V-NEXT:    call memcmp
6811; CHECK-ALIGNED-RV32-V-NEXT:    slti a0, a0, 0
6812; CHECK-ALIGNED-RV32-V-NEXT:    xori a0, a0, 1
6813; CHECK-ALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6814; CHECK-ALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6815; CHECK-ALIGNED-RV32-V-NEXT:    ret
6816;
6817; CHECK-ALIGNED-RV64-V-LABEL: memcmp_ge_zero:
6818; CHECK-ALIGNED-RV64-V:       # %bb.0: # %entry
6819; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6820; CHECK-ALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6821; CHECK-ALIGNED-RV64-V-NEXT:    li a2, 4
6822; CHECK-ALIGNED-RV64-V-NEXT:    call memcmp
6823; CHECK-ALIGNED-RV64-V-NEXT:    slti a0, a0, 0
6824; CHECK-ALIGNED-RV64-V-NEXT:    xori a0, a0, 1
6825; CHECK-ALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6826; CHECK-ALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6827; CHECK-ALIGNED-RV64-V-NEXT:    ret
6828;
6829; CHECK-UNALIGNED-RV32-LABEL: memcmp_ge_zero:
6830; CHECK-UNALIGNED-RV32:       # %bb.0: # %entry
6831; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, -16
6832; CHECK-UNALIGNED-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6833; CHECK-UNALIGNED-RV32-NEXT:    li a2, 4
6834; CHECK-UNALIGNED-RV32-NEXT:    call memcmp
6835; CHECK-UNALIGNED-RV32-NEXT:    slti a0, a0, 0
6836; CHECK-UNALIGNED-RV32-NEXT:    xori a0, a0, 1
6837; CHECK-UNALIGNED-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6838; CHECK-UNALIGNED-RV32-NEXT:    addi sp, sp, 16
6839; CHECK-UNALIGNED-RV32-NEXT:    ret
6840;
6841; CHECK-UNALIGNED-RV64-LABEL: memcmp_ge_zero:
6842; CHECK-UNALIGNED-RV64:       # %bb.0: # %entry
6843; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, -16
6844; CHECK-UNALIGNED-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6845; CHECK-UNALIGNED-RV64-NEXT:    li a2, 4
6846; CHECK-UNALIGNED-RV64-NEXT:    call memcmp
6847; CHECK-UNALIGNED-RV64-NEXT:    slti a0, a0, 0
6848; CHECK-UNALIGNED-RV64-NEXT:    xori a0, a0, 1
6849; CHECK-UNALIGNED-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6850; CHECK-UNALIGNED-RV64-NEXT:    addi sp, sp, 16
6851; CHECK-UNALIGNED-RV64-NEXT:    ret
6852;
6853; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_ge_zero:
6854; CHECK-UNALIGNED-RV32-ZBB:       # %bb.0: # %entry
6855; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a0, 0(a0)
6856; CHECK-UNALIGNED-RV32-ZBB-NEXT:    lw a1, 0(a1)
6857; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a0, a0
6858; CHECK-UNALIGNED-RV32-ZBB-NEXT:    rev8 a1, a1
6859; CHECK-UNALIGNED-RV32-ZBB-NEXT:    sltu a0, a0, a1
6860; CHECK-UNALIGNED-RV32-ZBB-NEXT:    xori a0, a0, 1
6861; CHECK-UNALIGNED-RV32-ZBB-NEXT:    ret
6862;
6863; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_ge_zero:
6864; CHECK-UNALIGNED-RV64-ZBB:       # %bb.0: # %entry
6865; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a0, 0(a0)
6866; CHECK-UNALIGNED-RV64-ZBB-NEXT:    lw a1, 0(a1)
6867; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a0, a0
6868; CHECK-UNALIGNED-RV64-ZBB-NEXT:    rev8 a1, a1
6869; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a0, a0, 32
6870; CHECK-UNALIGNED-RV64-ZBB-NEXT:    srli a1, a1, 32
6871; CHECK-UNALIGNED-RV64-ZBB-NEXT:    sltu a0, a0, a1
6872; CHECK-UNALIGNED-RV64-ZBB-NEXT:    xori a0, a0, 1
6873; CHECK-UNALIGNED-RV64-ZBB-NEXT:    ret
6874;
6875; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_ge_zero:
6876; CHECK-UNALIGNED-RV32-ZBKB:       # %bb.0: # %entry
6877; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a0, 0(a0)
6878; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    lw a1, 0(a1)
6879; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a0, a0
6880; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    rev8 a1, a1
6881; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    sltu a0, a0, a1
6882; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    xori a0, a0, 1
6883; CHECK-UNALIGNED-RV32-ZBKB-NEXT:    ret
6884;
6885; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_ge_zero:
6886; CHECK-UNALIGNED-RV64-ZBKB:       # %bb.0: # %entry
6887; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a0, 0(a0)
6888; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    lw a1, 0(a1)
6889; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a0, a0
6890; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    rev8 a1, a1
6891; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a0, a0, 32
6892; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    srli a1, a1, 32
6893; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    sltu a0, a0, a1
6894; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    xori a0, a0, 1
6895; CHECK-UNALIGNED-RV64-ZBKB-NEXT:    ret
6896;
6897; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_ge_zero:
6898; CHECK-UNALIGNED-RV32-V:       # %bb.0: # %entry
6899; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, -16
6900; CHECK-UNALIGNED-RV32-V-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6901; CHECK-UNALIGNED-RV32-V-NEXT:    li a2, 4
6902; CHECK-UNALIGNED-RV32-V-NEXT:    call memcmp
6903; CHECK-UNALIGNED-RV32-V-NEXT:    slti a0, a0, 0
6904; CHECK-UNALIGNED-RV32-V-NEXT:    xori a0, a0, 1
6905; CHECK-UNALIGNED-RV32-V-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6906; CHECK-UNALIGNED-RV32-V-NEXT:    addi sp, sp, 16
6907; CHECK-UNALIGNED-RV32-V-NEXT:    ret
6908;
6909; CHECK-UNALIGNED-RV64-V-LABEL: memcmp_ge_zero:
6910; CHECK-UNALIGNED-RV64-V:       # %bb.0: # %entry
6911; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, -16
6912; CHECK-UNALIGNED-RV64-V-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6913; CHECK-UNALIGNED-RV64-V-NEXT:    li a2, 4
6914; CHECK-UNALIGNED-RV64-V-NEXT:    call memcmp
6915; CHECK-UNALIGNED-RV64-V-NEXT:    slti a0, a0, 0
6916; CHECK-UNALIGNED-RV64-V-NEXT:    xori a0, a0, 1
6917; CHECK-UNALIGNED-RV64-V-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6918; CHECK-UNALIGNED-RV64-V-NEXT:    addi sp, sp, 16
6919; CHECK-UNALIGNED-RV64-V-NEXT:    ret
6920entry:
6921  %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iXLen 4)
6922  %ret = icmp sgt i32 %memcmp, -1
6923  ret i1 %ret
6924}
6925;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
6926; CHECK-ALIGNED: {{.*}}
6927