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>

authored by Hengqi Chen and committed by Huacai Chen 2425c9e0 9ddd2b8d

Changed files
+25 -9
arch
loongarch
net
+25 -9
arch/loongarch/net/bpf_jit.c
··· 553 /* dst = dst / src */ 554 case BPF_ALU | BPF_DIV | BPF_X: 555 case BPF_ALU64 | BPF_DIV | BPF_X: 556 - emit_zext_32(ctx, dst, is32); 557 - move_reg(ctx, t1, src); 558 - emit_zext_32(ctx, t1, is32); 559 - emit_insn(ctx, divdu, dst, dst, t1); 560 - emit_zext_32(ctx, dst, is32); 561 break; 562 563 /* dst = dst / imm */ 564 case BPF_ALU | BPF_DIV | BPF_K: 565 case BPF_ALU64 | BPF_DIV | BPF_K: 566 - move_imm(ctx, t1, imm, is32); 567 - emit_zext_32(ctx, dst, is32); 568 - emit_insn(ctx, divdu, dst, dst, t1); 569 - emit_zext_32(ctx, dst, is32); 570 break; 571 572 /* dst = dst % src */
··· 553 /* dst = dst / src */ 554 case BPF_ALU | BPF_DIV | BPF_X: 555 case BPF_ALU64 | BPF_DIV | BPF_X: 556 + if (!off) { 557 + emit_zext_32(ctx, dst, is32); 558 + move_reg(ctx, t1, src); 559 + emit_zext_32(ctx, t1, is32); 560 + emit_insn(ctx, divdu, dst, dst, t1); 561 + emit_zext_32(ctx, dst, is32); 562 + } else { 563 + emit_sext_32(ctx, dst, is32); 564 + move_reg(ctx, t1, src); 565 + emit_sext_32(ctx, t1, is32); 566 + emit_insn(ctx, divd, dst, dst, t1); 567 + emit_sext_32(ctx, dst, is32); 568 + } 569 break; 570 571 /* dst = dst / imm */ 572 case BPF_ALU | BPF_DIV | BPF_K: 573 case BPF_ALU64 | BPF_DIV | BPF_K: 574 + if (!off) { 575 + move_imm(ctx, t1, imm, is32); 576 + emit_zext_32(ctx, dst, is32); 577 + emit_insn(ctx, divdu, dst, dst, t1); 578 + emit_zext_32(ctx, dst, is32); 579 + } else { 580 + move_imm(ctx, t1, imm, false); 581 + emit_sext_32(ctx, t1, is32); 582 + emit_sext_32(ctx, dst, is32); 583 + emit_insn(ctx, divd, dst, dst, t1); 584 + emit_sext_32(ctx, dst, is32); 585 + } 586 break; 587 588 /* dst = dst % src */