| ; RUN: llvm-ml -filetype=s %s /Fo - | FileCheck %s |
| |
| .code |
| |
| identity MACRO arg |
| exitm <arg> |
| endm |
| |
| argument_test PROC |
| ; CHECK-LABEL: argument_test: |
| |
| mov eax, identity(2) |
| ; CHECK: mov eax, 2 |
| |
| ret |
| argument_test ENDP |
| |
| argument_with_parens_test PROC |
| ; CHECK-LABEL: argument_with_parens_test: |
| |
| mov eax, identity((3)) |
| ; CHECK: mov eax, 3 |
| mov eax, identity(((4-1)-1)) |
| ; CHECK: mov eax, 2 |
| |
| ret |
| argument_with_parens_test ENDP |
| |
| offsetof MACRO structure, field |
| EXITM <structure.&field> |
| ENDM |
| |
| S1 STRUCT |
| W byte 0 |
| X byte 0 |
| Y byte 0 |
| S1 ENDS |
| |
| substitutions_test PROC |
| ; CHECK-LABEL: substitutions_test: |
| |
| mov eax, offsetof(S1, X) |
| ; CHECK: mov eax, 1 |
| mov eax, offsetof(S1, Y) |
| ; CHECK: mov eax, 2 |
| |
| ret |
| substitutions_test ENDP |
| |
| repeated_invocations_test PROC |
| ; CHECK-LABEL: repeated_invocations_test: |
| |
| mov eax, identity(identity(1)) |
| ; CHECK: mov eax, 1 |
| |
| ret |
| repeated_invocations_test ENDP |
| |
| factorial MACRO n |
| IF n LE 1 |
| EXITM <(1)> |
| ELSE |
| EXITM <(n)*factorial(n-1)> |
| ENDIF |
| ENDM |
| |
| ; NOTE: This version is more sensitive to unintentional end-of-statement tokens. |
| factorial2 MACRO n |
| IF n LE 1 |
| EXITM <(1)> |
| ELSE |
| EXITM <(n)*(factorial(n-1))> |
| ENDIF |
| ENDM |
| |
| string_recursive_test PROC |
| ; CHECK-LABEL: string_recursive_test: |
| |
| mov eax, factorial(5) |
| ; CHECK: mov eax, 120 |
| mov eax, factorial2(4) |
| ; CHECK: mov eax, 24 |
| mov eax, 11 + factorial(6) - 11 |
| ; CHECK: mov eax, 720 |
| |
| ret |
| string_recursive_test ENDP |
| |
| fibonacci MACRO n |
| IF n LE 2 |
| EXITM %1 |
| ELSE |
| EXITM %fibonacci(n-1)+fibonacci(n-2) |
| ENDIF |
| ENDM |
| |
| expr_recursive_test PROC |
| ; CHECK-LABEL: expr_recursive_test: |
| |
| mov eax, fibonacci(10) |
| ; CHECK: mov eax, 55 |
| |
| ret |
| expr_recursive_test ENDP |
| |
| custom_strcat MACRO arg1, arg2 |
| EXITM <arg1&arg2> |
| ENDM |
| |
| expand_as_directive_test custom_strcat(P, ROC) |
| ; CHECK-LABEL: expand_as_directive_test: |
| |
| ret |
| expand_as_directive_test ENDP |
| |
| end |