9e052883 |
1 | // 7zAsm.S -- ASM macros for arm64\r |
2 | // 2021-04-25 : Igor Pavlov : Public domain\r |
3 | \r |
4 | #define r0 x0\r |
5 | #define r1 x1\r |
6 | #define r2 x2\r |
7 | #define r3 x3\r |
8 | #define r4 x4\r |
9 | #define r5 x5\r |
10 | #define r6 x6\r |
11 | #define r7 x7\r |
12 | #define r8 x8\r |
13 | #define r9 x9\r |
14 | #define r10 x10\r |
15 | #define r11 x11\r |
16 | #define r12 x12\r |
17 | #define r13 x13\r |
18 | #define r14 x14\r |
19 | #define r15 x15\r |
20 | #define r16 x16\r |
21 | #define r17 x17\r |
22 | #define r18 x18\r |
23 | #define r19 x19\r |
24 | #define r20 x20\r |
25 | #define r21 x21\r |
26 | #define r22 x22\r |
27 | #define r23 x23\r |
28 | #define r24 x24\r |
29 | #define r25 x25\r |
30 | #define r26 x26\r |
31 | #define r27 x27\r |
32 | #define r28 x28\r |
33 | #define r29 x29\r |
34 | #define r30 x30\r |
35 | \r |
36 | #define REG_ABI_PARAM_0 r0\r |
37 | #define REG_ABI_PARAM_1 r1\r |
38 | #define REG_ABI_PARAM_2 r2\r |
39 | \r |
40 | \r |
41 | .macro p2_add reg:req, param:req\r |
42 | add \reg, \reg, \param\r |
43 | .endm\r |
44 | \r |
45 | .macro p2_sub reg:req, param:req\r |
46 | sub \reg, \reg, \param\r |
47 | .endm\r |
48 | \r |
49 | .macro p2_sub_s reg:req, param:req\r |
50 | subs \reg, \reg, \param\r |
51 | .endm\r |
52 | \r |
53 | .macro p2_and reg:req, param:req\r |
54 | and \reg, \reg, \param\r |
55 | .endm\r |
56 | \r |
57 | .macro xor reg:req, param:req\r |
58 | eor \reg, \reg, \param\r |
59 | .endm\r |
60 | \r |
61 | .macro or reg:req, param:req\r |
62 | orr \reg, \reg, \param\r |
63 | .endm\r |
64 | \r |
65 | .macro shl reg:req, param:req\r |
66 | lsl \reg, \reg, \param\r |
67 | .endm\r |
68 | \r |
69 | .macro shr reg:req, param:req\r |
70 | lsr \reg, \reg, \param\r |
71 | .endm\r |
72 | \r |
73 | .macro sar reg:req, param:req\r |
74 | asr \reg, \reg, \param\r |
75 | .endm\r |
76 | \r |
77 | .macro p1_neg reg:req\r |
78 | neg \reg, \reg\r |
79 | .endm\r |
80 | \r |
81 | .macro dec reg:req\r |
82 | sub \reg, \reg, 1\r |
83 | .endm\r |
84 | \r |
85 | .macro dec_s reg:req\r |
86 | subs \reg, \reg, 1\r |
87 | .endm\r |
88 | \r |
89 | .macro inc reg:req\r |
90 | add \reg, \reg, 1\r |
91 | .endm\r |
92 | \r |
93 | .macro inc_s reg:req\r |
94 | adds \reg, \reg, 1\r |
95 | .endm\r |
96 | \r |
97 | \r |
98 | .macro imul reg:req, param:req\r |
99 | mul \reg, \reg, \param\r |
100 | .endm\r |
101 | \r |
102 | /*\r |
103 | arm64 and arm use reverted c flag after subs/cmp instructions:\r |
104 | arm64-arm : x86\r |
105 | b.lo / b.cc : jb / jc\r |
106 | b.hs / b.cs : jae / jnc\r |
107 | */ \r |
108 | \r |
109 | .macro jmp lab:req\r |
110 | b \lab\r |
111 | .endm\r |
112 | \r |
113 | .macro je lab:req\r |
114 | b.eq \lab\r |
115 | .endm\r |
116 | \r |
117 | .macro jz lab:req\r |
118 | b.eq \lab\r |
119 | .endm\r |
120 | \r |
121 | .macro jnz lab:req\r |
122 | b.ne \lab\r |
123 | .endm\r |
124 | \r |
125 | .macro jne lab:req\r |
126 | b.ne \lab\r |
127 | .endm\r |
128 | \r |
129 | .macro jb lab:req\r |
130 | b.lo \lab\r |
131 | .endm\r |
132 | \r |
133 | .macro jbe lab:req\r |
134 | b.ls \lab\r |
135 | .endm\r |
136 | \r |
137 | .macro ja lab:req\r |
138 | b.hi \lab\r |
139 | .endm\r |
140 | \r |
141 | .macro jae lab:req\r |
142 | b.hs \lab\r |
143 | .endm\r |
144 | \r |
145 | \r |
146 | .macro cmove dest:req, srcTrue:req\r |
147 | csel \dest, \srcTrue, \dest, eq\r |
148 | .endm\r |
149 | \r |
150 | .macro cmovne dest:req, srcTrue:req\r |
151 | csel \dest, \srcTrue, \dest, ne\r |
152 | .endm\r |
153 | \r |
154 | .macro cmovs dest:req, srcTrue:req\r |
155 | csel \dest, \srcTrue, \dest, mi\r |
156 | .endm\r |
157 | \r |
158 | .macro cmovns dest:req, srcTrue:req\r |
159 | csel \dest, \srcTrue, \dest, pl\r |
160 | .endm\r |
161 | \r |
162 | .macro cmovb dest:req, srcTrue:req\r |
163 | csel \dest, \srcTrue, \dest, lo\r |
164 | .endm\r |
165 | \r |
166 | .macro cmovae dest:req, srcTrue:req\r |
167 | csel \dest, \srcTrue, \dest, hs\r |
168 | .endm\r |
169 | \r |
170 | \r |
171 | .macro MY_ALIGN_16 macro\r |
172 | .p2align 4,, (1 << 4) - 1\r |
173 | .endm\r |
174 | \r |
175 | .macro MY_ALIGN_32 macro\r |
176 | .p2align 5,, (1 << 5) - 1\r |
177 | .endm\r |
178 | \r |
179 | .macro MY_ALIGN_64 macro\r |
180 | .p2align 6,, (1 << 6) - 1\r |
181 | .endm\r |