1; 7zAsm.asm -- ASM macros
2; 2021-12-25 : Igor Pavlov : Public domain
3
4
5ifdef @wordsize
6; @wordsize is defined only in JWASM and ASMC and is not defined in MASM
7; @wordsize eq 8 for 64-bit x64
8; @wordsize eq 2 for 32-bit x86
9if @wordsize eq 8
10  x64 equ 1
11endif
12else
13ifdef RAX
14  x64 equ 1
15endif
16endif
17
18
19ifdef x64
20  IS_X64 equ 1
21else
22  IS_X64 equ 0
23endif
24
25ifdef ABI_LINUX
26  IS_LINUX equ 1
27else
28  IS_LINUX equ 0
29endif
30
31ifndef x64
32; Use ABI_CDECL for x86 (32-bit) only
33; if ABI_CDECL is not defined, we use fastcall abi
34ifdef ABI_CDECL
35  IS_CDECL equ 1
36else
37  IS_CDECL equ 0
38endif
39endif
40
41OPTION PROLOGUE:NONE
42OPTION EPILOGUE:NONE
43
44MY_ASM_START macro
45  ifdef x64
46    .code
47  else
48    .386
49    .model flat
50    _TEXT$00 SEGMENT PARA PUBLIC 'CODE'
51  endif
52endm
53
54MY_PROC macro name:req, numParams:req
55  align 16
56  proc_numParams = numParams
57  if (IS_X64 gt 0)
58    proc_name equ name
59  elseif (IS_LINUX gt 0)
60    proc_name equ name
61  elseif (IS_CDECL gt 0)
62    proc_name equ @CatStr(_,name)
63  else
64    proc_name equ @CatStr(@,name,@, %numParams * 4)
65  endif
66  proc_name PROC
67endm
68
69MY_ENDP macro
70    if (IS_X64 gt 0)
71        ret
72    elseif (IS_CDECL gt 0)
73        ret
74    elseif (proc_numParams LT 3)
75        ret
76    else
77        ret (proc_numParams - 2) * 4
78    endif
79  proc_name ENDP
80endm
81
82
83ifdef x64
84  REG_SIZE equ 8
85  REG_LOGAR_SIZE equ 3
86else
87  REG_SIZE equ 4
88  REG_LOGAR_SIZE equ 2
89endif
90
91  x0 equ EAX
92  x1 equ ECX
93  x2 equ EDX
94  x3 equ EBX
95  x4 equ ESP
96  x5 equ EBP
97  x6 equ ESI
98  x7 equ EDI
99
100  x0_W equ AX
101  x1_W equ CX
102  x2_W equ DX
103  x3_W equ BX
104
105  x5_W equ BP
106  x6_W equ SI
107  x7_W equ DI
108
109  x0_L equ AL
110  x1_L equ CL
111  x2_L equ DL
112  x3_L equ BL
113
114  x0_H equ AH
115  x1_H equ CH
116  x2_H equ DH
117  x3_H equ BH
118
119ifdef x64
120  x5_L equ BPL
121  x6_L equ SIL
122  x7_L equ DIL
123
124  r0 equ RAX
125  r1 equ RCX
126  r2 equ RDX
127  r3 equ RBX
128  r4 equ RSP
129  r5 equ RBP
130  r6 equ RSI
131  r7 equ RDI
132  x8 equ r8d
133  x9 equ r9d
134  x10 equ r10d
135  x11 equ r11d
136  x12 equ r12d
137  x13 equ r13d
138  x14 equ r14d
139  x15 equ r15d
140else
141  r0 equ x0
142  r1 equ x1
143  r2 equ x2
144  r3 equ x3
145  r4 equ x4
146  r5 equ x5
147  r6 equ x6
148  r7 equ x7
149endif
150
151
152ifdef x64
153ifdef ABI_LINUX
154
155MY_PUSH_2_REGS macro
156    push    r3
157    push    r5
158endm
159
160MY_POP_2_REGS macro
161    pop     r5
162    pop     r3
163endm
164
165endif
166endif
167
168
169MY_PUSH_4_REGS macro
170    push    r3
171    push    r5
172    push    r6
173    push    r7
174endm
175
176MY_POP_4_REGS macro
177    pop     r7
178    pop     r6
179    pop     r5
180    pop     r3
181endm
182
183
184; for fastcall and for WIN-x64
185REG_PARAM_0_x   equ x1
186REG_PARAM_0     equ r1
187REG_PARAM_1_x   equ x2
188REG_PARAM_1     equ r2
189
190ifndef x64
191; for x86-fastcall
192
193REG_ABI_PARAM_0_x equ REG_PARAM_0_x
194REG_ABI_PARAM_0   equ REG_PARAM_0
195REG_ABI_PARAM_1_x equ REG_PARAM_1_x
196REG_ABI_PARAM_1   equ REG_PARAM_1
197
198else
199; x64
200
201if  (IS_LINUX eq 0)
202
203; for WIN-x64:
204REG_PARAM_2_x   equ x8
205REG_PARAM_2     equ r8
206REG_PARAM_3     equ r9
207
208REG_ABI_PARAM_0_x equ REG_PARAM_0_x
209REG_ABI_PARAM_0   equ REG_PARAM_0
210REG_ABI_PARAM_1_x equ REG_PARAM_1_x
211REG_ABI_PARAM_1   equ REG_PARAM_1
212REG_ABI_PARAM_2_x equ REG_PARAM_2_x
213REG_ABI_PARAM_2   equ REG_PARAM_2
214REG_ABI_PARAM_3   equ REG_PARAM_3
215
216else
217; for LINUX-x64:
218REG_LINUX_PARAM_0_x equ x7
219REG_LINUX_PARAM_0   equ r7
220REG_LINUX_PARAM_1_x equ x6
221REG_LINUX_PARAM_1   equ r6
222REG_LINUX_PARAM_2   equ r2
223REG_LINUX_PARAM_3   equ r1
224REG_LINUX_PARAM_4_x equ x8
225REG_LINUX_PARAM_4   equ r8
226REG_LINUX_PARAM_5   equ r9
227
228REG_ABI_PARAM_0_x equ REG_LINUX_PARAM_0_x
229REG_ABI_PARAM_0   equ REG_LINUX_PARAM_0
230REG_ABI_PARAM_1_x equ REG_LINUX_PARAM_1_x
231REG_ABI_PARAM_1   equ REG_LINUX_PARAM_1
232REG_ABI_PARAM_2   equ REG_LINUX_PARAM_2
233REG_ABI_PARAM_3   equ REG_LINUX_PARAM_3
234REG_ABI_PARAM_4_x equ REG_LINUX_PARAM_4_x
235REG_ABI_PARAM_4   equ REG_LINUX_PARAM_4
236REG_ABI_PARAM_5   equ REG_LINUX_PARAM_5
237
238MY_ABI_LINUX_TO_WIN_2 macro
239        mov     r2, r6
240        mov     r1, r7
241endm
242
243MY_ABI_LINUX_TO_WIN_3 macro
244        mov     r8, r2
245        mov     r2, r6
246        mov     r1, r7
247endm
248
249MY_ABI_LINUX_TO_WIN_4 macro
250        mov     r9, r1
251        mov     r8, r2
252        mov     r2, r6
253        mov     r1, r7
254endm
255
256endif ; IS_LINUX
257
258
259MY_PUSH_PRESERVED_ABI_REGS macro
260    if  (IS_LINUX gt 0)
261        MY_PUSH_2_REGS
262    else
263        MY_PUSH_4_REGS
264    endif
265        push    r12
266        push    r13
267        push    r14
268        push    r15
269endm
270
271
272MY_POP_PRESERVED_ABI_REGS macro
273        pop     r15
274        pop     r14
275        pop     r13
276        pop     r12
277    if  (IS_LINUX gt 0)
278        MY_POP_2_REGS
279    else
280        MY_POP_4_REGS
281    endif
282endm
283
284endif ; x64
285