LoongArch: Add larch_insn_gen_{beq,bne} helpers
authorChenghao Duan <duanchenghao@kylinos.cn>
Sun, 3 Aug 2025 14:49:50 +0000 (22:49 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Sun, 3 Aug 2025 14:49:50 +0000 (22:49 +0800)
Add larch_insn_gen_beq() and larch_insn_gen_bne() helpers which will be
used in BPF trampoline implementation.

Reviewed-by: Hengqi Chen <hengqi.chen@gmail.com>
Co-developed-by: George Guo <guodongtai@kylinos.cn>
Signed-off-by: George Guo <guodongtai@kylinos.cn>
Co-developed-by: Youling Tang <tangyouling@kylinos.cn>
Signed-off-by: Youling Tang <tangyouling@kylinos.cn>
Signed-off-by: Chenghao Duan <duanchenghao@kylinos.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/inst.h
arch/loongarch/kernel/inst.c

index 3089785ca97e78d49567b999a7f9ecc7dd9f7274..47d1905955876fde017bb98f0bd7807a92b1d671 100644 (file)
@@ -510,6 +510,8 @@ u32 larch_insn_gen_move(enum loongarch_gpr rd, enum loongarch_gpr rj);
 u32 larch_insn_gen_lu12iw(enum loongarch_gpr rd, int imm);
 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_beq(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
+u32 larch_insn_gen_bne(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
 u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
 
 static inline bool signed_imm_check(long val, unsigned int bit)
index 14d7d700bcb98ff3d666cc102e10a7be111313ca..e957b0f69688d8251399351eedaf997295d90f25 100644 (file)
@@ -323,6 +323,34 @@ u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
        return insn.word;
 }
 
+u32 larch_insn_gen_beq(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
+{
+       union loongarch_instruction insn;
+
+       if ((imm & 3) || imm < -SZ_128K || imm >= SZ_128K) {
+               pr_warn("The generated beq instruction is out of range.\n");
+               return INSN_BREAK;
+       }
+
+       emit_beq(&insn, rj, rd, imm >> 2);
+
+       return insn.word;
+}
+
+u32 larch_insn_gen_bne(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
+{
+       union loongarch_instruction insn;
+
+       if ((imm & 3) || imm < -SZ_128K || imm >= SZ_128K) {
+               pr_warn("The generated bne instruction is out of range.\n");
+               return INSN_BREAK;
+       }
+
+       emit_bne(&insn, rj, rd, imm >> 2);
+
+       return insn.word;
+}
+
 u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
 {
        union loongarch_instruction insn;