xref: /llvm-project/clang/test/CodeGenCXX/ms-inline-asm-return.cpp (revision 1b9a6e58a8b831193c9e5e733f881aabe0d2d06b)
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 dso_local i64 @f_i64()
16 // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&A,{{.*}}"
17 // CHECK: ret i64 %[[r]]
18 
f_i64_reverse()19 long long f_i64_reverse() {
20   __asm {
21     mov edx, 1
22     mov eax, 1
23   }
24 }
25 // CHECK-LABEL: define dso_local i64 @f_i64_reverse()
26 // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov edx, $$1\0A\09mov eax, $$1", "=&A,{{.*}}"
27 // CHECK: ret i64 %[[r]]
28 
f_i32()29 int f_i32() {
30   __asm {
31     mov eax, 1
32     mov edx, 1
33   }
34 }
35 // CHECK-LABEL: define dso_local i32 @f_i32()
36 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}"
37 // CHECK: ret i32 %[[r]]
38 
f_i32_reverse()39 int f_i32_reverse() {
40   __asm {
41     mov edx, 1
42     mov eax, 1
43   }
44 }
45 // CHECK-LABEL: define dso_local i32 @f_i32_reverse()
46 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov edx, $$1\0A\09mov eax, $$1", "=&{eax},~{edx},{{.*}}"
47 // CHECK: ret i32 %[[r]]
48 
f_i32_edx()49 int f_i32_edx() {
50   __asm {
51     mov edx, 1
52   }
53 }
54 // CHECK-LABEL: define dso_local i32 @f_i32_edx()
55 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov edx, $$1", "={eax},~{edx},{{.*}}"
56 // CHECK: ret i32 %[[r]]
57 
f_i16()58 short f_i16() {
59   __asm {
60     mov eax, 1
61     mov edx, 1
62   }
63 }
64 // CHECK-LABEL: define dso_local signext i16 @f_i16()
65 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}"
66 // CHECK: %[[r_i16:[^ ]*]] = trunc i32 %[[r]] to i16
67 // CHECK: ret i16 %[[r_i16]]
68 
f_i8()69 char f_i8() {
70   __asm {
71     mov eax, 1
72     mov edx, 1
73   }
74 }
75 // CHECK-LABEL: define dso_local signext i8 @f_i8()
76 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}"
77 // CHECK: %[[r_i8:[^ ]*]] = trunc i32 %[[r]] to i8
78 // CHECK: ret i8 %[[r_i8]]
79 
f_i1()80 bool f_i1() {
81   __asm {
82     mov eax, 1L
83     mov edx, 1U
84   }
85 }
86 // CHECK-LABEL: define dso_local zeroext i1 @f_i1()
87 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}"
88 // CHECK: %[[r_i8:[^ ]*]] = trunc i32 %[[r]] to i8
89 // CHECK: store i8 %[[r_i8]], ptr %{{.*}}
90 // CHECK: %[[r_i1:[^ ]*]] = load i1, ptr %{{.*}}
91 // CHECK: ret i1 %[[r_i1]]
92 
93 struct FourChars {
94   char a, b, c, d;
95 };
f_s4()96 FourChars f_s4() {
97   __asm {
98     mov eax, 0x01010101
99   }
100 }
101 // CHECK-LABEL: define dso_local i32 @f_s4()
102 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$16843009", "=&{eax},{{.*}}"
103 // CHECK: store i32 %[[r]], ptr %{{.*}}
104 // CHECK: %[[r_i32:[^ ]*]] = load i32, ptr %{{.*}}
105 // CHECK: ret i32 %[[r_i32]]
106 
107 struct EightChars {
108   char a, b, c, d, e, f, g, h;
109 };
f_s8()110 EightChars f_s8() {
111   __asm {
112     mov eax, 01010101h
113     mov edx, 01010101b
114   }
115 }
116 // CHECK-LABEL: define dso_local i64 @f_s8()
117 // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov eax, $$16843009\0A\09mov edx, $$85", "=&A,{{.*}}"
118 // CHECK: store i64 %[[r]], ptr %{{.*}}
119 // CHECK: %[[r_i64:[^ ]*]] = load i64, ptr %{{.*}}
120 // CHECK: ret i64 %[[r_i64]]
121 
122 } // extern "C"
123 
main()124 int main() {
125   __asm xor eax, eax
126 }
127 // CHECK-LABEL: define dso_local noundef i32 @main()
128 // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "xor eax, eax", "=&{eax},{{.*}}"
129 // CHECK: ret i32 %[[r]]
130