1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -O2 < %s -mtriple=aarch64-linux-gnu                     | FileCheck %s --check-prefix=CHECKN
3; RUN: llc -O2 < %s -mtriple=aarch64-linux-gnu -mattr=strict-align | FileCheck %s --check-prefix=CHECKS
4
5declare i32 @bcmp(i8*, i8*, i64) nounwind readonly
6declare i32 @memcmp(i8*, i8*, i64) nounwind readonly
7
8define i1 @test_b2(i8* %s1, i8* %s2) {
9; CHECKN-LABEL: test_b2:
10; CHECKN:       // %bb.0: // %entry
11; CHECKN-NEXT:    ldr x8, [x0]
12; CHECKN-NEXT:    ldr x9, [x1]
13; CHECKN-NEXT:    ldur x10, [x0, #7]
14; CHECKN-NEXT:    ldur x11, [x1, #7]
15; CHECKN-NEXT:    eor x8, x8, x9
16; CHECKN-NEXT:    eor x9, x10, x11
17; CHECKN-NEXT:    orr x8, x8, x9
18; CHECKN-NEXT:    cmp x8, #0
19; CHECKN-NEXT:    cset w0, eq
20; CHECKN-NEXT:    ret
21;
22; CHECKS-LABEL: test_b2:
23; CHECKS:       // %bb.0: // %entry
24; CHECKS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
25; CHECKS-NEXT:    .cfi_def_cfa_offset 16
26; CHECKS-NEXT:    .cfi_offset w30, -16
27; CHECKS-NEXT:    mov w2, #15
28; CHECKS-NEXT:    bl bcmp
29; CHECKS-NEXT:    cmp w0, #0
30; CHECKS-NEXT:    cset w0, eq
31; CHECKS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
32; CHECKS-NEXT:    ret
33entry:
34  %bcmp = call i32 @bcmp(i8* %s1, i8* %s2, i64 15)
35  %ret = icmp eq i32 %bcmp, 0
36  ret i1 %ret
37}
38
39; TODO: Four loads should be within the limit, but the heuristic isn't implemented.
40define i1 @test_b2_align8(i8* align 8 %s1, i8* align 8 %s2) {
41; CHECKN-LABEL: test_b2_align8:
42; CHECKN:       // %bb.0: // %entry
43; CHECKN-NEXT:    ldr x8, [x0]
44; CHECKN-NEXT:    ldr x9, [x1]
45; CHECKN-NEXT:    ldur x10, [x0, #7]
46; CHECKN-NEXT:    ldur x11, [x1, #7]
47; CHECKN-NEXT:    eor x8, x8, x9
48; CHECKN-NEXT:    eor x9, x10, x11
49; CHECKN-NEXT:    orr x8, x8, x9
50; CHECKN-NEXT:    cmp x8, #0
51; CHECKN-NEXT:    cset w0, eq
52; CHECKN-NEXT:    ret
53;
54; CHECKS-LABEL: test_b2_align8:
55; CHECKS:       // %bb.0: // %entry
56; CHECKS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
57; CHECKS-NEXT:    .cfi_def_cfa_offset 16
58; CHECKS-NEXT:    .cfi_offset w30, -16
59; CHECKS-NEXT:    mov w2, #15
60; CHECKS-NEXT:    bl bcmp
61; CHECKS-NEXT:    cmp w0, #0
62; CHECKS-NEXT:    cset w0, eq
63; CHECKS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
64; CHECKS-NEXT:    ret
65entry:
66  %bcmp = call i32 @bcmp(i8* %s1, i8* %s2, i64 15)
67  %ret = icmp eq i32 %bcmp, 0
68  ret i1 %ret
69}
70
71define i1 @test_bs(i8* %s1, i8* %s2) optsize {
72; CHECKN-LABEL: test_bs:
73; CHECKN:       // %bb.0: // %entry
74; CHECKN-NEXT:    ldp x8, x9, [x0]
75; CHECKN-NEXT:    ldp x10, x11, [x1]
76; CHECKN-NEXT:    ldr x12, [x0, #16]
77; CHECKN-NEXT:    ldr x13, [x1, #16]
78; CHECKN-NEXT:    ldur x14, [x0, #23]
79; CHECKN-NEXT:    eor x8, x8, x10
80; CHECKN-NEXT:    ldur x15, [x1, #23]
81; CHECKN-NEXT:    eor x9, x9, x11
82; CHECKN-NEXT:    eor x10, x12, x13
83; CHECKN-NEXT:    orr x8, x8, x9
84; CHECKN-NEXT:    eor x11, x14, x15
85; CHECKN-NEXT:    orr x9, x10, x11
86; CHECKN-NEXT:    orr x8, x8, x9
87; CHECKN-NEXT:    cmp x8, #0
88; CHECKN-NEXT:    cset w0, eq
89; CHECKN-NEXT:    ret
90;
91; CHECKS-LABEL: test_bs:
92; CHECKS:       // %bb.0: // %entry
93; CHECKS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
94; CHECKS-NEXT:    .cfi_def_cfa_offset 16
95; CHECKS-NEXT:    .cfi_offset w30, -16
96; CHECKS-NEXT:    mov w2, #31
97; CHECKS-NEXT:    bl memcmp
98; CHECKS-NEXT:    cmp w0, #0
99; CHECKS-NEXT:    cset w0, eq
100; CHECKS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
101; CHECKS-NEXT:    ret
102entry:
103  %memcmp = call i32 @memcmp(i8* %s1, i8* %s2, i64 31)
104  %ret = icmp eq i32 %memcmp, 0
105  ret i1 %ret
106}
107