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