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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=i386-unknown-unknown %s -o - | FileCheck --check-prefix=X86 %s
; RUN: llc -mtriple=i386-unknown-unknown -relocation-model=pic %s -o -| FileCheck --check-prefix=X86PIC %s
; Tests come from clang/test/CodeGen/ms-inline-asm-variables.c
;
; int gVar;
; void t1() {
; __asm add eax, dword ptr gVar[eax]
; __asm add dword ptr [eax+gVar], eax
; __asm add ebx, dword ptr gVar[271 - 82 + 81 + ebx]
; __asm add dword ptr [ebx + gVar + 828], ebx
; gVar = 3;
; }
;
; void t2(void) {
; int lVar;
; __asm mov eax, dword ptr lVar[eax]
; __asm mov dword ptr [eax+lVar], eax
; __asm mov ebx, dword ptr lVar[271 - 82 + 81 + ebx]
; __asm mov dword ptr [ebx + lVar + 828], ebx
; __asm mov 5 + 8 + 13 + 21[lVar + ebx], eax
; lVar = 2;
; }
@gVar = global i32 0, align 4
; Function Attrs: noinline nounwind optnone uwtable
define void @t1() #0 {
; X86-LABEL: t1:
; X86: # %bb.0: # %entry
; X86-NEXT: pushl %ebp
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: .cfi_offset %ebp, -8
; X86-NEXT: movl %esp, %ebp
; X86-NEXT: .cfi_def_cfa_register %ebp
; X86-NEXT: pushl %ebx
; X86-NEXT: .cfi_offset %ebx, -12
; X86-NEXT: #APP
; X86-EMPTY:
; X86-NEXT: addl gVar(%eax), %eax
; X86-NEXT: addl %eax, gVar(%eax)
; X86-NEXT: addl gVar+270(%ebx), %ebx
; X86-NEXT: addl %ebx, gVar+828(%ebx)
; X86-EMPTY:
; X86-NEXT: #NO_APP
; X86-NEXT: movl $3, gVar
; X86-NEXT: popl %ebx
; X86-NEXT: popl %ebp
; X86-NEXT: .cfi_def_cfa %esp, 4
; X86-NEXT: retl
;
; X86PIC-LABEL: t1:
; X86PIC: # %bb.0: # %entry
; X86PIC-NEXT: pushl %ebp
; X86PIC-NEXT: .cfi_def_cfa_offset 8
; X86PIC-NEXT: .cfi_offset %ebp, -8
; X86PIC-NEXT: movl %esp, %ebp
; X86PIC-NEXT: .cfi_def_cfa_register %ebp
; X86PIC-NEXT: pushl %ebx
; X86PIC-NEXT: .cfi_offset %ebx, -12
; X86PIC-NEXT: calll .L0$pb
; X86PIC-NEXT: .L0$pb:
; X86PIC-NEXT: popl %ecx
; X86PIC-NEXT: .Ltmp0:
; X86PIC-NEXT: addl $_GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb), %ecx
; X86PIC-NEXT: movl gVar@GOT(%ecx), %edx
; X86PIC-NEXT: #APP
; X86PIC-EMPTY:
; X86PIC-NEXT: addl (%edx,%eax), %eax
; X86PIC-NEXT: addl %eax, (%edx,%eax)
; X86PIC-NEXT: addl 270(%edx,%ebx), %ebx
; X86PIC-NEXT: addl %ebx, 828(%edx,%ebx)
; X86PIC-EMPTY:
; X86PIC-NEXT: #NO_APP
; X86PIC-NEXT: movl gVar@GOT(%ecx), %eax
; X86PIC-NEXT: movl $3, (%eax)
; X86PIC-NEXT: popl %ebx
; X86PIC-NEXT: popl %ebp
; X86PIC-NEXT: .cfi_def_cfa %esp, 4
; X86PIC-NEXT: retl
entry:
call void asm sideeffect inteldialect "add eax, dword ptr $2[eax]\0A\09add dword ptr $0[eax], eax\0A\09add ebx, dword ptr $3[ebx + $$270]\0A\09add dword ptr $1[ebx + $$828], ebx", "=*m,=*m,*m,*m,~{eax},~{ebx},~{flags},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) @gVar, ptr elementtype(i32) @gVar, ptr elementtype(i32) @gVar, ptr elementtype(i32) @gVar)
store i32 3, ptr @gVar, align 4
ret void
}
; Function Attrs: noinline nounwind optnone uwtable
define void @t2() #0 {
; X86-LABEL: t2:
; X86: # %bb.0: # %entry
; X86-NEXT: pushl %ebp
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: .cfi_offset %ebp, -8
; X86-NEXT: movl %esp, %ebp
; X86-NEXT: .cfi_def_cfa_register %ebp
; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %eax
; X86-NEXT: .cfi_offset %ebx, -12
; X86-NEXT: #APP
; X86-EMPTY:
; X86-NEXT: movl -8(%ebp,%eax), %eax
; X86-NEXT: movl %eax, -8(%ebp,%eax)
; X86-NEXT: movl 262(%ebp,%ebx), %ebx
; X86-NEXT: movl %ebx, 820(%ebp,%ebx)
; X86-NEXT: movl %eax, 39(%ebp,%ebx)
; X86-EMPTY:
; X86-NEXT: #NO_APP
; X86-NEXT: movl $2, -8(%ebp)
; X86-NEXT: addl $4, %esp
; X86-NEXT: popl %ebx
; X86-NEXT: popl %ebp
; X86-NEXT: .cfi_def_cfa %esp, 4
; X86-NEXT: retl
;
; X86PIC-LABEL: t2:
; X86PIC: # %bb.0: # %entry
; X86PIC-NEXT: pushl %ebp
; X86PIC-NEXT: .cfi_def_cfa_offset 8
; X86PIC-NEXT: .cfi_offset %ebp, -8
; X86PIC-NEXT: movl %esp, %ebp
; X86PIC-NEXT: .cfi_def_cfa_register %ebp
; X86PIC-NEXT: pushl %ebx
; X86PIC-NEXT: pushl %eax
; X86PIC-NEXT: .cfi_offset %ebx, -12
; X86PIC-NEXT: #APP
; X86PIC-EMPTY:
; X86PIC-NEXT: movl -8(%ebp,%eax), %eax
; X86PIC-NEXT: movl %eax, -8(%ebp,%eax)
; X86PIC-NEXT: movl 262(%ebp,%ebx), %ebx
; X86PIC-NEXT: movl %ebx, 820(%ebp,%ebx)
; X86PIC-NEXT: movl %eax, 39(%ebp,%ebx)
; X86PIC-EMPTY:
; X86PIC-NEXT: #NO_APP
; X86PIC-NEXT: movl $2, -8(%ebp)
; X86PIC-NEXT: addl $4, %esp
; X86PIC-NEXT: popl %ebx
; X86PIC-NEXT: popl %ebp
; X86PIC-NEXT: .cfi_def_cfa %esp, 4
; X86PIC-NEXT: retl
entry:
%lVar = alloca i32, align 4
call void asm sideeffect inteldialect "mov eax, dword ptr $3[eax]\0A\09mov dword ptr $0[eax], eax\0A\09mov ebx, dword ptr $4[ebx + $$270]\0A\09mov dword ptr $1[ebx + $$828], ebx\0A\09mov $2[ebx + $$47], eax", "=*m,=*m,=*m,*m,*m,~{eax},~{ebx},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %lVar, ptr elementtype(i32) %lVar, ptr elementtype(i32) %lVar, ptr elementtype(i32) %lVar, ptr elementtype(i32) %lVar)
store i32 2, ptr %lVar, align 4
ret void
}
attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nounwind }
!llvm.module.flags = !{!0}
!0 = !{i32 1, !"NumRegisterParameters", i32 0}
|