diff options
Diffstat (limited to 'test/CodeGen/ms-intrinsics.c')
-rw-r--r-- | test/CodeGen/ms-intrinsics.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/test/CodeGen/ms-intrinsics.c b/test/CodeGen/ms-intrinsics.c index e59b1d36a8..cf41d23d35 100644 --- a/test/CodeGen/ms-intrinsics.c +++ b/test/CodeGen/ms-intrinsics.c @@ -9,7 +9,7 @@ // RUN: | FileCheck %s --check-prefixes CHECK,CHECK-X64,CHECK-ARM-X64,CHECK-INTEL // RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \ // RUN: -triple aarch64-windows -Oz -emit-llvm %s -o - \ -// RUN: | FileCheck %s --check-prefixes CHECK-ARM-ARM64,CHECK-ARM-X64 +// RUN: | FileCheck %s --check-prefixes CHECK-ARM-ARM64,CHECK-ARM-X64,CHECK-ARM64 // intrin.h needs size_t, but -ffreestanding prevents us from getting it from // stddef.h. Work around it with this typedef. @@ -494,6 +494,35 @@ long test_InterlockedDecrement(long volatile *Addend) { // CHECK: ret i32 [[RESULT]] // CHECK: } +char test_iso_volatile_load8(char volatile *p) { return __iso_volatile_load8(p); } +short test_iso_volatile_load16(short volatile *p) { return __iso_volatile_load16(p); } +int test_iso_volatile_load32(int volatile *p) { return __iso_volatile_load32(p); } +__int64 test_iso_volatile_load64(__int64 volatile *p) { return __iso_volatile_load64(p); } + +// CHECK: define{{.*}}i8 @test_iso_volatile_load8(i8*{{[a-z_ ]*}}%p) +// CHECK: = load volatile i8, i8* %p +// CHECK: define{{.*}}i16 @test_iso_volatile_load16(i16*{{[a-z_ ]*}}%p) +// CHECK: = load volatile i16, i16* %p +// CHECK: define{{.*}}i32 @test_iso_volatile_load32(i32*{{[a-z_ ]*}}%p) +// CHECK: = load volatile i32, i32* %p +// CHECK: define{{.*}}i64 @test_iso_volatile_load64(i64*{{[a-z_ ]*}}%p) +// CHECK: = load volatile i64, i64* %p + +void test_iso_volatile_store8(char volatile *p, char v) { __iso_volatile_store8(p, v); } +void test_iso_volatile_store16(short volatile *p, short v) { __iso_volatile_store16(p, v); } +void test_iso_volatile_store32(int volatile *p, int v) { __iso_volatile_store32(p, v); } +void test_iso_volatile_store64(__int64 volatile *p, __int64 v) { __iso_volatile_store64(p, v); } + +// CHECK: define{{.*}}void @test_iso_volatile_store8(i8*{{[a-z_ ]*}}%p, i8 {{[a-z_ ]*}}%v) +// CHECK: store volatile i8 %v, i8* %p +// CHECK: define{{.*}}void @test_iso_volatile_store16(i16*{{[a-z_ ]*}}%p, i16 {{[a-z_ ]*}}%v) +// CHECK: store volatile i16 %v, i16* %p +// CHECK: define{{.*}}void @test_iso_volatile_store32(i32*{{[a-z_ ]*}}%p, i32 {{[a-z_ ]*}}%v) +// CHECK: store volatile i32 %v, i32* %p +// CHECK: define{{.*}}void @test_iso_volatile_store64(i64*{{[a-z_ ]*}}%p, i64 {{[a-z_ ]*}}%v) +// CHECK: store volatile i64 %v, i64* %p + + #if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) __int64 test_InterlockedExchange64(__int64 volatile *value, __int64 mask) { return _InterlockedExchange64(value, mask); @@ -1342,15 +1371,14 @@ __int64 test_InterlockedDecrement64_nf(__int64 volatile *Addend) { // CHECK-ARM-ARM64: } #endif -#if !defined(__aarch64__) void test__fastfail() { __fastfail(42); } // CHECK-LABEL: define{{.*}} void @test__fastfail() // CHECK-ARM: call void asm sideeffect "udf #251", "{r0}"(i32 42) #[[NORETURN:[0-9]+]] // CHECK-INTEL: call void asm sideeffect "int $$0x29", "{cx}"(i32 42) #[[NORETURN]] +// CHECK-ARM64: call void asm sideeffect "brk #0xF003", "{w0}"(i32 42) #[[NORETURN:[0-9]+]] // Attributes come last. // CHECK: attributes #[[NORETURN]] = { noreturn{{.*}} } -#endif |