File: asm_gcc.d

package info (click to toggle)
ldc 1%3A1.30.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 59,248 kB
  • sloc: cpp: 61,598; ansic: 14,545; sh: 1,014; makefile: 972; asm: 510; objc: 135; exp: 48; python: 12
file content (77 lines) | stat: -rw-r--r-- 2,883 bytes parent folder | download
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
// 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]* {{(elementtype\(\[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_gcc13indirectInputFkZv
void indirectInput(uint eax)
{
    // CHECK-NEXT: %eax = alloca i32
    // CHECK-NEXT: store i32 %eax_arg, i32* %eax
    // CHECK-NEXT: call void asm sideeffect "movl %eax, $0", "*m,~{eax}"(i32* {{(elementtype\(i32\) )?}}%eax), !srcloc
    asm { "movl %%eax, %0" : : "m" (eax) : "eax"; }
}

// 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); }
}