Path: blob/master/tools/arch/loongarch/include/asm/inst.h
26288 views
/* SPDX-License-Identifier: GPL-2.0 */1/*2* Copyright (C) 2020-2022 Loongson Technology Corporation Limited3*/4#ifndef _ASM_INST_H5#define _ASM_INST_H67#include <linux/bitops.h>89#define LOONGARCH_INSN_NOP 0x034000001011enum reg0i15_op {12break_op = 0x54,13};1415enum reg0i26_op {16b_op = 0x14,17bl_op = 0x15,18};1920enum reg1i21_op {21beqz_op = 0x10,22bnez_op = 0x11,23bceqz_op = 0x12, /* bits[9:8] = 0x00 */24bcnez_op = 0x12, /* bits[9:8] = 0x01 */25};2627enum reg2_op {28ertn_op = 0x1920e,29};3031enum reg2i12_op {32addid_op = 0x0b,33andi_op = 0x0d,34ldd_op = 0xa3,35std_op = 0xa7,36};3738enum reg2i14_op {39ldptrd_op = 0x26,40stptrd_op = 0x27,41};4243enum reg2i16_op {44jirl_op = 0x13,45beq_op = 0x16,46bne_op = 0x17,47blt_op = 0x18,48bge_op = 0x19,49bltu_op = 0x1a,50bgeu_op = 0x1b,51};5253struct reg0i15_format {54unsigned int immediate : 15;55unsigned int opcode : 17;56};5758struct reg0i26_format {59unsigned int immediate_h : 10;60unsigned int immediate_l : 16;61unsigned int opcode : 6;62};6364struct reg1i21_format {65unsigned int immediate_h : 5;66unsigned int rj : 5;67unsigned int immediate_l : 16;68unsigned int opcode : 6;69};7071struct reg2_format {72unsigned int rd : 5;73unsigned int rj : 5;74unsigned int opcode : 22;75};7677struct reg2i12_format {78unsigned int rd : 5;79unsigned int rj : 5;80unsigned int immediate : 12;81unsigned int opcode : 10;82};8384struct reg2i14_format {85unsigned int rd : 5;86unsigned int rj : 5;87unsigned int immediate : 14;88unsigned int opcode : 8;89};9091struct reg2i16_format {92unsigned int rd : 5;93unsigned int rj : 5;94unsigned int immediate : 16;95unsigned int opcode : 6;96};9798union loongarch_instruction {99unsigned int word;100struct reg0i15_format reg0i15_format;101struct reg0i26_format reg0i26_format;102struct reg1i21_format reg1i21_format;103struct reg2_format reg2_format;104struct reg2i12_format reg2i12_format;105struct reg2i14_format reg2i14_format;106struct reg2i16_format reg2i16_format;107};108109#define LOONGARCH_INSN_SIZE sizeof(union loongarch_instruction)110111enum loongarch_gpr {112LOONGARCH_GPR_ZERO = 0,113LOONGARCH_GPR_RA = 1,114LOONGARCH_GPR_TP = 2,115LOONGARCH_GPR_SP = 3,116LOONGARCH_GPR_A0 = 4, /* Reused as V0 for return value */117LOONGARCH_GPR_A1, /* Reused as V1 for return value */118LOONGARCH_GPR_A2,119LOONGARCH_GPR_A3,120LOONGARCH_GPR_A4,121LOONGARCH_GPR_A5,122LOONGARCH_GPR_A6,123LOONGARCH_GPR_A7,124LOONGARCH_GPR_T0 = 12,125LOONGARCH_GPR_T1,126LOONGARCH_GPR_T2,127LOONGARCH_GPR_T3,128LOONGARCH_GPR_T4,129LOONGARCH_GPR_T5,130LOONGARCH_GPR_T6,131LOONGARCH_GPR_T7,132LOONGARCH_GPR_T8,133LOONGARCH_GPR_FP = 22,134LOONGARCH_GPR_S0 = 23,135LOONGARCH_GPR_S1,136LOONGARCH_GPR_S2,137LOONGARCH_GPR_S3,138LOONGARCH_GPR_S4,139LOONGARCH_GPR_S5,140LOONGARCH_GPR_S6,141LOONGARCH_GPR_S7,142LOONGARCH_GPR_S8,143LOONGARCH_GPR_MAX144};145146#define DEF_EMIT_REG2I16_FORMAT(NAME, OP) \147static inline void emit_##NAME(union loongarch_instruction *insn, \148enum loongarch_gpr rj, \149enum loongarch_gpr rd, \150int offset) \151{ \152insn->reg2i16_format.opcode = OP; \153insn->reg2i16_format.immediate = offset; \154insn->reg2i16_format.rj = rj; \155insn->reg2i16_format.rd = rd; \156}157158DEF_EMIT_REG2I16_FORMAT(jirl, jirl_op)159160#endif /* _ASM_INST_H */161162163