1; RUN: llvm-ml -m64 -filetype=s %s /Fo - | FileCheck %s
2
3.data
4
5x1 DWORD ?
6x2 DWORD ?
7xa1 DWORD ?
8
9.code
10
11SubstitutionMacro macro a1:req, a2:=<7>
12  mov eax, a1
13  mov eax, a1&
14  mov eax, &a1
15  mov eax, &a1&
16
17  mov eax, xa1
18  mov eax, x&a1
19  mov eax, x&a1&
20
21  mov eax, a2
22  mov eax, a2&
23  mov eax, &a2
24  mov eax, &a2&
25endm
26
27substitution_test_with_default PROC
28; CHECK-LABEL: substitution_test_with_default:
29
30  SubstitutionMacro 1
31; CHECK: mov eax, 1
32; CHECK-NEXT: mov eax, 1
33; CHECK-NEXT: mov eax, 1
34; CHECK-NEXT: mov eax, 1
35; CHECK: mov eax, dword ptr [rip + xa1]
36; CHECK-NEXT: mov eax, dword ptr [rip + x1]
37; CHECK-NEXT: mov eax, dword ptr [rip + x1]
38; CHECK: mov eax, 7
39; CHECK-NEXT: mov eax, 7
40; CHECK-NEXT: mov eax, 7
41; CHECK-NEXT: mov eax, 7
42
43  ret
44substitution_test_with_default ENDP
45
46substitution_test_with_value PROC
47; CHECK-LABEL: substitution_test_with_value:
48
49  SubstitutionMacro 2, 8
50; CHECK: mov eax, 2
51; CHECK-NEXT: mov eax, 2
52; CHECK-NEXT: mov eax, 2
53; CHECK-NEXT: mov eax, 2
54; CHECK: mov eax, dword ptr [rip + xa1]
55; CHECK-NEXT: mov eax, dword ptr [rip + x2]
56; CHECK-NEXT: mov eax, dword ptr [rip + x2]
57; CHECK: mov eax, 8
58; CHECK-NEXT: mov eax, 8
59; CHECK-NEXT: mov eax, 8
60; CHECK-NEXT: mov eax, 8
61
62  ret
63substitution_test_with_value ENDP
64
65substitution_test_lowercase PROC
66; CHECK-LABEL: substitution_test_lowercase:
67
68  substitutionmacro 2, 8
69; CHECK: mov eax, 2
70; CHECK-NEXT: mov eax, 2
71; CHECK-NEXT: mov eax, 2
72; CHECK-NEXT: mov eax, 2
73; CHECK: mov eax, dword ptr [rip + xa1]
74; CHECK-NEXT: mov eax, dword ptr [rip + x2]
75; CHECK-NEXT: mov eax, dword ptr [rip + x2]
76; CHECK: mov eax, 8
77; CHECK-NEXT: mov eax, 8
78; CHECK-NEXT: mov eax, 8
79; CHECK-NEXT: mov eax, 8
80
81  ret
82substitution_test_lowercase ENDP
83
84substitution_test_uppercase PROC
85; CHECK-LABEL: substitution_test_uppercase:
86
87  SUBSTITUTIONMACRO 2, 8
88; CHECK: mov eax, 2
89; CHECK-NEXT: mov eax, 2
90; CHECK-NEXT: mov eax, 2
91; CHECK-NEXT: mov eax, 2
92; CHECK: mov eax, dword ptr [rip + xa1]
93; CHECK-NEXT: mov eax, dword ptr [rip + x2]
94; CHECK-NEXT: mov eax, dword ptr [rip + x2]
95; CHECK: mov eax, 8
96; CHECK-NEXT: mov eax, 8
97; CHECK-NEXT: mov eax, 8
98; CHECK-NEXT: mov eax, 8
99
100  ret
101substitution_test_uppercase ENDP
102
103AmbiguousSubstitutionMacro MACRO x, y
104  x&y BYTE 0
105ENDM
106
107ambiguous_substitution_test PROC
108; CHECK-LABEL: ambiguous_substitution_test:
109
110; should expand to ab BYTE 0
111  AmbiguousSubstitutionMacro a, b
112
113; CHECK: ab:
114; CHECK-NOT: ay:
115; CHECK-NOT: xb:
116; CHECK-NOT: xy:
117ambiguous_substitution_test ENDP
118
119AmbiguousSubstitutionInStringMacro MACRO x, y
120  BYTE "x&y"
121ENDM
122
123ambiguous_substitution_in_string_test PROC
124; CHECK-LABEL: ambiguous_substitution_in_string_test:
125
126; should expand to BYTE "5y"
127  AmbiguousSubstitutionInStringMacro 5, 7
128
129; CHECK: .byte 53
130; CHECK-NEXT: .byte 121
131; CHECK-NOT: .byte
132ambiguous_substitution_in_string_test ENDP
133
134OptionalParameterMacro MACRO a1:req, a2
135  mov eax, a1
136IFNB <a2>
137  mov eax, a2
138ENDIF
139  ret
140ENDM
141
142optional_parameter_test PROC
143; CHECK-LABEL: optional_parameter_test:
144
145  OptionalParameterMacro 4
146; CHECK: mov eax, 4
147; CHECK: ret
148
149  OptionalParameterMacro 5, 9
150; CHECK: mov eax, 5
151; CHECK: mov eax, 9
152; CHECK: ret
153optional_parameter_test ENDP
154
155LocalSymbolMacro MACRO
156  LOCAL a
157a: ret
158   jmp a
159ENDM
160
161local_symbol_test PROC
162; CHECK-LABEL: local_symbol_test:
163
164  LocalSymbolMacro
165; CHECK: "??0000":
166; CHECK-NEXT: ret
167; CHECK-NEXT: jmp "??0000"
168
169  LocalSymbolMacro
170; CHECK: "??0001":
171; CHECK-NEXT: ret
172; CHECK-NEXT: jmp "??0001"
173local_symbol_test ENDP
174
175PURGE AmbiguousSubstitutionMacro, LocalSymbolMacro,
176      OptionalParameterMacro
177
178; Redefinition
179LocalSymbolMacro MACRO
180  LOCAL b
181b: xor eax, eax
182   jmp b
183ENDM
184
185purge_test PROC
186; CHECK-LABEL: purge_test:
187
188  LocalSymbolMacro
189; CHECK: "??0002":
190; CHECK-NEXT: xor eax, eax
191; CHECK-NEXT: jmp "??0002"
192purge_test ENDP
193
194END
195