|
| 1 | +#pragma once |
| 2 | + |
| 3 | +#define IMM(imm, t, b) (((imm) >> (b)) & ((1 << (t - b + 1)) - 1)) |
| 4 | + |
| 5 | +#define W_MOVK(sz, rd, imm, sft) MAKE_CODE32(inst, code, 0x72800000U | ((sz) << 31) | ((sft) << 21) | (((imm) & ((1U << 16) - 1)) << 5) | (rd)) |
| 6 | +#define W_MOVZ(sz, rd, imm, sft) MAKE_CODE32(inst, code, 0x52800000U | ((sz) << 31) | ((sft) << 21) | (((imm) & ((1U << 16) - 1)) << 5) | (rd)) |
| 7 | +#define W_MOVN(sz, rd, imm, sft) MAKE_CODE32(inst, code, 0x12800000U | ((sz) << 31) | ((sft) << 21) | (((imm) & ((1U << 16) - 1)) << 5) | (rd)) |
| 8 | + |
| 9 | +#define W_ADD_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x11000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 10 | +#define W_ADD_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x0b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 11 | +#define W_ADD_E(sz, rd, rn, rm, option, ov) MAKE_CODE32(inst, code, 0x4b200000U | ((sz) << 31) | ((rm) << 16) | ((option) << 13) | ((ov) << 10) | ((rn) << 5) | (rd)) |
| 12 | +#define W_ADDS_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x31000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 13 | +#define W_ADDS_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x2b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 14 | +#define W_SUB_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x51000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 15 | +#define W_SUB_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x4b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 16 | +#define W_SUBS_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x71000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 17 | +#define W_SUBS_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x6b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 18 | +#define W_SUB_E(sz, rd, rn, rm, option, ov) MAKE_CODE32(inst, code, 0x4b200000U | ((sz) << 31) | ((rm) << 16) | ((option) << 13) | ((ov) << 10) | ((rn) << 5) | (rd)) |
| 19 | +#define W_MADD(sz, rd, rn, rm, ra) MAKE_CODE32(inst, code, 0x1b000000U | ((sz) << 31) | ((rm) << 16) | ((ra) << 10) | ((rn) << 5) | (rd)) |
| 20 | +#define W_MSUB(sz, rd, rn, rm, ra) MAKE_CODE32(inst, code, 0x1b008000U | ((sz) << 31) | ((rm) << 16) | ((ra) << 10) | ((rn) << 5) | (rd)) |
| 21 | +#define W_SDIV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac00c00U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 22 | +#define W_UDIV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac00800U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 23 | +#define W_AND_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x0a000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 24 | +#define W_ORR_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x2a000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 25 | +#define W_EOR_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x4a000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 26 | +#define W_EON_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x4a200000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd)) |
| 27 | + |
| 28 | +#define W_LSLV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac02000U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 29 | +#define W_LSRV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac02400U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 30 | +#define W_ASRV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac02800U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 31 | + |
| 32 | +#define W_SBFM(sz, rd, sn, rn, immr, imms) MAKE_CODE32(inst, code, 0x13000000U | ((sz) << 31) | ((sn) << 22) | ((immr) << 16) | ((imms) << 10) | ((rn) << 5) | (rd)) |
| 33 | +#define W_UBFM(sz, rd, sn, rn, immr, imms) MAKE_CODE32(inst, code, 0x53000000U | ((sz) << 31) | ((sn) << 22) | ((immr) << 16) | ((imms) << 10) | ((rn) << 5) | (rd)) |
| 34 | + |
| 35 | +#define W_LDUR(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0x38400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt)) |
| 36 | +#define W_LDR_UIMM(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0x39400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt)) |
| 37 | +#define W_LDR(b, s, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0x38400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt)) |
| 38 | +#define W_STUR(b, rt, ofs, base) MAKE_CODE32(inst, code, 0x38000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt)) |
| 39 | +#define W_STR_UIMM(b, rt, ofs, base) MAKE_CODE32(inst, code, 0x39000000U | ((b) << 30) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt)) |
| 40 | +#define W_STR(b, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0x38000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt)) |
| 41 | +#define W_LDP(sz, rs1, rs2, ofs, base, prepost) MAKE_CODE32(inst, code, 0x28400000U | ((sz) << 31) | ((prepost) << 23) | (((((ofs) >> 3) & ((1U << 7) - 1))) << 15) | ((rs2) << 10) | ((base) << 5) | (rs1)) |
| 42 | +#define W_STP(sz, rs1, rs2, ofs, base, prepost) MAKE_CODE32(inst, code, 0x28000000U | ((sz) << 31) | ((prepost) << 23) | (((((ofs) >> 3) & ((1U << 7) - 1))) << 15) | ((rs2) << 10) | ((base) << 5) | (rs1)) |
| 43 | + |
| 44 | +#define W_LDR_R(sz, rt, base, rm, sz2, s, option) MAKE_CODE32(inst, code, 0xb8600800U | ((sz) << 30) | ((rm) << 16) | ((option) << 13) | ((s) << 12) | ((base) << 5) | (rt)) |
| 45 | +#define W_LDRB_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x38400000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt)) |
| 46 | +#define W_LDRSB_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x38c00000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt)) |
| 47 | +#define W_LDRH_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x78400000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt)) |
| 48 | +#define W_LDRSH_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x78c00000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt)) |
| 49 | +#define W_STR_R(sz, rt, base, rm, option) MAKE_CODE32(inst, code, 0xb8200800U | ((sz) << 30) | ((rm) << 16) | ((option) << 13) | ((base) << 5) | (rt)) |
| 50 | +#define W_STRB_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x38000000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt)) |
| 51 | +#define W_STRH_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x78000000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt)) |
| 52 | + |
| 53 | +#define W_ADRP(rd, imm) MAKE_CODE32(inst, code, 0x90000000U | (IMM(imm, 31, 30) << 29) | (IMM(imm, 29, 12) << 5) | (rd)) |
| 54 | + |
| 55 | +#define W_CSINC(sz, rd, rn, rm, cond) MAKE_CODE32(inst, code, 0x1a800400U | ((sz) << 31) | ((rm) << 16) | ((cond) << 12) | ((rn) << 5) | (rd)) |
| 56 | + |
| 57 | +#define W_B() MAKE_CODE32(inst, code, 0x14000000U) |
| 58 | +#define W_BR(rn) MAKE_CODE32(inst, code, 0xd61f0000U | ((rn) << 5)) |
| 59 | +#define W_BCC(cond) MAKE_CODE32(inst, code, 0x54000000U | (cond)) |
| 60 | + |
| 61 | +#define W_BL(offset) MAKE_CODE32(inst, code, 0x94000000U | ((offset) & ((1U << 26) - 1))) |
| 62 | +#define W_BLR(rn) MAKE_CODE32(inst, code, 0xd63f0000U | ((rn) << 5)) |
| 63 | +#define W_RET(rn) MAKE_CODE32(inst, code, 0xd65f0000U | ((rn) << 5)) |
| 64 | +#define W_SVC(imm) MAKE_CODE32(inst, code, 0xd4000001U | ((imm) << 5)) |
| 65 | + |
| 66 | +#define P_MOV(sz, rd, rs) W_ORR_S(sz, rd, ZERO, rs, 0) |
| 67 | +#define P_MOV_SP(sz, rd, rs) W_ADD_I(sz, rd, rs, 0) |
| 68 | +#define P_MUL(sz, rd, rn, rm) W_MADD(sz, rd, rn, rm, ZERO) |
| 69 | +#define P_CMP(sz, rm, rn) W_SUBS_S(sz, ZERO, rm, rn, 0) |
| 70 | +#define P_CMP_I(sz, rd, imm) W_SUBS_I(sz, ZERO, rd, imm) |
| 71 | +#define P_CMN(sz, rn, rm) W_ADDS_S(sz, ZERO, rn, rm, 0) |
| 72 | +#define P_CMN_I(sz, rd, imm) W_ADDS_I(sz, ZERO, rd, imm) |
| 73 | +#define P_LSL_I(sz, rd, rn, imm) W_UBFM(sz, opr1->reg.no, sz, opr2->reg.no, -(imm) & (63>>(1-(sz))), (63>>(1-(sz))) - (imm)) |
| 74 | +#define P_LSR_I(sz, rd, rn, imm) W_UBFM(sz, opr1->reg.no, sz, opr2->reg.no, imm, 63>>(1-(sz))) |
| 75 | +#define P_ASR_I(sz, rd, rn, imm) W_SBFM(sz, opr1->reg.no, sz, opr2->reg.no, imm, 63>>(1-(sz))) |
| 76 | +#define P_CSET(sz, rd, cond) W_CSINC(sz, rd, ZERO, ZERO, (cond) ^ 1) |
| 77 | + |
| 78 | +// FP instructions. |
| 79 | + |
| 80 | +#define F_LDUR(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0xbc400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt)) |
| 81 | +#define F_LDR_UIMM(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0xbd400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt)) |
| 82 | +#define F_LDR(b, s, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0xbc400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt)) |
| 83 | +#define F_STUR(b, rt, ofs, base) MAKE_CODE32(inst, code, 0xbc000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt)) |
| 84 | +#define F_STR_UIMM(b, rt, ofs, base) MAKE_CODE32(inst, code, 0xbd000000U | ((b) << 30) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt)) |
| 85 | +#define F_STR(b, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0xbc000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt)) |
| 86 | +#define F_LDP(b, rt, ru, base, ofs, prepost) MAKE_CODE32(inst, code, 0x2c400000U | ((b) << 30) | ((prepost) << 23) | ((((ofs) & ((1U << 10) - (1 << 3)))) << (15 - 3)) | ((ru) << 10) | ((base) << 5) | (rt)) |
| 87 | +#define F_STP(b, rt, ru, base, ofs, prepost) MAKE_CODE32(inst, code, 0x2c000000U | ((b) << 30) | ((prepost) << 23) | ((((ofs) & ((1U << 10) - (1 << 3)))) << (15 - 3)) | ((ru) << 10) | ((base) << 5) | (rt)) |
| 88 | + |
| 89 | +#define FMOV(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e204000U | ((sz) << 22) | ((rn) << 5) | (rd)) |
| 90 | +#define FADD(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e202800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 91 | +#define FSUB(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e203800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 92 | +#define FMUL(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e200800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 93 | +#define FDIV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e201800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd)) |
| 94 | +#define FCMP(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e602000U | ((sz) << 22) | ((rn) << 16) | ((rd) << 5)) |
| 95 | +#define FNEG(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e214000U | ((sz) << 22) | ((rn) << 5) | (rd)) |
| 96 | +#define FSQRT(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e21c000U | ((sz) << 22) | ((rn) << 5) | (rd)) |
| 97 | + |
| 98 | +#define SCVTF(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e220000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt)) |
| 99 | +#define UCVTF(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e230000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt)) |
| 100 | +#define FCVT(dsz, rt, rn) MAKE_CODE32(inst, code, 0x1e224000 | ((1 - (dsz)) << 22) | ((dsz) << 15) | ((rn) << 5) | (rt)) |
| 101 | +#define FCVTZS(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e380000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt)) |
| 102 | +#define FCVTZU(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e390000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt)) |
0 commit comments