xref: /llvm-project/clang/test/CodeGen/AArch64/ls64.c (revision 207e5ccceec8d3cc3f32723e78f2a142bc61b07d)
1*207e5cccSFangrui Song // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2*207e5cccSFangrui Song // RUN: %clang_cc1 -triple aarch64 -target-feature +ls64 -emit-llvm -x c %s -o - | FileCheck --check-prefixes=CHECK-C %s
3*207e5cccSFangrui Song // RUN: %clang_cc1 -triple aarch64 -target-feature +ls64 -emit-llvm -x c++ %s -o - | FileCheck --check-prefixes=CHECK-CXX %s
4*207e5cccSFangrui Song // RUN: %clang_cc1 -triple aarch64_be-eabi -target-feature +ls64 -emit-llvm -x c %s -o - | FileCheck  --check-prefixes=CHECK-C %s
5*207e5cccSFangrui Song // RUN: %clang_cc1 -triple aarch64_be-eabi -target-feature +ls64 -emit-llvm -x c++ %s -o - | FileCheck  --check-prefixes=CHECK-CXX %s
6*207e5cccSFangrui Song 
7*207e5cccSFangrui Song #include <arm_acle.h>
8*207e5cccSFangrui Song 
9*207e5cccSFangrui Song #ifdef __cplusplus
10*207e5cccSFangrui Song #define EXTERN_C extern "C"
11*207e5cccSFangrui Song #else
12*207e5cccSFangrui Song #define EXTERN_C
13*207e5cccSFangrui Song #endif
14*207e5cccSFangrui Song 
15*207e5cccSFangrui Song data512_t val;
16*207e5cccSFangrui Song void *addr;
17*207e5cccSFangrui Song uint64_t status;
18*207e5cccSFangrui Song 
19*207e5cccSFangrui Song // CHECK-C-LABEL: define {{[^@]+}}@test_ld64b(
20*207e5cccSFangrui Song // CHECK-C-NEXT:  entry:
21*207e5cccSFangrui Song // CHECK-C-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
22*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
23*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
24*207e5cccSFangrui Song // CHECK-C-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META2:![0-9]+]])
25*207e5cccSFangrui Song // CHECK-C-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8, !noalias !2
26*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8, !noalias !2
27*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP2:%.*]] = call { i64, i64, i64, i64, i64, i64, i64, i64 } @llvm.aarch64.ld64b(ptr [[TMP1]]), !noalias !2
28*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP3:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 0
29*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP3]], ptr [[TMP]], align 8, !alias.scope !2
30*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP4:%.*]] = getelementptr i64, ptr [[TMP]], i32 1
31*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP5:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 1
32*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP5]], ptr [[TMP4]], align 8, !alias.scope !2
33*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP6:%.*]] = getelementptr i64, ptr [[TMP]], i32 2
34*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP7:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 2
35*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP7]], ptr [[TMP6]], align 8, !alias.scope !2
36*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP8:%.*]] = getelementptr i64, ptr [[TMP]], i32 3
37*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP9:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 3
38*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP9]], ptr [[TMP8]], align 8, !alias.scope !2
39*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP10:%.*]] = getelementptr i64, ptr [[TMP]], i32 4
40*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP11:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 4
41*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP11]], ptr [[TMP10]], align 8, !alias.scope !2
42*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP12:%.*]] = getelementptr i64, ptr [[TMP]], i32 5
43*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP13:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 5
44*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP13]], ptr [[TMP12]], align 8, !alias.scope !2
45*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP14:%.*]] = getelementptr i64, ptr [[TMP]], i32 6
46*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP15:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 6
47*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP15]], ptr [[TMP14]], align 8, !alias.scope !2
48*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP16:%.*]] = getelementptr i64, ptr [[TMP]], i32 7
49*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP17:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 7
50*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP17]], ptr [[TMP16]], align 8, !alias.scope !2
51*207e5cccSFangrui Song // CHECK-C-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 @val, ptr align 8 [[TMP]], i64 64, i1 false)
52*207e5cccSFangrui Song // CHECK-C-NEXT:    ret void
53*207e5cccSFangrui Song //
54*207e5cccSFangrui Song // CHECK-CXX-LABEL: define {{[^@]+}}@test_ld64b(
55*207e5cccSFangrui Song // CHECK-CXX-NEXT:  entry:
56*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
57*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
58*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
59*207e5cccSFangrui Song // CHECK-CXX-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META2:![0-9]+]])
60*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8, !noalias !2
61*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8, !noalias !2
62*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP2:%.*]] = call { i64, i64, i64, i64, i64, i64, i64, i64 } @llvm.aarch64.ld64b(ptr [[TMP1]]), !noalias !2
63*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP3:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 0
64*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP3]], ptr [[REF_TMP]], align 8, !alias.scope !2
65*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP4:%.*]] = getelementptr i64, ptr [[REF_TMP]], i32 1
66*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP5:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 1
67*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP5]], ptr [[TMP4]], align 8, !alias.scope !2
68*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP6:%.*]] = getelementptr i64, ptr [[REF_TMP]], i32 2
69*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP7:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 2
70*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP7]], ptr [[TMP6]], align 8, !alias.scope !2
71*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP8:%.*]] = getelementptr i64, ptr [[REF_TMP]], i32 3
72*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP9:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 3
73*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP9]], ptr [[TMP8]], align 8, !alias.scope !2
74*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP10:%.*]] = getelementptr i64, ptr [[REF_TMP]], i32 4
75*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP11:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 4
76*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP11]], ptr [[TMP10]], align 8, !alias.scope !2
77*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP12:%.*]] = getelementptr i64, ptr [[REF_TMP]], i32 5
78*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP13:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 5
79*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP13]], ptr [[TMP12]], align 8, !alias.scope !2
80*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP14:%.*]] = getelementptr i64, ptr [[REF_TMP]], i32 6
81*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP15:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 6
82*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP15]], ptr [[TMP14]], align 8, !alias.scope !2
83*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP16:%.*]] = getelementptr i64, ptr [[REF_TMP]], i32 7
84*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP17:%.*]] = extractvalue { i64, i64, i64, i64, i64, i64, i64, i64 } [[TMP2]], 7
85*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP17]], ptr [[TMP16]], align 8, !alias.scope !2
86*207e5cccSFangrui Song // CHECK-CXX-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 @val, ptr align 8 [[REF_TMP]], i64 64, i1 false)
87*207e5cccSFangrui Song // CHECK-CXX-NEXT:    ret void
88*207e5cccSFangrui Song //
89*207e5cccSFangrui Song EXTERN_C void test_ld64b(void)
90*207e5cccSFangrui Song {
91*207e5cccSFangrui Song     val = __arm_ld64b(addr);
92*207e5cccSFangrui Song }
93*207e5cccSFangrui Song 
94*207e5cccSFangrui Song // CHECK-C-LABEL: define {{[^@]+}}@test_st64b(
95*207e5cccSFangrui Song // CHECK-C-NEXT:  entry:
96*207e5cccSFangrui Song // CHECK-C-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
97*207e5cccSFangrui Song // CHECK-C-NEXT:    [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
98*207e5cccSFangrui Song // CHECK-C-NEXT:    [[BYVAL_TEMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
99*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
100*207e5cccSFangrui Song // CHECK-C-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[BYVAL_TEMP]], ptr align 8 @val, i64 64, i1 false)
101*207e5cccSFangrui Song // CHECK-C-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8
102*207e5cccSFangrui Song // CHECK-C-NEXT:    store ptr [[BYVAL_TEMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
103*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8
104*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP2:%.*]] = load i64, ptr [[BYVAL_TEMP]], align 8
105*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP3:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 1
106*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8
107*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP5:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 2
108*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
109*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP7:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 3
110*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP8:%.*]] = load i64, ptr [[TMP7]], align 8
111*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP9:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 4
112*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8
113*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP11:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 5
114*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP12:%.*]] = load i64, ptr [[TMP11]], align 8
115*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP13:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 6
116*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8
117*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP15:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 7
118*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP16:%.*]] = load i64, ptr [[TMP15]], align 8
119*207e5cccSFangrui Song // CHECK-C-NEXT:    call void @llvm.aarch64.st64b(ptr [[TMP1]], i64 [[TMP2]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]], i64 [[TMP10]], i64 [[TMP12]], i64 [[TMP14]], i64 [[TMP16]])
120*207e5cccSFangrui Song // CHECK-C-NEXT:    ret void
121*207e5cccSFangrui Song //
122*207e5cccSFangrui Song // CHECK-CXX-LABEL: define {{[^@]+}}@test_st64b(
123*207e5cccSFangrui Song // CHECK-CXX-NEXT:  entry:
124*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
125*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
126*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[AGG_TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
127*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
128*207e5cccSFangrui Song // CHECK-CXX-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TMP]], ptr align 8 @val, i64 64, i1 false)
129*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8
130*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store ptr [[AGG_TMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
131*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8
132*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP2:%.*]] = load i64, ptr [[AGG_TMP]], align 8
133*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP3:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 1
134*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8
135*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP5:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 2
136*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
137*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP7:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 3
138*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP8:%.*]] = load i64, ptr [[TMP7]], align 8
139*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP9:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 4
140*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8
141*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP11:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 5
142*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP12:%.*]] = load i64, ptr [[TMP11]], align 8
143*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP13:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 6
144*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8
145*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP15:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 7
146*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP16:%.*]] = load i64, ptr [[TMP15]], align 8
147*207e5cccSFangrui Song // CHECK-CXX-NEXT:    call void @llvm.aarch64.st64b(ptr [[TMP1]], i64 [[TMP2]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]], i64 [[TMP10]], i64 [[TMP12]], i64 [[TMP14]], i64 [[TMP16]])
148*207e5cccSFangrui Song // CHECK-CXX-NEXT:    ret void
149*207e5cccSFangrui Song //
150*207e5cccSFangrui Song EXTERN_C void test_st64b(void)
151*207e5cccSFangrui Song {
152*207e5cccSFangrui Song     __arm_st64b(addr, val);
153*207e5cccSFangrui Song }
154*207e5cccSFangrui Song 
155*207e5cccSFangrui Song // CHECK-C-LABEL: define {{[^@]+}}@test_st64bv(
156*207e5cccSFangrui Song // CHECK-C-NEXT:  entry:
157*207e5cccSFangrui Song // CHECK-C-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
158*207e5cccSFangrui Song // CHECK-C-NEXT:    [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
159*207e5cccSFangrui Song // CHECK-C-NEXT:    [[BYVAL_TEMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
160*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
161*207e5cccSFangrui Song // CHECK-C-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[BYVAL_TEMP]], ptr align 8 @val, i64 64, i1 false)
162*207e5cccSFangrui Song // CHECK-C-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8
163*207e5cccSFangrui Song // CHECK-C-NEXT:    store ptr [[BYVAL_TEMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
164*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8
165*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP2:%.*]] = load i64, ptr [[BYVAL_TEMP]], align 8
166*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP3:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 1
167*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8
168*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP5:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 2
169*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
170*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP7:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 3
171*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP8:%.*]] = load i64, ptr [[TMP7]], align 8
172*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP9:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 4
173*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8
174*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP11:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 5
175*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP12:%.*]] = load i64, ptr [[TMP11]], align 8
176*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP13:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 6
177*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8
178*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP15:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 7
179*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP16:%.*]] = load i64, ptr [[TMP15]], align 8
180*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP17:%.*]] = call i64 @llvm.aarch64.st64bv(ptr [[TMP1]], i64 [[TMP2]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]], i64 [[TMP10]], i64 [[TMP12]], i64 [[TMP14]], i64 [[TMP16]])
181*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP17]], ptr @status, align 8
182*207e5cccSFangrui Song // CHECK-C-NEXT:    ret void
183*207e5cccSFangrui Song //
184*207e5cccSFangrui Song // CHECK-CXX-LABEL: define {{[^@]+}}@test_st64bv(
185*207e5cccSFangrui Song // CHECK-CXX-NEXT:  entry:
186*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
187*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
188*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[AGG_TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
189*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
190*207e5cccSFangrui Song // CHECK-CXX-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TMP]], ptr align 8 @val, i64 64, i1 false)
191*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8
192*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store ptr [[AGG_TMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
193*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8
194*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP2:%.*]] = load i64, ptr [[AGG_TMP]], align 8
195*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP3:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 1
196*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8
197*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP5:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 2
198*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
199*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP7:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 3
200*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP8:%.*]] = load i64, ptr [[TMP7]], align 8
201*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP9:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 4
202*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8
203*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP11:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 5
204*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP12:%.*]] = load i64, ptr [[TMP11]], align 8
205*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP13:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 6
206*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8
207*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP15:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 7
208*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP16:%.*]] = load i64, ptr [[TMP15]], align 8
209*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP17:%.*]] = call noundef i64 @llvm.aarch64.st64bv(ptr [[TMP1]], i64 [[TMP2]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]], i64 [[TMP10]], i64 [[TMP12]], i64 [[TMP14]], i64 [[TMP16]])
210*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP17]], ptr @status, align 8
211*207e5cccSFangrui Song // CHECK-CXX-NEXT:    ret void
212*207e5cccSFangrui Song //
213*207e5cccSFangrui Song EXTERN_C void test_st64bv(void)
214*207e5cccSFangrui Song {
215*207e5cccSFangrui Song     status = __arm_st64bv(addr, val);
216*207e5cccSFangrui Song }
217*207e5cccSFangrui Song 
218*207e5cccSFangrui Song // CHECK-C-LABEL: define {{[^@]+}}@test_st64bv0(
219*207e5cccSFangrui Song // CHECK-C-NEXT:  entry:
220*207e5cccSFangrui Song // CHECK-C-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
221*207e5cccSFangrui Song // CHECK-C-NEXT:    [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
222*207e5cccSFangrui Song // CHECK-C-NEXT:    [[BYVAL_TEMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
223*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
224*207e5cccSFangrui Song // CHECK-C-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[BYVAL_TEMP]], ptr align 8 @val, i64 64, i1 false)
225*207e5cccSFangrui Song // CHECK-C-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8
226*207e5cccSFangrui Song // CHECK-C-NEXT:    store ptr [[BYVAL_TEMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
227*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8
228*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP2:%.*]] = load i64, ptr [[BYVAL_TEMP]], align 8
229*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP3:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 1
230*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8
231*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP5:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 2
232*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
233*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP7:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 3
234*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP8:%.*]] = load i64, ptr [[TMP7]], align 8
235*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP9:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 4
236*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8
237*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP11:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 5
238*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP12:%.*]] = load i64, ptr [[TMP11]], align 8
239*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP13:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 6
240*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8
241*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP15:%.*]] = getelementptr i64, ptr [[BYVAL_TEMP]], i32 7
242*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP16:%.*]] = load i64, ptr [[TMP15]], align 8
243*207e5cccSFangrui Song // CHECK-C-NEXT:    [[TMP17:%.*]] = call i64 @llvm.aarch64.st64bv0(ptr [[TMP1]], i64 [[TMP2]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]], i64 [[TMP10]], i64 [[TMP12]], i64 [[TMP14]], i64 [[TMP16]])
244*207e5cccSFangrui Song // CHECK-C-NEXT:    store i64 [[TMP17]], ptr @status, align 8
245*207e5cccSFangrui Song // CHECK-C-NEXT:    ret void
246*207e5cccSFangrui Song //
247*207e5cccSFangrui Song // CHECK-CXX-LABEL: define {{[^@]+}}@test_st64bv0(
248*207e5cccSFangrui Song // CHECK-CXX-NEXT:  entry:
249*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[__ADDR_ADDR_I:%.*]] = alloca ptr, align 8
250*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
251*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[AGG_TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
252*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP0:%.*]] = load ptr, ptr @addr, align 8
253*207e5cccSFangrui Song // CHECK-CXX-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TMP]], ptr align 8 @val, i64 64, i1 false)
254*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store ptr [[TMP0]], ptr [[__ADDR_ADDR_I]], align 8
255*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store ptr [[AGG_TMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
256*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__ADDR_ADDR_I]], align 8
257*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP2:%.*]] = load i64, ptr [[AGG_TMP]], align 8
258*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP3:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 1
259*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8
260*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP5:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 2
261*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
262*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP7:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 3
263*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP8:%.*]] = load i64, ptr [[TMP7]], align 8
264*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP9:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 4
265*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8
266*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP11:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 5
267*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP12:%.*]] = load i64, ptr [[TMP11]], align 8
268*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP13:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 6
269*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8
270*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP15:%.*]] = getelementptr i64, ptr [[AGG_TMP]], i32 7
271*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP16:%.*]] = load i64, ptr [[TMP15]], align 8
272*207e5cccSFangrui Song // CHECK-CXX-NEXT:    [[TMP17:%.*]] = call noundef i64 @llvm.aarch64.st64bv0(ptr [[TMP1]], i64 [[TMP2]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]], i64 [[TMP10]], i64 [[TMP12]], i64 [[TMP14]], i64 [[TMP16]])
273*207e5cccSFangrui Song // CHECK-CXX-NEXT:    store i64 [[TMP17]], ptr @status, align 8
274*207e5cccSFangrui Song // CHECK-CXX-NEXT:    ret void
275*207e5cccSFangrui Song //
276*207e5cccSFangrui Song EXTERN_C void test_st64bv0(void)
277*207e5cccSFangrui Song {
278*207e5cccSFangrui Song     status = __arm_st64bv0(addr, val);
279*207e5cccSFangrui Song }
280