mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
LoongArch: BPF: Support signed div instructions
Add support for signed div instructions. Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
parent
9ddd2b8d1a
commit
2425c9e002
|
|
@ -553,20 +553,36 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
|
||||||
/* dst = dst / src */
|
/* dst = dst / src */
|
||||||
case BPF_ALU | BPF_DIV | BPF_X:
|
case BPF_ALU | BPF_DIV | BPF_X:
|
||||||
case BPF_ALU64 | BPF_DIV | BPF_X:
|
case BPF_ALU64 | BPF_DIV | BPF_X:
|
||||||
emit_zext_32(ctx, dst, is32);
|
if (!off) {
|
||||||
move_reg(ctx, t1, src);
|
emit_zext_32(ctx, dst, is32);
|
||||||
emit_zext_32(ctx, t1, is32);
|
move_reg(ctx, t1, src);
|
||||||
emit_insn(ctx, divdu, dst, dst, t1);
|
emit_zext_32(ctx, t1, is32);
|
||||||
emit_zext_32(ctx, dst, is32);
|
emit_insn(ctx, divdu, dst, dst, t1);
|
||||||
|
emit_zext_32(ctx, dst, is32);
|
||||||
|
} else {
|
||||||
|
emit_sext_32(ctx, dst, is32);
|
||||||
|
move_reg(ctx, t1, src);
|
||||||
|
emit_sext_32(ctx, t1, is32);
|
||||||
|
emit_insn(ctx, divd, dst, dst, t1);
|
||||||
|
emit_sext_32(ctx, dst, is32);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* dst = dst / imm */
|
/* dst = dst / imm */
|
||||||
case BPF_ALU | BPF_DIV | BPF_K:
|
case BPF_ALU | BPF_DIV | BPF_K:
|
||||||
case BPF_ALU64 | BPF_DIV | BPF_K:
|
case BPF_ALU64 | BPF_DIV | BPF_K:
|
||||||
move_imm(ctx, t1, imm, is32);
|
if (!off) {
|
||||||
emit_zext_32(ctx, dst, is32);
|
move_imm(ctx, t1, imm, is32);
|
||||||
emit_insn(ctx, divdu, dst, dst, t1);
|
emit_zext_32(ctx, dst, is32);
|
||||||
emit_zext_32(ctx, dst, is32);
|
emit_insn(ctx, divdu, dst, dst, t1);
|
||||||
|
emit_zext_32(ctx, dst, is32);
|
||||||
|
} else {
|
||||||
|
move_imm(ctx, t1, imm, false);
|
||||||
|
emit_sext_32(ctx, t1, is32);
|
||||||
|
emit_sext_32(ctx, dst, is32);
|
||||||
|
emit_insn(ctx, divd, dst, dst, t1);
|
||||||
|
emit_sext_32(ctx, dst, is32);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* dst = dst % src */
|
/* dst = dst % src */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user