Commit 2425c9e0 authored by Hengqi Chen's avatar Hengqi Chen Committed by Huacai Chen

LoongArch: BPF: Support signed div instructions

Add support for signed div instructions.
Signed-off-by: default avatarHengqi Chen <hengqi.chen@gmail.com>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 9ddd2b8d
...@@ -553,20 +553,36 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment