/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2020-2022 Loongson Technology Corporation Limited */ #ifndef _ASM_INST_H #define _ASM_INST_H #include #include #define ADDR_IMMMASK_LU52ID 0xFFF0000000000000 #define ADDR_IMMMASK_LU32ID 0x000FFFFF00000000 #define ADDR_IMMMASK_ADDU16ID 0x00000000FFFF0000 #define ADDR_IMMSHIFT_LU52ID 52 #define ADDR_IMMSHIFT_LU32ID 32 #define ADDR_IMMSHIFT_ADDU16ID 16 #define ADDR_IMM(addr, INSN) ((addr & ADDR_IMMMASK_##INSN) >> ADDR_IMMSHIFT_##INSN) enum reg1i20_op { lu12iw_op = 0x0a, lu32id_op = 0x0b, }; enum reg2i12_op { lu52id_op = 0x0c, }; enum reg2i16_op { jirl_op = 0x13, }; struct reg0i26_format { unsigned int immediate_h : 10; unsigned int immediate_l : 16; unsigned int opcode : 6; }; struct reg1i20_format { unsigned int rd : 5; unsigned int immediate : 20; unsigned int opcode : 7; }; struct reg1i21_format { unsigned int immediate_h : 5; unsigned int rj : 5; unsigned int immediate_l : 16; unsigned int opcode : 6; }; struct reg2i12_format { unsigned int rd : 5; unsigned int rj : 5; unsigned int immediate : 12; unsigned int opcode : 10; }; struct reg2i16_format { unsigned int rd : 5; unsigned int rj : 5; unsigned int immediate : 16; unsigned int opcode : 6; }; union loongarch_instruction { unsigned int word; struct reg0i26_format reg0i26_format; struct reg1i20_format reg1i20_format; struct reg1i21_format reg1i21_format; struct reg2i12_format reg2i12_format; struct reg2i16_format reg2i16_format; }; #define LOONGARCH_INSN_SIZE sizeof(union loongarch_instruction) enum loongarch_gpr { LOONGARCH_GPR_ZERO = 0, LOONGARCH_GPR_RA = 1, LOONGARCH_GPR_TP = 2, LOONGARCH_GPR_SP = 3, LOONGARCH_GPR_A0 = 4, /* Reused as V0 for return value */ LOONGARCH_GPR_A1, /* Reused as V1 for return value */ LOONGARCH_GPR_A2, LOONGARCH_GPR_A3, LOONGARCH_GPR_A4, LOONGARCH_GPR_A5, LOONGARCH_GPR_A6, LOONGARCH_GPR_A7, LOONGARCH_GPR_T0 = 12, LOONGARCH_GPR_T1, LOONGARCH_GPR_T2, LOONGARCH_GPR_T3, LOONGARCH_GPR_T4, LOONGARCH_GPR_T5, LOONGARCH_GPR_T6, LOONGARCH_GPR_T7, LOONGARCH_GPR_T8, LOONGARCH_GPR_FP = 22, LOONGARCH_GPR_S0 = 23, LOONGARCH_GPR_S1, LOONGARCH_GPR_S2, LOONGARCH_GPR_S3, LOONGARCH_GPR_S4, LOONGARCH_GPR_S5, LOONGARCH_GPR_S6, LOONGARCH_GPR_S7, LOONGARCH_GPR_S8, LOONGARCH_GPR_MAX }; u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm); u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm); u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, unsigned long pc, unsigned long dest); #endif /* _ASM_INST_H */