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