1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| // REQUIRES: x86-registered-target
| // RUN: %clang_cc1 %s -triple i686-pc-windows-msvc -emit-llvm -o - -fasm-blocks | FileCheck %s
|
| // Check that we take EAX or EAX:EDX and return it from these functions for MSVC
| // compatibility.
|
| extern "C" {
|
| long long f_i64() {
| __asm {
| mov eax, 1
| mov edx, 1
| }
| }
| // CHECK-LABEL: define i64 @f_i64()
| // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=A,~{eax},{{.*}}"
| // CHECK: ret i64 %[[r]]
|
| int f_i32() {
| __asm {
| mov eax, 1
| mov edx, 1
| }
| }
| // CHECK-LABEL: define i32 @f_i32()
| // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "={eax},~{eax},{{.*}}"
| // CHECK: ret i32 %[[r]]
|
| short f_i16() {
| __asm {
| mov eax, 1
| mov edx, 1
| }
| }
| // CHECK-LABEL: define signext i16 @f_i16()
| // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "={eax},~{eax},{{.*}}"
| // CHECK: %[[r_i16:[^ ]*]] = trunc i32 %[[r]] to i16
| // CHECK: ret i16 %[[r_i16]]
|
| char f_i8() {
| __asm {
| mov eax, 1
| mov edx, 1
| }
| }
| // CHECK-LABEL: define signext i8 @f_i8()
| // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "={eax},~{eax},{{.*}}"
| // CHECK: %[[r_i8:[^ ]*]] = trunc i32 %[[r]] to i8
| // CHECK: ret i8 %[[r_i8]]
|
| bool f_i1() {
| __asm {
| mov eax, 1
| mov edx, 1
| }
| }
| // CHECK-LABEL: define zeroext i1 @f_i1()
| // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "={eax},~{eax},{{.*}}"
| // CHECK: %[[r_i8:[^ ]*]] = trunc i32 %[[r]] to i8
| // CHECK: store i8 %[[r_i8]], i8* %{{.*}}
| // CHECK: %[[r_i1:[^ ]*]] = load i1, i1* %{{.*}}
| // CHECK: ret i1 %[[r_i1]]
|
| struct FourChars {
| char a, b, c, d;
| };
| FourChars f_s4() {
| __asm {
| mov eax, 0x01010101
| }
| }
| // CHECK-LABEL: define i32 @f_s4()
| // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$0x01010101", "={eax},~{eax},{{.*}}"
| // CHECK: store i32 %[[r]], i32* %{{.*}}
| // CHECK: %[[r_i32:[^ ]*]] = load i32, i32* %{{.*}}
| // CHECK: ret i32 %[[r_i32]]
|
| struct EightChars {
| char a, b, c, d, e, f, g, h;
| };
| EightChars f_s8() {
| __asm {
| mov eax, 0x01010101
| mov edx, 0x01010101
| }
| }
| // CHECK-LABEL: define i64 @f_s8()
| // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov eax, $$0x01010101\0A\09mov edx, $$0x01010101", "=A,~{eax},{{.*}}"
| // CHECK: store i64 %[[r]], i64* %{{.*}}
| // CHECK: %[[r_i64:[^ ]*]] = load i64, i64* %{{.*}}
| // CHECK: ret i64 %[[r_i64]]
|
| } // extern "C"
|
| int main() {
| __asm xor eax, eax
| }
| // CHECK-LABEL: define i32 @main()
| // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "xor eax, eax", "={eax},{{.*}}"
| // CHECK: ret i32 %[[r]]
|
|