ldc/tests/codegen/asm_gcc.d
2020-02-25 02:31:58 +01:00

68 lines
2.4 KiB
D

// REQUIRES: target_X86
// RUN: %ldc -mtriple=x86_64-linux-gnu -output-ll -of=%t.ll %s
// RUN: FileCheck %s < %t.ll
// CHECK: define void @_D7asm_gcc5cpuidFZv
void cpuid()
{
uint max_extended_cpuid;
// CHECK: %1 = call i32 asm sideeffect "cpuid", "={eax},{eax},~{ebx},~{ecx},~{edx}"(i32 -2147483648), !srcloc
// CHECK-NEXT: store i32 %1, i32* %max_extended_cpuid
asm { "cpuid" : "=eax" (max_extended_cpuid) : "eax" (0x8000_0000) : "ebx", "ecx", "edx"; }
}
// CHECK: define void @_D7asm_gcc14multipleOutputFZv
void multipleOutput()
{
// CHECK-NEXT: %r = alloca [4 x i32]
uint[4] r = void;
// CHECK-NEXT: %1 = getelementptr {{.*}} %r, i32 0, i64 0
// CHECK-NEXT: %2 = getelementptr {{.*}} %r, i32 0, i64 1
// CHECK-NEXT: %3 = getelementptr {{.*}} %r, i32 0, i64 2
// CHECK-NEXT: %4 = getelementptr {{.*}} %r, i32 0, i64 3
// CHECK-NEXT: %5 = call { i32, i32, i32, i32 } asm sideeffect "cpuid", "={eax},={ebx},={ecx},={edx},{eax}"(i32 2), !srcloc
// CHECK-NEXT: %6 = extractvalue { i32, i32, i32, i32 } %5, 0
// CHECK-NEXT: store i32 %6, i32* %1
// CHECK-NEXT: %7 = extractvalue { i32, i32, i32, i32 } %5, 1
// CHECK-NEXT: store i32 %7, i32* %2
// CHECK-NEXT: %8 = extractvalue { i32, i32, i32, i32 } %5, 2
// CHECK-NEXT: store i32 %8, i32* %3
// CHECK-NEXT: %9 = extractvalue { i32, i32, i32, i32 } %5, 3
// CHECK-NEXT: store i32 %9, i32* %4
asm { "cpuid" : "=eax" (r[0]), "=ebx" (r[1]), "=ecx" (r[2]), "=edx" (r[3]) : "eax" (2); }
}
// CHECK: define void @_D7asm_gcc14indirectOutputFkZv
void indirectOutput(uint eax)
{
// CHECK-NEXT: %eax = alloca i32
// CHECK-NEXT: %r = alloca [4 x i32]
// CHECK-NEXT: store i32 %eax_arg, i32* %eax
uint[4] r = void;
// CHECK-NEXT: %1 = load i32, i32* %eax
// CHECK-NEXT: call void asm sideeffect "cpuid
// CHECK-SAME: "=*m,{eax},~{eax},~{ebx},~{ecx},~{edx}"([4 x i32]* %r, i32 %1), !srcloc
asm
{
`cpuid
movl %%eax, %0
movl %%ebx, 4%0
movl %%ecx, 8%0
movl %%edx, 12%0`
: "=m" (r)
: "eax" (eax)
: "eax", "ebx", "ecx", "edx";
}
}
// CHECK: define void @_D7asm_gcc15specialNamesX86FZv
void specialNamesX86()
{
byte b;
short s;
int i;
long l;
// CHECK: = call { i8, i16, i32, i64 } asm sideeffect "nop", "={ax},={bx},={cx},={dx},{si},{di}"(i16 %1, i64 2), !srcloc
asm { "nop" : "=a" (b), "=b" (s), "=c" (i), "=d" (l) : "S" (short(1)), "D" (2L); }
}