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