| 1 | // RUN: %clang_cc1 -triple arm64-windows -fms-compatibility -emit-llvm -o - %s \ |
| 2 | // RUN: | FileCheck %s -check-prefix CHECK-MSVC |
| 3 | |
| 4 | // RUN: not %clang_cc1 -triple arm64-linux -Werror -S -o /dev/null %s 2>&1 \ |
| 5 | // RUN: | FileCheck %s -check-prefix CHECK-LINUX |
| 6 | |
| 7 | long test_InterlockedAdd(long volatile *Addend, long Value) { |
| 8 | return _InterlockedAdd(Addend, Value); |
| 9 | } |
| 10 | |
| 11 | // CHECK-LABEL: define {{.*}} i32 @test_InterlockedAdd(i32* %Addend, i32 %Value) {{.*}} { |
| 12 | // CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add i32* %1, i32 %2 seq_cst |
| 13 | // CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i32 %[[OLDVAL:[0-9]+]], %2 |
| 14 | // CHECK-MSVC: ret i32 %[[NEWVAL:[0-9]+]] |
| 15 | // CHECK-LINUX: error: implicit declaration of function '_InterlockedAdd' |
| 16 | |
| 17 | void check__dmb(void) { |
| 18 | __dmb(0); |
| 19 | } |
| 20 | |
| 21 | // CHECK-MSVC: @llvm.aarch64.dmb(i32 0) |
| 22 | // CHECK-LINUX: error: implicit declaration of function '__dmb' |
| 23 | |
| 24 | void check__dsb(void) { |
| 25 | __dsb(0); |
| 26 | } |
| 27 | |
| 28 | // CHECK-MSVC: @llvm.aarch64.dsb(i32 0) |
| 29 | // CHECK-LINUX: error: implicit declaration of function '__dsb' |
| 30 | |
| 31 | void check__isb(void) { |
| 32 | __isb(0); |
| 33 | } |
| 34 | |
| 35 | // CHECK-MSVC: @llvm.aarch64.isb(i32 0) |
| 36 | // CHECK-LINUX: error: implicit declaration of function '__isb' |
| 37 | |
| 38 | void check__yield(void) { |
| 39 | __yield(); |
| 40 | } |
| 41 | |
| 42 | // CHECK-MSVC: @llvm.aarch64.hint(i32 1) |
| 43 | // CHECK-LINUX: error: implicit declaration of function '__yield' |
| 44 | |
| 45 | void check__wfe(void) { |
| 46 | __wfe(); |
| 47 | } |
| 48 | |
| 49 | // CHECK-MSVC: @llvm.aarch64.hint(i32 2) |
| 50 | // CHECK-LINUX: error: implicit declaration of function '__wfe' |
| 51 | |
| 52 | void check__wfi(void) { |
| 53 | __wfi(); |
| 54 | } |
| 55 | |
| 56 | // CHECK-MSVC: @llvm.aarch64.hint(i32 3) |
| 57 | // CHECK-LINUX: error: implicit declaration of function '__wfi' |
| 58 | |
| 59 | void check__sev(void) { |
| 60 | __sev(); |
| 61 | } |
| 62 | |
| 63 | // CHECK-MSVC: @llvm.aarch64.hint(i32 4) |
| 64 | // CHECK-LINUX: error: implicit declaration of function '__sev' |
| 65 | |
| 66 | void check__sevl(void) { |
| 67 | __sevl(); |
| 68 | } |
| 69 | |
| 70 | // CHECK-MSVC: @llvm.aarch64.hint(i32 5) |
| 71 | // CHECK-LINUX: error: implicit declaration of function '__sevl' |
| 72 | |
| 73 | void check_ReadWriteBarrier() { |
| 74 | _ReadWriteBarrier(); |
| 75 | } |
| 76 | |
| 77 | // CHECK-MSVC: fence syncscope("singlethread") |
| 78 | // CHECK-LINUX: error: implicit declaration of function '_ReadWriteBarrier' |
| 79 | |
| 80 | unsigned __int64 check__getReg() { |
| 81 | unsigned volatile __int64 reg; |
| 82 | reg = __getReg(18); |
| 83 | reg = __getReg(31); |
| 84 | return reg; |
| 85 | } |
| 86 | |
| 87 | // CHECK-MSVC: call i64 @llvm.read_register.i64(metadata ![[MD2:.*]]) |
| 88 | // CHECK-MSVC: call i64 @llvm.read_register.i64(metadata ![[MD3:.*]]) |
| 89 | // CHECK-MSVC: ![[MD2]] = !{!"x18"} |
| 90 | // CHECK-MSVC: ![[MD3]] = !{!"sp"} |
| 91 | |