162 lines
3.1 KiB
C
162 lines
3.1 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||
|
/*
|
||
|
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||
|
*/
|
||
|
#ifndef _ASM_INST_H
|
||
|
#define _ASM_INST_H
|
||
|
|
||
|
#include <linux/bitops.h>
|
||
|
|
||
|
#define LOONGARCH_INSN_NOP 0x03400000
|
||
|
|
||
|
enum reg0i15_op {
|
||
|
break_op = 0x54,
|
||
|
};
|
||
|
|
||
|
enum reg0i26_op {
|
||
|
b_op = 0x14,
|
||
|
bl_op = 0x15,
|
||
|
};
|
||
|
|
||
|
enum reg1i21_op {
|
||
|
beqz_op = 0x10,
|
||
|
bnez_op = 0x11,
|
||
|
bceqz_op = 0x12, /* bits[9:8] = 0x00 */
|
||
|
bcnez_op = 0x12, /* bits[9:8] = 0x01 */
|
||
|
};
|
||
|
|
||
|
enum reg2_op {
|
||
|
ertn_op = 0x1920e,
|
||
|
};
|
||
|
|
||
|
enum reg2i12_op {
|
||
|
addid_op = 0x0b,
|
||
|
andi_op = 0x0d,
|
||
|
ldd_op = 0xa3,
|
||
|
std_op = 0xa7,
|
||
|
};
|
||
|
|
||
|
enum reg2i14_op {
|
||
|
ldptrd_op = 0x26,
|
||
|
stptrd_op = 0x27,
|
||
|
};
|
||
|
|
||
|
enum reg2i16_op {
|
||
|
jirl_op = 0x13,
|
||
|
beq_op = 0x16,
|
||
|
bne_op = 0x17,
|
||
|
blt_op = 0x18,
|
||
|
bge_op = 0x19,
|
||
|
bltu_op = 0x1a,
|
||
|
bgeu_op = 0x1b,
|
||
|
};
|
||
|
|
||
|
struct reg0i15_format {
|
||
|
unsigned int immediate : 15;
|
||
|
unsigned int opcode : 17;
|
||
|
};
|
||
|
|
||
|
struct reg0i26_format {
|
||
|
unsigned int immediate_h : 10;
|
||
|
unsigned int immediate_l : 16;
|
||
|
unsigned int opcode : 6;
|
||
|
};
|
||
|
|
||
|
struct reg1i21_format {
|
||
|
unsigned int immediate_h : 5;
|
||
|
unsigned int rj : 5;
|
||
|
unsigned int immediate_l : 16;
|
||
|
unsigned int opcode : 6;
|
||
|
};
|
||
|
|
||
|
struct reg2_format {
|
||
|
unsigned int rd : 5;
|
||
|
unsigned int rj : 5;
|
||
|
unsigned int opcode : 22;
|
||
|
};
|
||
|
|
||
|
struct reg2i12_format {
|
||
|
unsigned int rd : 5;
|
||
|
unsigned int rj : 5;
|
||
|
unsigned int immediate : 12;
|
||
|
unsigned int opcode : 10;
|
||
|
};
|
||
|
|
||
|
struct reg2i14_format {
|
||
|
unsigned int rd : 5;
|
||
|
unsigned int rj : 5;
|
||
|
unsigned int immediate : 14;
|
||
|
unsigned int opcode : 8;
|
||
|
};
|
||
|
|
||
|
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 reg0i15_format reg0i15_format;
|
||
|
struct reg0i26_format reg0i26_format;
|
||
|
struct reg1i21_format reg1i21_format;
|
||
|
struct reg2_format reg2_format;
|
||
|
struct reg2i12_format reg2i12_format;
|
||
|
struct reg2i14_format reg2i14_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
|
||
|
};
|
||
|
|
||
|
#define DEF_EMIT_REG2I16_FORMAT(NAME, OP) \
|
||
|
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||
|
enum loongarch_gpr rj, \
|
||
|
enum loongarch_gpr rd, \
|
||
|
int offset) \
|
||
|
{ \
|
||
|
insn->reg2i16_format.opcode = OP; \
|
||
|
insn->reg2i16_format.immediate = offset; \
|
||
|
insn->reg2i16_format.rj = rj; \
|
||
|
insn->reg2i16_format.rd = rd; \
|
||
|
}
|
||
|
|
||
|
DEF_EMIT_REG2I16_FORMAT(jirl, jirl_op)
|
||
|
|
||
|
#endif /* _ASM_INST_H */
|