14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -Wall -Werror -triple thumbv8-linux-gnueabi -fno-signed-char -emit-llvm -o - %s | opt -S -mem2reg | FileCheck %s
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -Wall -Werror -triple arm64-apple-ios7.0 -emit-llvm -o - %s | opt -S -mem2reg | FileCheck %s --check-prefix=CHECK-ARM64
309df2b066221d869f17f4b5762405f111a65f983Tim Northover
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
509df2b066221d869f17f4b5762405f111a65f983Tim Northoverstruct Simple {
609df2b066221d869f17f4b5762405f111a65f983Tim Northover  char a, b;
709df2b066221d869f17f4b5762405f111a65f983Tim Northover};
809df2b066221d869f17f4b5762405f111a65f983Tim Northover
909df2b066221d869f17f4b5762405f111a65f983Tim Northoverint test_ldrex(char *addr, long long *addr64, float *addrfloat) {
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-LABEL: @test_ldrex
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_ldrex
1209df2b066221d869f17f4b5762405f111a65f983Tim Northover  int sum = 0;
1309df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex(addr);
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %addr)
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: trunc i32 [[INTRES]] to i8
1609df2b066221d869f17f4b5762405f111a65f983Tim Northover
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldxr.p0i8(i8* %addr)
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: trunc i64 [[INTRES]] to i8
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2009df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex((short *)addr);
2109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldrex.p0i16(i16* [[ADDR16]])
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: trunc i32 [[INTRES]] to i16
2409df2b066221d869f17f4b5762405f111a65f983Tim Northover
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldxr.p0i16(i16* [[ADDR16]])
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: trunc i64 [[INTRES]] to i16
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2909df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex((int *)addr);
3009df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.ldrex.p0i32(i32* [[ADDR32]])
3209df2b066221d869f17f4b5762405f111a65f983Tim Northover
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldxr.p0i32(i32* [[ADDR32]])
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: trunc i64 [[INTRES]] to i32
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3709df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex((long long *)addr);
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to i64*
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast i64* [[TMP4]] to i8*
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call { i32, i32 } @llvm.arm.ldrexd(i8* [[TMP5]])
4109df2b066221d869f17f4b5762405f111a65f983Tim Northover
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64*
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldxr.p0i64(i64* [[ADDR64]])
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4509df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex(addr64);
4609df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR64_AS8:%.*]] = bitcast i64* %addr64 to i8*
4709df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call { i32, i32 } @llvm.arm.ldrexd(i8* [[ADDR64_AS8]])
4809df2b066221d869f17f4b5762405f111a65f983Tim Northover
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldxr.p0i64(i64* %addr64)
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5109df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex(addrfloat);
5209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32*
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* [[INTADDR]])
5409df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: bitcast i32 [[INTRES]] to float
5509df2b066221d869f17f4b5762405f111a65f983Tim Northover
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32*
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldxr.p0i32(i32* [[INTADDR]])
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: bitcast i32 [[TRUNCRES]] to float
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6109df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex((double *)addr);
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to double*
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i8*
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[STRUCTRES:%.*]] = call { i32, i32 } @llvm.arm.ldrexd(i8* [[TMP5]])
6509df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESHI:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 1
6609df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESLO:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 0
6709df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESHI64:%.*]] = zext i32 [[RESHI]] to i64
6809df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESLO64:%.*]] = zext i32 [[RESLO]] to i64
6909df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESHIHI:%.*]] = shl nuw i64 [[RESHI64]], 32
7009df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTRES:%.*]] = or i64 [[RESHIHI]], [[RESLO64]]
7109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: bitcast i64 [[INTRES]] to double
7209df2b066221d869f17f4b5762405f111a65f983Tim Northover
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to double*
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i64*
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldxr.p0i64(i64* [[TMP5]])
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: bitcast i64 [[INTRES]] to double
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7809df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += *__builtin_arm_ldrex((int **)addr);
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to i32**
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast i32** [[TMP4]] to i32*
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* [[TMP5]])
8209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: inttoptr i32 [[INTRES]] to i32*
8309df2b066221d869f17f4b5762405f111a65f983Tim Northover
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to i32**
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast i32** [[TMP4]] to i64*
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldxr.p0i64(i64* [[TMP5]])
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to i32*
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
8909df2b066221d869f17f4b5762405f111a65f983Tim Northover  sum += __builtin_arm_ldrex((struct Simple **)addr)->a;
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i32*
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* [[TMP5]])
9309df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: inttoptr i32 [[INTRES]] to %struct.Simple*
9409df2b066221d869f17f4b5762405f111a65f983Tim Northover
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i64*
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldxr.p0i64(i64* [[TMP5]])
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to %struct.Simple*
9909df2b066221d869f17f4b5762405f111a65f983Tim Northover  return sum;
10009df2b066221d869f17f4b5762405f111a65f983Tim Northover}
10109df2b066221d869f17f4b5762405f111a65f983Tim Northover
102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint test_ldaex(char *addr, long long *addr64, float *addrfloat) {
103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-LABEL: @test_ldaex
104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64-LABEL: @test_ldaex
105c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int sum = 0;
106c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex(addr);
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldaex.p0i8(i8* %addr)
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: trunc i32 [[INTRES]] to i8
109c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i8(i8* %addr)
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: trunc i64 [[INTRES]] to i8
112c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
113c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex((short *)addr);
114c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldaex.p0i16(i16* [[ADDR16]])
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: trunc i32 [[INTRES]] to i16
117c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
118c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i16(i16* [[ADDR16]])
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i16
121c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
122c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex((int *)addr);
123c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
124c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK:  call i32 @llvm.arm.ldaex.p0i32(i32* [[ADDR32]])
125c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
126c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i32(i32* [[ADDR32]])
128c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: trunc i64 [[INTRES]] to i32
129c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex((long long *)addr);
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to i64*
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast i64* [[TMP4]] to i8*
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call { i32, i32 } @llvm.arm.ldaexd(i8* [[TMP5]])
134c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
135c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64*
136c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[ADDR64]])
137c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex(addr64);
139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[ADDR64_AS8:%.*]] = bitcast i64* %addr64 to i8*
140c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: call { i32, i32 } @llvm.arm.ldaexd(i8* [[ADDR64_AS8]])
141c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
142c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldaxr.p0i64(i64* %addr64)
143c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
144c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex(addrfloat);
145c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32*
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldaex.p0i32(i32* [[INTADDR]])
147c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: bitcast i32 [[INTRES]] to float
148c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
149c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32*
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i32(i32* [[INTADDR]])
151c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32
152c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: bitcast i32 [[TRUNCRES]] to float
153c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
154c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex((double *)addr);
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to double*
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i8*
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[STRUCTRES:%.*]] = call { i32, i32 } @llvm.arm.ldaexd(i8* [[TMP5]])
158c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[RESHI:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 1
159c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[RESLO:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 0
160c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[RESHI64:%.*]] = zext i32 [[RESHI]] to i64
161c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[RESLO64:%.*]] = zext i32 [[RESLO]] to i64
162c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[RESHIHI:%.*]] = shl nuw i64 [[RESHI64]], 32
163c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[INTRES:%.*]] = or i64 [[RESHIHI]], [[RESLO64]]
164c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: bitcast i64 [[INTRES]] to double
165c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to double*
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i64*
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[TMP5]])
169c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: bitcast i64 [[INTRES]] to double
170c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
171c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += *__builtin_arm_ldaex((int **)addr);
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to i32**
1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast i32** [[TMP4]] to i32*
1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldaex.p0i32(i32* [[TMP5]])
175c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: inttoptr i32 [[INTRES]] to i32*
176c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to i32**
1784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast i32** [[TMP4]] to i64*
1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[TMP5]])
180c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to i32*
181c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
182c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  sum += __builtin_arm_ldaex((struct Simple **)addr)->a;
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i32*
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTRES:%.*]] = call i32 @llvm.arm.ldaex.p0i32(i32* [[TMP5]])
186c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: inttoptr i32 [[INTRES]] to %struct.Simple*
187c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i64*
1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTRES:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[TMP5]])
191c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to %struct.Simple*
192c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return sum;
193c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
194c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
19509df2b066221d869f17f4b5762405f111a65f983Tim Northoverint test_strex(char *addr) {
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-LABEL: @test_strex
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_strex
19809df2b066221d869f17f4b5762405f111a65f983Tim Northover  int res = 0;
19909df2b066221d869f17f4b5762405f111a65f983Tim Northover  struct Simple var = {0};
20009df2b066221d869f17f4b5762405f111a65f983Tim Northover  res |= __builtin_arm_strex(4, addr);
20109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strex.p0i8(i32 4, i8* %addr)
20209df2b066221d869f17f4b5762405f111a65f983Tim Northover
2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i8(i64 4, i8* %addr)
204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20509df2b066221d869f17f4b5762405f111a65f983Tim Northover  res |= __builtin_arm_strex(42, (short *)addr);
20609df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
20709df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK:  call i32 @llvm.arm.strex.p0i16(i32 42, i16* [[ADDR16]])
20809df2b066221d869f17f4b5762405f111a65f983Tim Northover
209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64:  call i32 @llvm.aarch64.stxr.p0i16(i64 42, i16* [[ADDR16]])
211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
21209df2b066221d869f17f4b5762405f111a65f983Tim Northover  res |= __builtin_arm_strex(42, (int *)addr);
21309df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
21409df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strex.p0i32(i32 42, i32* [[ADDR32]])
21509df2b066221d869f17f4b5762405f111a65f983Tim Northover
216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
2176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i32(i64 42, i32* [[ADDR32]])
218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
21909df2b066221d869f17f4b5762405f111a65f983Tim Northover  res |= __builtin_arm_strex(42, (long long *)addr);
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store i64 42, i64* [[TMP:%.*]], align 8
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI_ADDR:%.*]] = bitcast i64* [[TMP]] to { i32, i32 }*
2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI:%.*]] = load { i32, i32 }, { i32, i32 }* [[LOHI_ADDR]]
2234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
2254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to i64*
2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast i64* [[TMP4]] to i8*
2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.strexd(i32 [[LO]], i32 [[HI]], i8* [[TMP5]])
22809df2b066221d869f17f4b5762405f111a65f983Tim Northover
229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64*
2306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i64(i64 42, i64* [[ADDR64]])
231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
23209df2b066221d869f17f4b5762405f111a65f983Tim Northover  res |= __builtin_arm_strex(2.71828f, (float *)addr);
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to float*
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast float* [[TMP4]] to i32*
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.strex.p0i32(i32 1076754509, i32* [[TMP5]])
23609df2b066221d869f17f4b5762405f111a65f983Tim Northover
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to float*
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast float* [[TMP4]] to i32*
2394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i32(i64 1076754509, i32* [[TMP5]])
240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
24109df2b066221d869f17f4b5762405f111a65f983Tim Northover  res |= __builtin_arm_strex(3.14159, (double *)addr);
2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store double 3.141590e+00, double* [[TMP:%.*]], align 8
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI_ADDR:%.*]] = bitcast double* [[TMP]] to { i32, i32 }*
2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI:%.*]] = load { i32, i32 }, { i32, i32 }* [[LOHI_ADDR]]
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
2464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
2474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to double*
2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i8*
2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.strexd(i32 [[LO]], i32 [[HI]], i8* [[TMP5]])
2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to double*
2524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i64*
2534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i64(i64 4614256650576692846, i64* [[TMP5]])
254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
25509df2b066221d869f17f4b5762405f111a65f983Tim Northover  res |= __builtin_arm_strex(&var, (struct Simple **)addr);
2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i32*
2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTVAL:%.*]] = ptrtoint %struct.Simple* %var to i32
2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.strex.p0i32(i32 [[INTVAL]], i32* [[TMP5]])
26009df2b066221d869f17f4b5762405f111a65f983Tim Northover
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
2624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i64*
2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTVAL:%.*]] = ptrtoint %struct.Simple* %var to i64
2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i64(i64 [[INTVAL]], i64* [[TMP5]])
265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26609df2b066221d869f17f4b5762405f111a65f983Tim Northover  return res;
26709df2b066221d869f17f4b5762405f111a65f983Tim Northover}
26809df2b066221d869f17f4b5762405f111a65f983Tim Northover
269c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint test_stlex(char *addr) {
270c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-LABEL: @test_stlex
271c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64-LABEL: @test_stlex
272c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int res = 0;
273c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  struct Simple var = {0};
274c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  res |= __builtin_arm_stlex(4, addr);
275c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: call i32 @llvm.arm.stlex.p0i8(i32 4, i8* %addr)
276c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
277c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i8(i64 4, i8* %addr)
278c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
279c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  res |= __builtin_arm_stlex(42, (short *)addr);
280c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
281c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK:  call i32 @llvm.arm.stlex.p0i16(i32 42, i16* [[ADDR16]])
282c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
283c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16*
284c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64:  call i32 @llvm.aarch64.stlxr.p0i16(i64 42, i16* [[ADDR16]])
285c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
286c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  res |= __builtin_arm_stlex(42, (int *)addr);
287c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
288c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: call i32 @llvm.arm.stlex.p0i32(i32 42, i32* [[ADDR32]])
289c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
290c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32*
291c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i32(i64 42, i32* [[ADDR32]])
292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
293c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  res |= __builtin_arm_stlex(42, (long long *)addr);
2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store i64 42, i64* [[TMP:%.*]], align 8
2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI_ADDR:%.*]] = bitcast i64* [[TMP]] to { i32, i32 }*
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI:%.*]] = load { i32, i32 }, { i32, i32 }* [[LOHI_ADDR]]
2974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
2984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
2994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to i64*
3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast i64* [[TMP4]] to i8*
3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.stlexd(i32 [[LO]], i32 [[HI]], i8* [[TMP5]])
302c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
303c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64*
304c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i64(i64 42, i64* [[ADDR64]])
305c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
306c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  res |= __builtin_arm_stlex(2.71828f, (float *)addr);
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to float*
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast float* [[TMP4]] to i32*
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.stlex.p0i32(i32 1076754509, i32* [[TMP5]])
310c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
3114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to float*
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast float* [[TMP4]] to i32*
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i32(i64 1076754509, i32* [[TMP5]])
314c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
315c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  res |= __builtin_arm_stlex(3.14159, (double *)addr);
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store double 3.141590e+00, double* [[TMP:%.*]], align 8
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI_ADDR:%.*]] = bitcast double* [[TMP]] to { i32, i32 }*
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LOHI:%.*]] = load { i32, i32 }, { i32, i32 }* [[LOHI_ADDR]]
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to double*
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i8*
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.stlexd(i32 [[LO]], i32 [[HI]], i8* [[TMP5]])
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to double*
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast double* [[TMP4]] to i64*
3274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i64(i64 4614256650576692846, i64* [[TMP5]])
328c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  res |= __builtin_arm_stlex(&var, (struct Simple **)addr);
3304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i32*
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[INTVAL:%.*]] = ptrtoint %struct.Simple* %var to i32
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call i32 @llvm.arm.stlex.p0i32(i32 [[INTVAL]], i32* [[TMP5]])
334c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP4:%.*]] = bitcast i8* %addr to %struct.Simple**
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[TMP5:%.*]] = bitcast %struct.Simple** [[TMP4]] to i64*
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[INTVAL:%.*]] = ptrtoint %struct.Simple* %var to i64
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i64(i64 [[INTVAL]], i64* [[TMP5]])
339c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
340c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return res;
341c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
342c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
34309df2b066221d869f17f4b5762405f111a65f983Tim Northovervoid test_clrex() {
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-LABEL: @test_clrex
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_clrex
34609df2b066221d869f17f4b5762405f111a65f983Tim Northover
34709df2b066221d869f17f4b5762405f111a65f983Tim Northover  __builtin_arm_clrex();
34809df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call void @llvm.arm.clrex()
3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call void @llvm.aarch64.clrex()
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifdef __aarch64__
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 128-bit tests
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__int128 test_ldrex_128(__int128 *addr) {
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_ldrex_128
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __builtin_arm_ldrex(addr);
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8*
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[STRUCTRES:%.*]] = call { i64, i64 } @llvm.aarch64.ldxp(i8* [[ADDR8]])
361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESHI:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 1
362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESLO:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 0
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESHI64:%.*]] = zext i64 [[RESHI]] to i128
364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESLO64:%.*]] = zext i64 [[RESLO]] to i128
365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESHIHI:%.*]] = shl nuw i128 [[RESHI64]], 64
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[INTRES:%.*]] = or i128 [[RESHIHI]], [[RESLO64]]
367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: ret i128 [[INTRES]]
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint test_strex_128(__int128 *addr, __int128 val) {
371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_strex_128
372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __builtin_arm_strex(val, addr);
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: store i128 %val, i128* [[TMP:%.*]], align 16
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[LOHI_ADDR:%.*]] = bitcast i128* [[TMP]] to { i64, i64 }*
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[LOHI:%.*]] = load { i64, i64 }, { i64, i64 }* [[LOHI_ADDR]]
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[LO:%.*]] = extractvalue { i64, i64 } [[LOHI]], 0
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[HI:%.*]] = extractvalue { i64, i64 } [[LOHI]], 1
379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8*
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: call i32 @llvm.aarch64.stxp(i64 [[LO]], i64 [[HI]], i8* [[ADDR8]])
38109df2b066221d869f17f4b5762405f111a65f983Tim Northover}
382c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
383c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines__int128 test_ldaex_128(__int128 *addr) {
384c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64-LABEL: @test_ldaex_128
385c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
386c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return __builtin_arm_ldaex(addr);
387c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8*
3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[STRUCTRES:%.*]] = call { i64, i64 } @llvm.aarch64.ldaxp(i8* [[ADDR8]])
389c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[RESHI:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 1
390c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[RESLO:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 0
391c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[RESHI64:%.*]] = zext i64 [[RESHI]] to i128
392c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[RESLO64:%.*]] = zext i64 [[RESLO]] to i128
393c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[RESHIHI:%.*]] = shl nuw i128 [[RESHI64]], 64
394c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = or i128 [[RESHIHI]], [[RESLO64]]
395c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: ret i128 [[INTRES]]
396c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
397c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
398c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint test_stlex_128(__int128 *addr, __int128 val) {
399c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64-LABEL: @test_stlex_128
400c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
401c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return __builtin_arm_stlex(val, addr);
4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: store i128 %val, i128* [[TMP:%.*]], align 16
4034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[LOHI_ADDR:%.*]] = bitcast i128* [[TMP]] to { i64, i64 }*
4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[LOHI:%.*]] = load { i64, i64 }, { i64, i64 }* [[LOHI_ADDR]]
4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[LO:%.*]] = extractvalue { i64, i64 } [[LOHI]], 0
4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[HI:%.*]] = extractvalue { i64, i64 } [[LOHI]], 1
407c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8*
4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM64: [[RES:%.*]] = call i32 @llvm.aarch64.stlxp(i64 [[LO]], i64 [[HI]], i8* [[ADDR8]])
409c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
410c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
412