aboutsummaryrefslogtreecommitdiff
path: root/Asm/arm64/7zAsm.S
blob: 12e950b4c5734433849fb8f434e07fc404db05ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
// 7zAsm.S -- ASM macros for arm64
// 2021-04-25 : Igor Pavlov : Public domain

#define  r0 x0
#define  r1 x1
#define  r2 x2
#define  r3 x3
#define  r4 x4
#define  r5 x5
#define  r6 x6
#define  r7 x7
#define  r8 x8
#define  r9 x9
#define  r10 x10
#define  r11 x11
#define  r12 x12
#define  r13 x13
#define  r14 x14
#define  r15 x15
#define  r16 x16
#define  r17 x17
#define  r18 x18
#define  r19 x19
#define  r20 x20
#define  r21 x21
#define  r22 x22
#define  r23 x23
#define  r24 x24
#define  r25 x25
#define  r26 x26
#define  r27 x27
#define  r28 x28
#define  r29 x29
#define  r30 x30

#define  REG_ABI_PARAM_0 r0
#define  REG_ABI_PARAM_1 r1
#define  REG_ABI_PARAM_2 r2


.macro p2_add reg:req, param:req
        add     \reg, \reg, \param
.endm

.macro p2_sub reg:req, param:req
        sub     \reg, \reg, \param
.endm

.macro p2_sub_s reg:req, param:req
        subs    \reg, \reg, \param
.endm

.macro p2_and reg:req, param:req
        and     \reg, \reg, \param
.endm

.macro xor reg:req, param:req
        eor     \reg, \reg, \param
.endm

.macro or reg:req, param:req
        orr     \reg, \reg, \param
.endm

.macro shl reg:req, param:req
        lsl     \reg, \reg, \param
.endm

.macro shr reg:req, param:req
        lsr     \reg, \reg, \param
.endm

.macro sar reg:req, param:req
        asr     \reg, \reg, \param
.endm

.macro p1_neg reg:req
        neg     \reg, \reg
.endm

.macro dec reg:req
        sub     \reg, \reg, 1
.endm

.macro dec_s reg:req
        subs    \reg, \reg, 1
.endm

.macro inc reg:req
        add     \reg, \reg, 1
.endm

.macro inc_s reg:req
        adds    \reg, \reg, 1
.endm


.macro imul reg:req, param:req
        mul     \reg, \reg, \param
.endm

/*
arm64 and arm use reverted c flag after subs/cmp instructions:
  arm64-arm   :     x86
 b.lo / b.cc  :  jb  / jc
 b.hs / b.cs  :  jae / jnc
*/ 

.macro jmp lab:req
        b       \lab
.endm

.macro je lab:req
        b.eq    \lab
.endm

.macro jz lab:req
        b.eq    \lab
.endm

.macro jnz lab:req
        b.ne    \lab
.endm

.macro jne lab:req
        b.ne    \lab
.endm

.macro jb lab:req
        b.lo    \lab
.endm

.macro jbe lab:req
        b.ls    \lab
.endm

.macro ja lab:req
        b.hi    \lab
.endm

.macro jae lab:req
        b.hs    \lab
.endm


.macro cmove dest:req, srcTrue:req
        csel    \dest, \srcTrue, \dest, eq
.endm

.macro cmovne dest:req, srcTrue:req
        csel    \dest, \srcTrue, \dest, ne
.endm

.macro cmovs dest:req, srcTrue:req
        csel    \dest, \srcTrue, \dest, mi
.endm

.macro cmovns dest:req, srcTrue:req
        csel    \dest, \srcTrue, \dest, pl
.endm

.macro cmovb dest:req, srcTrue:req
        csel    \dest, \srcTrue, \dest, lo
.endm

.macro cmovae dest:req, srcTrue:req
        csel    \dest, \srcTrue, \dest, hs
.endm


.macro MY_ALIGN_16 macro
	.p2align 4,, (1 << 4) - 1
.endm

.macro MY_ALIGN_32 macro
        .p2align 5,, (1 << 5) - 1
.endm

.macro MY_ALIGN_64 macro
        .p2align 6,, (1 << 6) - 1
.endm