@ -592,10 +592,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
EMIT4 ( 0xb9080000 , dst_reg , src_reg ) ;
break ;
case BPF_ALU | BPF_ADD | BPF_K : /* dst = (u32) dst + (u32) imm */
if ( ! imm )
break ;
/* alfi %dst,imm */
EMIT6_IMM ( 0xc20b0000 , dst_reg , imm ) ;
if ( imm ! = 0 ) {
/* alfi %dst,imm */
EMIT6_IMM ( 0xc20b0000 , dst_reg , imm ) ;
}
EMIT_ZERO ( dst_reg ) ;
break ;
case BPF_ALU64 | BPF_ADD | BPF_K : /* dst = dst + imm */
@ -617,10 +617,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
EMIT4 ( 0xb9090000 , dst_reg , src_reg ) ;
break ;
case BPF_ALU | BPF_SUB | BPF_K : /* dst = (u32) dst - (u32) imm */
if ( ! imm )
break ;
/* alfi %dst,-imm */
EMIT6_IMM ( 0xc20b0000 , dst_reg , - imm ) ;
if ( imm ! = 0 ) {
/* alfi %dst,-imm */
EMIT6_IMM ( 0xc20b0000 , dst_reg , - imm ) ;
}
EMIT_ZERO ( dst_reg ) ;
break ;
case BPF_ALU64 | BPF_SUB | BPF_K : /* dst = dst - imm */
@ -647,10 +647,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
EMIT4 ( 0xb90c0000 , dst_reg , src_reg ) ;
break ;
case BPF_ALU | BPF_MUL | BPF_K : /* dst = (u32) dst * (u32) imm */
if ( imm = = 1 )
break ;
/* msfi %r5,imm */
EMIT6_IMM ( 0xc2010000 , dst_reg , imm ) ;
if ( imm ! = 1 ) {
/* msfi %r5,imm */
EMIT6_IMM ( 0xc2010000 , dst_reg , imm ) ;
}
EMIT_ZERO ( dst_reg ) ;
break ;
case BPF_ALU64 | BPF_MUL | BPF_K : /* dst = dst * imm */
@ -711,6 +711,8 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
if ( BPF_OP ( insn - > code ) = = BPF_MOD )
/* lhgi %dst,0 */
EMIT4_IMM ( 0xa7090000 , dst_reg , 0 ) ;
else
EMIT_ZERO ( dst_reg ) ;
break ;
}
/* lhi %w0,0 */
@ -803,10 +805,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
EMIT4 ( 0xb9820000 , dst_reg , src_reg ) ;
break ;
case BPF_ALU | BPF_XOR | BPF_K : /* dst = (u32) dst ^ (u32) imm */
if ( ! imm )
break ;
/* xilf %dst,imm */
EMIT6_IMM ( 0xc0070000 , dst_reg , imm ) ;
if ( imm ! = 0 ) {
/* xilf %dst,imm */
EMIT6_IMM ( 0xc0070000 , dst_reg , imm ) ;
}
EMIT_ZERO ( dst_reg ) ;
break ;
case BPF_ALU64 | BPF_XOR | BPF_K : /* dst = dst ^ imm */
@ -827,10 +829,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
EMIT6_DISP_LH ( 0xeb000000 , 0x000d , dst_reg , dst_reg , src_reg , 0 ) ;
break ;
case BPF_ALU | BPF_LSH | BPF_K : /* dst = (u32) dst << (u32) imm */
if ( imm = = 0 )
break ;
/* sll %dst,imm(%r0) */
EMIT4_DISP ( 0x89000000 , dst_reg , REG_0 , imm ) ;
if ( imm ! = 0 ) {
/* sll %dst,imm(%r0) */
EMIT4_DISP ( 0x89000000 , dst_reg , REG_0 , imm ) ;
}
EMIT_ZERO ( dst_reg ) ;
break ;
case BPF_ALU64 | BPF_LSH | BPF_K : /* dst = dst << imm */
@ -852,10 +854,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
EMIT6_DISP_LH ( 0xeb000000 , 0x000c , dst_reg , dst_reg , src_reg , 0 ) ;
break ;
case BPF_ALU | BPF_RSH | BPF_K : /* dst = (u32) dst >> (u32) imm */
if ( imm = = 0 )
break ;
/* srl %dst,imm(%r0) */
EMIT4_DISP ( 0x88000000 , dst_reg , REG_0 , imm ) ;
if ( imm ! = 0 ) {
/* srl %dst,imm(%r0) */
EMIT4_DISP ( 0x88000000 , dst_reg , REG_0 , imm ) ;
}
EMIT_ZERO ( dst_reg ) ;
break ;
case BPF_ALU64 | BPF_RSH | BPF_K : /* dst = dst >> imm */