On Wed, Jul 9, 2025 at 1:50 PM Chenghao Duan <duanchenghao@xxxxxxxxxx> wrote: > > Add branch jump function: > larch_insn_gen_beq > larch_insn_gen_bne > Please drop the period from subject line. The commit message is kind of vague... Maybe: LoongArch: Add larch_insn_gen_{beq,bne} helpers Add larch_insn_gen_beq() and larch_insn_gen_bne() helpers which will be used in BPF trampoline implementation. > Co-developed-by: George Guo <guodongtai@xxxxxxxxxx> > Signed-off-by: George Guo <guodongtai@xxxxxxxxxx> > Co-developed-by: Youling Tang <tangyouling@xxxxxxxxxx> > Signed-off-by: Youling Tang <tangyouling@xxxxxxxxxx> > Signed-off-by: Chenghao Duan <duanchenghao@xxxxxxxxxx> > --- > arch/loongarch/include/asm/inst.h | 2 ++ > arch/loongarch/kernel/inst.c | 28 ++++++++++++++++++++++++++++ > 2 files changed, 30 insertions(+) > > diff --git a/arch/loongarch/include/asm/inst.h b/arch/loongarch/include/asm/inst.h > index 3089785ca..2ae96a35d 100644 > --- a/arch/loongarch/include/asm/inst.h > +++ b/arch/loongarch/include/asm/inst.h > @@ -511,6 +511,8 @@ 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_jirl(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); > > static inline bool signed_imm_check(long val, unsigned int bit) > { > diff --git a/arch/loongarch/kernel/inst.c b/arch/loongarch/kernel/inst.c > index 14d7d700b..674e3b322 100644 > --- a/arch/loongarch/kernel/inst.c > +++ b/arch/loongarch/kernel/inst.c > @@ -336,3 +336,31 @@ u32 larch_insn_gen_jirl(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; > +} > -- > 2.43.0 >