@@ -330,18 +330,25 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context *
330
330
EMIT (PPC_RAW_SUB (dst_reg , dst_reg , src_reg ));
331
331
goto bpf_alu32_trunc ;
332
332
case BPF_ALU | BPF_ADD | BPF_K : /* (u32) dst += (u32) imm */
333
- case BPF_ALU | BPF_SUB | BPF_K : /* (u32) dst -= (u32) imm */
334
333
case BPF_ALU64 | BPF_ADD | BPF_K : /* dst += imm */
334
+ if (!imm ) {
335
+ goto bpf_alu32_trunc ;
336
+ } else if (imm >= -32768 && imm < 32768 ) {
337
+ EMIT (PPC_RAW_ADDI (dst_reg , dst_reg , IMM_L (imm )));
338
+ } else {
339
+ PPC_LI32 (b2p [TMP_REG_1 ], imm );
340
+ EMIT (PPC_RAW_ADD (dst_reg , dst_reg , b2p [TMP_REG_1 ]));
341
+ }
342
+ goto bpf_alu32_trunc ;
343
+ case BPF_ALU | BPF_SUB | BPF_K : /* (u32) dst -= (u32) imm */
335
344
case BPF_ALU64 | BPF_SUB | BPF_K : /* dst -= imm */
336
- if (BPF_OP (code ) == BPF_SUB )
337
- imm = - imm ;
338
- if (imm ) {
339
- if (imm >= -32768 && imm < 32768 )
340
- EMIT (PPC_RAW_ADDI (dst_reg , dst_reg , IMM_L (imm )));
341
- else {
342
- PPC_LI32 (b2p [TMP_REG_1 ], imm );
343
- EMIT (PPC_RAW_ADD (dst_reg , dst_reg , b2p [TMP_REG_1 ]));
344
- }
345
+ if (!imm ) {
346
+ goto bpf_alu32_trunc ;
347
+ } else if (imm > -32768 && imm <= 32768 ) {
348
+ EMIT (PPC_RAW_ADDI (dst_reg , dst_reg , IMM_L (- imm )));
349
+ } else {
350
+ PPC_LI32 (b2p [TMP_REG_1 ], imm );
351
+ EMIT (PPC_RAW_SUB (dst_reg , dst_reg , b2p [TMP_REG_1 ]));
345
352
}
346
353
goto bpf_alu32_trunc ;
347
354
case BPF_ALU | BPF_MUL | BPF_X : /* (u32) dst *= (u32) src */
0 commit comments