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 | |