// 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 dso_local i64 @f_i64() // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&A,{{.*}}" // CHECK: ret i64 %[[r]] long long f_i64_reverse() { __asm { mov edx, 1 mov eax, 1 } } // CHECK-LABEL: define dso_local i64 @f_i64_reverse() // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov edx, $$1\0A\09mov eax, $$1", "=&A,{{.*}}" // CHECK: ret i64 %[[r]] int f_i32() { __asm { mov eax, 1 mov edx, 1 } } // CHECK-LABEL: define dso_local i32 @f_i32() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}" // CHECK: ret i32 %[[r]] int f_i32_reverse() { __asm { mov edx, 1 mov eax, 1 } } // CHECK-LABEL: define dso_local i32 @f_i32_reverse() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov edx, $$1\0A\09mov eax, $$1", "=&{eax},~{edx},{{.*}}" // CHECK: ret i32 %[[r]] int f_i32_edx() { __asm { mov edx, 1 } } // CHECK-LABEL: define dso_local i32 @f_i32_edx() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov edx, $$1", "={eax},~{edx},{{.*}}" // CHECK: ret i32 %[[r]] short f_i16() { __asm { mov eax, 1 mov edx, 1 } } // CHECK-LABEL: define dso_local signext i16 @f_i16() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}" // 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 dso_local signext i8 @f_i8() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}" // CHECK: %[[r_i8:[^ ]*]] = trunc i32 %[[r]] to i8 // CHECK: ret i8 %[[r_i8]] bool f_i1() { __asm { mov eax, 1L mov edx, 1U } } // CHECK-LABEL: define dso_local zeroext i1 @f_i1() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}" // CHECK: %[[r_i8:[^ ]*]] = trunc i32 %[[r]] to i8 // CHECK: store i8 %[[r_i8]], ptr %{{.*}} // CHECK: %[[r_i1:[^ ]*]] = load i1, ptr %{{.*}} // CHECK: ret i1 %[[r_i1]] struct FourChars { char a, b, c, d; }; FourChars f_s4() { __asm { mov eax, 0x01010101 } } // CHECK-LABEL: define dso_local i32 @f_s4() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$16843009", "=&{eax},{{.*}}" // CHECK: store i32 %[[r]], ptr %{{.*}} // CHECK: %[[r_i32:[^ ]*]] = load i32, ptr %{{.*}} // CHECK: ret i32 %[[r_i32]] struct EightChars { char a, b, c, d, e, f, g, h; }; EightChars f_s8() { __asm { mov eax, 01010101h mov edx, 01010101b } } // CHECK-LABEL: define dso_local i64 @f_s8() // CHECK: %[[r:[^ ]*]] = call i64 asm sideeffect inteldialect "mov eax, $$16843009\0A\09mov edx, $$85", "=&A,{{.*}}" // CHECK: store i64 %[[r]], ptr %{{.*}} // CHECK: %[[r_i64:[^ ]*]] = load i64, ptr %{{.*}} // CHECK: ret i64 %[[r_i64]] } // extern "C" int main() { __asm xor eax, eax } // CHECK-LABEL: define dso_local noundef i32 @main() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "xor eax, eax", "=&{eax},{{.*}}" // CHECK: ret i32 %[[r]]