| // 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 |