1; RUN: llvm-ml -m64 -filetype=asm %s | FileCheck %s
2
3.data
4
5x1 DWORD ?
6x2 DWORD ?
7xa1 DWORD ?
8
9.code
10
11substitution_macro 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  substitution_macro 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  substitution_macro 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
65ambiguous_substitution_macro MACRO x, y
66  x&y BYTE 0
67ENDM
68
69ambiguous_substitution_test PROC
70; CHECK-LABEL: ambiguous_substitution_test:
71
72; should expand to ab BYTE 0
73  ambiguous_substitution_macro a, b
74
75; CHECK: ab:
76; CHECK-NOT: ay:
77; CHECK-NOT: xb:
78; CHECK-NOT: xy:
79ambiguous_substitution_test ENDP
80
81ambiguous_substitution_in_string_macro MACRO x, y
82  BYTE "x&y"
83ENDM
84
85ambiguous_substitution_in_string_test PROC
86; CHECK-LABEL: ambiguous_substitution_in_string_test:
87
88; should expand to BYTE "5y"
89  ambiguous_substitution_in_string_macro 5, 7
90
91; CHECK: .byte 53
92; CHECK-NEXT: .byte 121
93; CHECK-NOT: .byte
94ambiguous_substitution_in_string_test ENDP
95
96optional_parameter_macro MACRO a1:req, a2
97  mov eax, a1
98IFNB <a2>
99  mov eax, a2
100ENDIF
101  ret
102ENDM
103
104optional_parameter_test PROC
105; CHECK-LABEL: optional_parameter_test:
106
107  optional_parameter_macro 4
108; CHECK: mov eax, 4
109; CHECK: ret
110
111  optional_parameter_macro 5, 9
112; CHECK: mov eax, 5
113; CHECK: mov eax, 9
114; CHECK: ret
115optional_parameter_test ENDP
116
117local_symbol_macro MACRO
118  LOCAL a
119a: ret
120   jmp a
121ENDM
122
123local_symbol_test PROC
124; CHECK-LABEL: local_symbol_test:
125
126  local_symbol_macro
127; CHECK: "??0000":
128; CHECK-NEXT: ret
129; CHECK-NEXT: jmp "??0000"
130
131  local_symbol_macro
132; CHECK: "??0001":
133; CHECK-NEXT: ret
134; CHECK-NEXT: jmp "??0001"
135local_symbol_test ENDP
136
137END
138