109df2b066221d869f17f4b5762405f111a65f983Tim Northover// REQUIRES: arm-registered-target 2ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -Wall -Werror -triple thumbv8-linux-gnueabi -fno-signed-char -O3 -emit-llvm -o - %s | FileCheck %s 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -Wall -Werror -triple arm64-apple-ios7.0 -O3 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-ARM64 409df2b066221d869f17f4b5762405f111a65f983Tim Northover 509df2b066221d869f17f4b5762405f111a65f983Tim Northover// Make sure the canonical use works before going into smaller details: 609df2b066221d869f17f4b5762405f111a65f983Tim Northoverint atomic_inc(int *addr) { 709df2b066221d869f17f4b5762405f111a65f983Tim Northover int Failure, OldVal; 809df2b066221d869f17f4b5762405f111a65f983Tim Northover do { 909df2b066221d869f17f4b5762405f111a65f983Tim Northover OldVal = __builtin_arm_ldrex(addr); 1009df2b066221d869f17f4b5762405f111a65f983Tim Northover Failure = __builtin_arm_strex(OldVal + 1, addr); 1109df2b066221d869f17f4b5762405f111a65f983Tim Northover } while (Failure); 1209df2b066221d869f17f4b5762405f111a65f983Tim Northover 1309df2b066221d869f17f4b5762405f111a65f983Tim Northover return OldVal; 1409df2b066221d869f17f4b5762405f111a65f983Tim Northover} 1509df2b066221d869f17f4b5762405f111a65f983Tim Northover 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-LABEL: @atomic_inc 1709df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[OLDVAL:%.*]] = tail call i32 @llvm.arm.ldrex.p0i32(i32* %addr) 1809df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INC:%.*]] = add nsw i32 [[OLDVAL]], 1 1909df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[FAILURE:%.*]] = tail call i32 @llvm.arm.strex.p0i32(i32 [[INC]], i32* %addr) 2009df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[TST:%.*]] = icmp eq i32 [[FAILURE]], 0 216cbe66fc2d10e6d63efabb851877ea2521f23ccaTim Northover// CHECK: br i1 [[TST]], label {{%[a-zA-Z0-9.]+}}, label {{%[a-zA-Z0-9.]+}} 2209df2b066221d869f17f4b5762405f111a65f983Tim Northover 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @atomic_inc 246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[OLDVAL:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i32(i32* %addr) 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[INC:%.*]] = add i64 [[OLDVAL]], 1 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[TRUNC:%.*]] = and i64 [[INC]], 4294967295 276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[FAILURE:%.*]] = tail call i32 @llvm.aarch64.stxr.p0i32(i64 [[TRUNC]], i32* %addr) 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[TST:%.*]] = icmp eq i32 [[FAILURE]], 0 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: br i1 [[TST]], label {{%[a-zA-Z0-9.]+}}, label {{%[a-zA-Z0-9.]+}} 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3109df2b066221d869f17f4b5762405f111a65f983Tim Northoverstruct Simple { 3209df2b066221d869f17f4b5762405f111a65f983Tim Northover char a, b; 3309df2b066221d869f17f4b5762405f111a65f983Tim Northover}; 3409df2b066221d869f17f4b5762405f111a65f983Tim Northover 3509df2b066221d869f17f4b5762405f111a65f983Tim Northoverint test_ldrex(char *addr, long long *addr64, float *addrfloat) { 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-LABEL: @test_ldrex 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_ldrex 3809df2b066221d869f17f4b5762405f111a65f983Tim Northover int sum = 0; 3909df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex(addr); 4009df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldrex.p0i8(i8* %addr) 4109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: and i32 [[INTRES]], 255 4209df2b066221d869f17f4b5762405f111a65f983Tim Northover 436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i8(i8* %addr) 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[SEXTTMP:%.*]] = shl i32 [[TRUNCRES]], 24 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: ashr exact i32 [[SEXTTMP]], 24 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4809df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex((short *)addr); 4909df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 5009df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldrex.p0i16(i16* [[ADDR16]]) 5109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[TMPSEXT:%.*]] = shl i32 [[INTRES]], 16 5209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: ashr exact i32 [[TMPSEXT]], 16 5309df2b066221d869f17f4b5762405f111a65f983Tim Northover 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i16(i16* [[ADDR16]]) 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[TMPSEXT:%.*]] = shl i32 [[TRUNCRES]], 16 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: ashr exact i32 [[TMPSEXT]], 16 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6009df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex((int *)addr); 6109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 6209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.ldrex.p0i32(i32* [[ADDR32]]) 6309df2b066221d869f17f4b5762405f111a65f983Tim Northover 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i32(i32* [[ADDR32]]) 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: trunc i64 [[INTRES]] to i32 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6809df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex((long long *)addr); 6909df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call { i32, i32 } @llvm.arm.ldrexd(i8* %addr) 7009df2b066221d869f17f4b5762405f111a65f983Tim Northover 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64* 726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldxr.p0i64(i64* [[ADDR64]]) 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 7409df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex(addr64); 7509df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR64_AS8:%.*]] = bitcast i64* %addr64 to i8* 7609df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call { i32, i32 } @llvm.arm.ldrexd(i8* [[ADDR64_AS8]]) 7709df2b066221d869f17f4b5762405f111a65f983Tim Northover 786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldxr.p0i64(i64* %addr64) 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 8009df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex(addrfloat); 8109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32* 8209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldrex.p0i32(i32* [[INTADDR]]) 8309df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: bitcast i32 [[INTRES]] to float 8409df2b066221d869f17f4b5762405f111a65f983Tim Northover 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32* 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i32(i32* [[INTADDR]]) 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: bitcast i32 [[TRUNCRES]] to float 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 9009df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex((double *)addr); 9109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[STRUCTRES:%.*]] = tail call { i32, i32 } @llvm.arm.ldrexd(i8* %addr) 9209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESHI:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 1 9309df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESLO:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 0 9409df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESHI64:%.*]] = zext i32 [[RESHI]] to i64 9509df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESLO64:%.*]] = zext i32 [[RESLO]] to i64 9609df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[RESHIHI:%.*]] = shl nuw i64 [[RESHI64]], 32 9709df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTRES:%.*]] = or i64 [[RESHIHI]], [[RESLO64]] 9809df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: bitcast i64 [[INTRES]] to double 9909df2b066221d869f17f4b5762405f111a65f983Tim Northover 1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i64(i64* [[ADDR64]]) 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: bitcast i64 [[INTRES]] to double 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 10309df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += *__builtin_arm_ldrex((int **)addr); 10409df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldrex.p0i32(i32* [[ADDR32]]) 10509df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: inttoptr i32 [[INTRES]] to i32* 10609df2b066221d869f17f4b5762405f111a65f983Tim Northover 1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i64(i64* [[ADDR64]]) 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to i32* 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 11009df2b066221d869f17f4b5762405f111a65f983Tim Northover sum += __builtin_arm_ldrex((struct Simple **)addr)->a; 11109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldrex.p0i32(i32* [[ADDR32]]) 11209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: inttoptr i32 [[INTRES]] to %struct.Simple* 11309df2b066221d869f17f4b5762405f111a65f983Tim Northover 1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldxr.p0i64(i64* [[ADDR64]]) 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to %struct.Simple* 11609df2b066221d869f17f4b5762405f111a65f983Tim Northover return sum; 11709df2b066221d869f17f4b5762405f111a65f983Tim Northover} 11809df2b066221d869f17f4b5762405f111a65f983Tim Northover 119ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint test_ldaex(char *addr, long long *addr64, float *addrfloat) { 120ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: @test_ldaex 121ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64-LABEL: @test_ldaex 122ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int sum = 0; 123ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex(addr); 124ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldaex.p0i8(i8* %addr) 125ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: and i32 [[INTRES]], 255 126ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 127ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldaxr.p0i8(i8* %addr) 128ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32 129ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[SEXTTMP:%.*]] = shl i32 [[TRUNCRES]], 24 130ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: ashr exact i32 [[SEXTTMP]], 24 131ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 132ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex((short *)addr); 133ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 134ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldaex.p0i16(i16* [[ADDR16]]) 135ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[TMPSEXT:%.*]] = shl i32 [[INTRES]], 16 136ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: ashr exact i32 [[TMPSEXT]], 16 137ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 138ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 139ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldaxr.p0i16(i16* [[ADDR16]]) 140ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32 141ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[TMPSEXT:%.*]] = shl i32 [[TRUNCRES]], 16 142ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: ashr exact i32 [[TMPSEXT]], 16 143ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 144ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex((int *)addr); 145ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 146ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.ldaex.p0i32(i32* [[ADDR32]]) 147ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 148ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldaxr.p0i32(i32* [[ADDR32]]) 150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: trunc i64 [[INTRES]] to i32 151ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex((long long *)addr); 153ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call { i32, i32 } @llvm.arm.ldaexd(i8* %addr) 154ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 155ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64* 156ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[ADDR64]]) 157ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 158ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex(addr64); 159ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[ADDR64_AS8:%.*]] = bitcast i64* %addr64 to i8* 160ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call { i32, i32 } @llvm.arm.ldaexd(i8* [[ADDR64_AS8]]) 161ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 162ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i64 @llvm.aarch64.ldaxr.p0i64(i64* %addr64) 163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex(addrfloat); 165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32* 166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldaex.p0i32(i32* [[INTADDR]]) 167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: bitcast i32 [[INTRES]] to float 168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTADDR:%.*]] = bitcast float* %addrfloat to i32* 170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldaxr.p0i32(i32* [[INTADDR]]) 171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[TRUNCRES:%.*]] = trunc i64 [[INTRES]] to i32 172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: bitcast i32 [[TRUNCRES]] to float 173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex((double *)addr); 175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[STRUCTRES:%.*]] = tail call { i32, i32 } @llvm.arm.ldaexd(i8* %addr) 176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[RESHI:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 1 177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[RESLO:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 0 178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[RESHI64:%.*]] = zext i32 [[RESHI]] to i64 179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[RESLO64:%.*]] = zext i32 [[RESLO]] to i64 180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[RESHIHI:%.*]] = shl nuw i64 [[RESHI64]], 32 181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTRES:%.*]] = or i64 [[RESHIHI]], [[RESLO64]] 182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: bitcast i64 [[INTRES]] to double 183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 184ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[ADDR64]]) 185ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: bitcast i64 [[INTRES]] to double 186ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 187ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += *__builtin_arm_ldaex((int **)addr); 188ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldaex.p0i32(i32* [[ADDR32]]) 189ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: inttoptr i32 [[INTRES]] to i32* 190ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[ADDR64]]) 192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to i32* 193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += __builtin_arm_ldaex((struct Simple **)addr)->a; 195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTRES:%.*]] = tail call i32 @llvm.arm.ldaex.p0i32(i32* [[ADDR32]]) 196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: inttoptr i32 [[INTRES]] to %struct.Simple* 197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = tail call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[ADDR64]]) 199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: inttoptr i64 [[INTRES]] to %struct.Simple* 200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return sum; 201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 20309df2b066221d869f17f4b5762405f111a65f983Tim Northoverint test_strex(char *addr) { 204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-LABEL: @test_strex 205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_strex 20609df2b066221d869f17f4b5762405f111a65f983Tim Northover int res = 0; 20709df2b066221d869f17f4b5762405f111a65f983Tim Northover struct Simple var = {0}; 20809df2b066221d869f17f4b5762405f111a65f983Tim Northover res |= __builtin_arm_strex(4, addr); 20909df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strex.p0i8(i32 4, i8* %addr) 21009df2b066221d869f17f4b5762405f111a65f983Tim Northover 2116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i8(i64 4, i8* %addr) 212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 21309df2b066221d869f17f4b5762405f111a65f983Tim Northover res |= __builtin_arm_strex(42, (short *)addr); 21409df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 21509df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strex.p0i16(i32 42, i16* [[ADDR16]]) 21609df2b066221d869f17f4b5762405f111a65f983Tim Northover 217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 2186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i16(i64 42, i16* [[ADDR16]]) 219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 22009df2b066221d869f17f4b5762405f111a65f983Tim Northover res |= __builtin_arm_strex(42, (int *)addr); 22109df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 22209df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strex.p0i32(i32 42, i32* [[ADDR32]]) 22309df2b066221d869f17f4b5762405f111a65f983Tim Northover 224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 2256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i32(i64 42, i32* [[ADDR32]]) 226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 22709df2b066221d869f17f4b5762405f111a65f983Tim Northover res |= __builtin_arm_strex(42, (long long *)addr); 22809df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strexd(i32 42, i32 0, i8* %addr) 22909df2b066221d869f17f4b5762405f111a65f983Tim Northover 230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64* 2316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i64(i64 42, i64* [[ADDR64]]) 232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 23309df2b066221d869f17f4b5762405f111a65f983Tim Northover res |= __builtin_arm_strex(2.71828f, (float *)addr); 23409df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strex.p0i32(i32 1076754509, i32* [[ADDR32]]) 23509df2b066221d869f17f4b5762405f111a65f983Tim Northover 2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i32(i64 1076754509, i32* [[ADDR32]]) 237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 23809df2b066221d869f17f4b5762405f111a65f983Tim Northover res |= __builtin_arm_strex(3.14159, (double *)addr); 23909df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strexd(i32 -266631570, i32 1074340345, i8* %addr) 24009df2b066221d869f17f4b5762405f111a65f983Tim Northover 2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i64(i64 4614256650576692846, i64* [[ADDR64]]) 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 24309df2b066221d869f17f4b5762405f111a65f983Tim Northover res |= __builtin_arm_strex(&var, (struct Simple **)addr); 24409df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: [[INTVAL:%.*]] = ptrtoint i16* %var to i32 24509df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call i32 @llvm.arm.strex.p0i32(i32 [[INTVAL]], i32* [[ADDR32]]) 24609df2b066221d869f17f4b5762405f111a65f983Tim Northover 247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[INTVAL:%.*]] = ptrtoint i16* %var to i64 2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stxr.p0i64(i64 [[INTVAL]], i64* [[ADDR64]]) 249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 25009df2b066221d869f17f4b5762405f111a65f983Tim Northover return res; 25109df2b066221d869f17f4b5762405f111a65f983Tim Northover} 25209df2b066221d869f17f4b5762405f111a65f983Tim Northover 253ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint test_stlex(char *addr) { 254ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: @test_stlex 255ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64-LABEL: @test_stlex 256ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int res = 0; 257ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct Simple var = {0}; 258ef8225444452a1486bd721f3285301fe84643b00Stephen Hines res |= __builtin_arm_stlex(4, addr); 259ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.stlex.p0i8(i32 4, i8* %addr) 260ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 261ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i8(i64 4, i8* %addr) 262ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 263ef8225444452a1486bd721f3285301fe84643b00Stephen Hines res |= __builtin_arm_stlex(42, (short *)addr); 264ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 265ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.stlex.p0i16(i32 42, i16* [[ADDR16]]) 266ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 267ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR16:%.*]] = bitcast i8* %addr to i16* 268ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i16(i64 42, i16* [[ADDR16]]) 269ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 270ef8225444452a1486bd721f3285301fe84643b00Stephen Hines res |= __builtin_arm_stlex(42, (int *)addr); 271ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 272ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.stlex.p0i32(i32 42, i32* [[ADDR32]]) 273ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 274ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR32:%.*]] = bitcast i8* %addr to i32* 275ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i32(i64 42, i32* [[ADDR32]]) 276ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 277ef8225444452a1486bd721f3285301fe84643b00Stephen Hines res |= __builtin_arm_stlex(42, (long long *)addr); 278ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.stlexd(i32 42, i32 0, i8* %addr) 279ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 280ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR64:%.*]] = bitcast i8* %addr to i64* 281ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i64(i64 42, i64* [[ADDR64]]) 282ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 283ef8225444452a1486bd721f3285301fe84643b00Stephen Hines res |= __builtin_arm_stlex(2.71828f, (float *)addr); 284ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.stlex.p0i32(i32 1076754509, i32* [[ADDR32]]) 285ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 286ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i32(i64 1076754509, i32* [[ADDR32]]) 287ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 288ef8225444452a1486bd721f3285301fe84643b00Stephen Hines res |= __builtin_arm_stlex(3.14159, (double *)addr); 289ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.stlexd(i32 -266631570, i32 1074340345, i8* %addr) 290ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 291ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i64(i64 4614256650576692846, i64* [[ADDR64]]) 292ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 293ef8225444452a1486bd721f3285301fe84643b00Stephen Hines res |= __builtin_arm_stlex(&var, (struct Simple **)addr); 294ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: [[INTVAL:%.*]] = ptrtoint i16* %var to i32 295ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: call i32 @llvm.arm.stlex.p0i32(i32 [[INTVAL]], i32* [[ADDR32]]) 296ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 297ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTVAL:%.*]] = ptrtoint i16* %var to i64 298ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: call i32 @llvm.aarch64.stlxr.p0i64(i64 [[INTVAL]], i64* [[ADDR64]]) 299ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 300ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return res; 301ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 302ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 30309df2b066221d869f17f4b5762405f111a65f983Tim Northovervoid test_clrex() { 304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-LABEL: @test_clrex 305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_clrex 30609df2b066221d869f17f4b5762405f111a65f983Tim Northover 30709df2b066221d869f17f4b5762405f111a65f983Tim Northover __builtin_arm_clrex(); 30809df2b066221d869f17f4b5762405f111a65f983Tim Northover// CHECK: call void @llvm.arm.clrex() 3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: call void @llvm.aarch64.clrex() 310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifdef __aarch64__ 313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 128-bit tests 314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__int128 test_ldrex_128(__int128 *addr) { 316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_ldrex_128 317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return __builtin_arm_ldrex(addr); 319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8* 3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[STRUCTRES:%.*]] = tail call { i64, i64 } @llvm.aarch64.ldxp(i8* [[ADDR8]]) 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESHI:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 1 322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESLO:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 0 323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESHI64:%.*]] = zext i64 [[RESHI]] to i128 324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESLO64:%.*]] = zext i64 [[RESLO]] to i128 325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[RESHIHI:%.*]] = shl nuw i128 [[RESHI64]], 64 326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[INTRES:%.*]] = or i128 [[RESHIHI]], [[RESLO64]] 327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: ret i128 [[INTRES]] 328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint test_strex_128(__int128 *addr, __int128 val) { 331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64-LABEL: @test_strex_128 332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return __builtin_arm_strex(val, addr); 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[VALLO:%.*]] = trunc i128 %val to i64 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[VALHI128:%.*]] = lshr i128 %val, 64 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[VALHI:%.*]] = trunc i128 [[VALHI128]] to i64 337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8* 3386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK-ARM64: [[RES:%.*]] = tail call i32 @llvm.aarch64.stxp(i64 [[VALLO]], i64 [[VALHI]], i8* [[ADDR8]]) 33909df2b066221d869f17f4b5762405f111a65f983Tim Northover} 340ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 341ef8225444452a1486bd721f3285301fe84643b00Stephen Hines__int128 test_ldaex_128(__int128 *addr) { 342ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64-LABEL: @test_ldaex_128 343ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 344ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return __builtin_arm_ldaex(addr); 345ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8* 346ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[STRUCTRES:%.*]] = tail call { i64, i64 } @llvm.aarch64.ldaxp(i8* [[ADDR8]]) 347ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[RESHI:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 1 348ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[RESLO:%.*]] = extractvalue { i64, i64 } [[STRUCTRES]], 0 349ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[RESHI64:%.*]] = zext i64 [[RESHI]] to i128 350ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[RESLO64:%.*]] = zext i64 [[RESLO]] to i128 351ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[RESHIHI:%.*]] = shl nuw i128 [[RESHI64]], 64 352ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[INTRES:%.*]] = or i128 [[RESHIHI]], [[RESLO64]] 353ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: ret i128 [[INTRES]] 354ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 355ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 356ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint test_stlex_128(__int128 *addr, __int128 val) { 357ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64-LABEL: @test_stlex_128 358ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 359ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return __builtin_arm_stlex(val, addr); 360ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[VALLO:%.*]] = trunc i128 %val to i64 361ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[VALHI128:%.*]] = lshr i128 %val, 64 362ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[VALHI:%.*]] = trunc i128 [[VALHI128]] to i64 363ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[ADDR8:%.*]] = bitcast i128* %addr to i8* 364ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-ARM64: [[RES:%.*]] = tail call i32 @llvm.aarch64.stlxp(i64 [[VALLO]], i64 [[VALHI]], i8* [[ADDR8]]) 365ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 366ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 368