Add some other common headers for basic LoongArch support. Reviewed-by: WANG Xuerui <git@xen0n.name> Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
118 lines
2.6 KiB
C
118 lines
2.6 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/types.h>
|
|
#include <asm/asm.h>
|
|
|
|
#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 */
|