xref: /llvm-project/llvm/test/CodeGen/AArch64/i128_volatile_load_store.ll (revision 1610311a95b1a98f47e9242d67141c5b3e44a138)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-LE
3; RUN: llc -mtriple=aarch64_be %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-BE
4
5@x = common dso_local global i128 0
6@y = common dso_local global i128 0
7
8define void @test1() {
9; CHECK-LABEL: test1:
10; CHECK:       // %bb.0:
11; CHECK-NEXT:    adrp x8, x
12; CHECK-NEXT:    add x8, x8, :lo12:x
13; CHECK-NEXT:    adrp x10, y
14; CHECK-NEXT:    add x10, x10, :lo12:y
15; CHECK-NEXT:    ldp x8, x9, [x8]
16; CHECK-NEXT:    stp x8, x9, [x10]
17; CHECK-NEXT:    ret
18  %tmp = load volatile i128, ptr @x
19  store volatile i128 %tmp, ptr @y
20  ret void
21}
22
23define void @test2() {
24; CHECK-LABEL: test2:
25; CHECK:       // %bb.0:
26; CHECK-NEXT:    adrp x8, x
27; CHECK-NEXT:    add x8, x8, :lo12:x
28; CHECK-NEXT:    adrp x10, y
29; CHECK-NEXT:    add x10, x10, :lo12:y
30; CHECK-NEXT:    ldp x8, x9, [x8, #504]
31; CHECK-NEXT:    stp x8, x9, [x10, #504]
32; CHECK-NEXT:    ret
33  %tmp = load volatile i128, ptr getelementptr (i8, ptr @x, i64 504)
34  store volatile i128 %tmp, ptr getelementptr (i8, ptr @y, i64 504)
35  ret void
36}
37
38define void @test3() {
39; CHECK-LABEL: test3:
40; CHECK:       // %bb.0:
41; CHECK-NEXT:    adrp x8, x
42; CHECK-NEXT:    add x8, x8, :lo12:x
43; CHECK-NEXT:    adrp x10, y
44; CHECK-NEXT:    add x10, x10, :lo12:y
45; CHECK-NEXT:    add x8, x8, #512
46; CHECK-NEXT:    ldp x8, x9, [x8]
47; CHECK-NEXT:    add x10, x10, #512
48; CHECK-NEXT:    stp x8, x9, [x10]
49; CHECK-NEXT:    ret
50  %tmp = load volatile i128, ptr getelementptr (i8, ptr @x, i64 512)
51  store volatile i128 %tmp, ptr getelementptr (i8, ptr @y, i64 512)
52  ret void
53}
54
55define void @test4() {
56; CHECK-LABEL: test4:
57; CHECK:       // %bb.0:
58; CHECK-NEXT:    adrp x8, x
59; CHECK-NEXT:    add x8, x8, :lo12:x
60; CHECK-NEXT:    adrp x10, y
61; CHECK-NEXT:    add x10, x10, :lo12:y
62; CHECK-NEXT:    ldp x8, x9, [x8, #-512]
63; CHECK-NEXT:    stp x8, x9, [x10, #-512]
64; CHECK-NEXT:    ret
65  %tmp = load volatile i128, ptr getelementptr (i8, ptr @x, i64 -512)
66  store volatile i128 %tmp, ptr getelementptr (i8, ptr @y, i64 -512)
67  ret void
68}
69
70define void @test5() {
71; CHECK-LABEL: test5:
72; CHECK:       // %bb.0:
73; CHECK-NEXT:    adrp x8, x
74; CHECK-NEXT:    add x8, x8, :lo12:x
75; CHECK-NEXT:    adrp x10, y
76; CHECK-NEXT:    add x10, x10, :lo12:y
77; CHECK-NEXT:    sub x8, x8, #520
78; CHECK-NEXT:    ldp x8, x9, [x8]
79; CHECK-NEXT:    sub x10, x10, #520
80; CHECK-NEXT:    stp x8, x9, [x10]
81; CHECK-NEXT:    ret
82  %tmp = load volatile i128, ptr getelementptr (i8, ptr @x, i64 -520)
83  store volatile i128 %tmp, ptr getelementptr (i8, ptr @y, i64 -520)
84  ret void
85}
86
87define void @test6() {
88; CHECK-LABEL: test6:
89; CHECK:       // %bb.0:
90; CHECK-NEXT:    adrp x8, x
91; CHECK-NEXT:    add x8, x8, :lo12:x
92; CHECK-NEXT:    adrp x10, y
93; CHECK-NEXT:    add x10, x10, :lo12:y
94; CHECK-NEXT:    sub x8, x8, #520
95; CHECK-NEXT:    ldp x8, x9, [x8]
96; CHECK-NEXT:    sub x10, x10, #520
97; CHECK-NEXT:    stp x8, x9, [x10]
98; CHECK-NEXT:    ret
99  %tmp = load volatile i128, ptr getelementptr (i8, ptr @x, i64 -520)
100  store volatile i128 %tmp, ptr getelementptr (i8, ptr @y, i64 -520)
101  ret void
102}
103
104define void @test7() {
105; CHECK-LABEL: test7:
106; CHECK:       // %bb.0:
107; CHECK-NEXT:    adrp x8, x
108; CHECK-NEXT:    add x8, x8, :lo12:x
109; CHECK-NEXT:    adrp x10, y
110; CHECK-NEXT:    add x10, x10, :lo12:y
111; CHECK-NEXT:    add x8, x8, #503
112; CHECK-NEXT:    ldp x8, x9, [x8]
113; CHECK-NEXT:    add x10, x10, #503
114; CHECK-NEXT:    stp x8, x9, [x10]
115; CHECK-NEXT:    ret
116  %tmp = load volatile i128, ptr getelementptr (i8, ptr @x, i64 503)
117  store volatile i128 %tmp, ptr getelementptr (i8, ptr @y, i64 503)
118  ret void
119}
120
121define i128 @load_nonvol(i32, i32, ptr %p) {
122; CHECK-LABEL: load_nonvol:
123; CHECK:       // %bb.0: // %entry
124; CHECK-NEXT:    ldp x0, x1, [x2]
125; CHECK-NEXT:    ret
126entry:
127  %l = load i128, ptr %p, align 16
128  ret i128 %l
129}
130
131define i128 @load_vol(i32, i32, ptr %p) {
132; CHECK-LABEL: load_vol:
133; CHECK:       // %bb.0: // %entry
134; CHECK-NEXT:    ldp x0, x1, [x2]
135; CHECK-NEXT:    ret
136entry:
137  %l = load volatile i128, ptr %p, align 16
138  ret i128 %l
139}
140
141define void @store_nonvol(i128 %a, ptr %p) {
142; CHECK-LABEL: store_nonvol:
143; CHECK:       // %bb.0: // %entry
144; CHECK-NEXT:    stp x0, x1, [x2]
145; CHECK-NEXT:    ret
146entry:
147  store i128 %a, ptr %p, align 16
148  ret void
149}
150
151define void @loadstore_vol(i128 %a, ptr %p) {
152; CHECK-LABEL: loadstore_vol:
153; CHECK:       // %bb.0: // %entry
154; CHECK-NEXT:    stp x0, x1, [x2]
155; CHECK-NEXT:    ret
156entry:
157  store volatile i128 %a, ptr %p, align 16
158  ret void
159}
160;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
161; CHECK-BE: {{.*}}
162; CHECK-LE: {{.*}}
163