@@ -1247,26 +1247,30 @@ static int cmp_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
1247
1247
const struct bpf_insn * insn = & meta -> insn ;
1248
1248
u64 imm = insn -> imm ; /* sign extend */
1249
1249
const struct jmp_code_map * code ;
1250
+ enum alu_op alu_op , carry_op ;
1250
1251
u8 reg = insn -> dst_reg * 2 ;
1251
1252
swreg tmp_reg ;
1252
1253
1253
1254
code = nfp_jmp_code_get (meta );
1254
1255
if (!code )
1255
1256
return - EINVAL ;
1256
1257
1258
+ alu_op = meta -> jump_neg_op ? ALU_OP_ADD : ALU_OP_SUB ;
1259
+ carry_op = meta -> jump_neg_op ? ALU_OP_ADD_C : ALU_OP_SUB_C ;
1260
+
1257
1261
tmp_reg = ur_load_imm_any (nfp_prog , imm & ~0U , imm_b (nfp_prog ));
1258
1262
if (!code -> swap )
1259
- emit_alu (nfp_prog , reg_none (), reg_a (reg ), ALU_OP_SUB , tmp_reg );
1263
+ emit_alu (nfp_prog , reg_none (), reg_a (reg ), alu_op , tmp_reg );
1260
1264
else
1261
- emit_alu (nfp_prog , reg_none (), tmp_reg , ALU_OP_SUB , reg_a (reg ));
1265
+ emit_alu (nfp_prog , reg_none (), tmp_reg , alu_op , reg_a (reg ));
1262
1266
1263
1267
tmp_reg = ur_load_imm_any (nfp_prog , imm >> 32 , imm_b (nfp_prog ));
1264
1268
if (!code -> swap )
1265
1269
emit_alu (nfp_prog , reg_none (),
1266
- reg_a (reg + 1 ), ALU_OP_SUB_C , tmp_reg );
1270
+ reg_a (reg + 1 ), carry_op , tmp_reg );
1267
1271
else
1268
1272
emit_alu (nfp_prog , reg_none (),
1269
- tmp_reg , ALU_OP_SUB_C , reg_a (reg + 1 ));
1273
+ tmp_reg , carry_op , reg_a (reg + 1 ));
1270
1274
1271
1275
emit_br (nfp_prog , code -> br_mask , insn -> off , 0 );
1272
1276
@@ -2745,21 +2749,35 @@ static void nfp_bpf_opt_neg_add_sub(struct nfp_prog *nfp_prog)
2745
2749
continue ;
2746
2750
2747
2751
if (BPF_CLASS (insn .code ) != BPF_ALU &&
2748
- BPF_CLASS (insn .code ) != BPF_ALU64 )
2752
+ BPF_CLASS (insn .code ) != BPF_ALU64 &&
2753
+ BPF_CLASS (insn .code ) != BPF_JMP )
2749
2754
continue ;
2750
2755
if (BPF_SRC (insn .code ) != BPF_K )
2751
2756
continue ;
2752
2757
if (insn .imm >= 0 )
2753
2758
continue ;
2754
2759
2755
- if (BPF_OP (insn .code ) == BPF_ADD )
2756
- insn .code = BPF_CLASS (insn .code ) | BPF_SUB ;
2757
- else if (BPF_OP (insn .code ) == BPF_SUB )
2758
- insn .code = BPF_CLASS (insn .code ) | BPF_ADD ;
2759
- else
2760
- continue ;
2760
+ if (BPF_CLASS (insn .code ) == BPF_JMP ) {
2761
+ switch (BPF_OP (insn .code )) {
2762
+ case BPF_JGE :
2763
+ case BPF_JSGE :
2764
+ case BPF_JLT :
2765
+ case BPF_JSLT :
2766
+ meta -> jump_neg_op = true;
2767
+ break ;
2768
+ default :
2769
+ continue ;
2770
+ }
2771
+ } else {
2772
+ if (BPF_OP (insn .code ) == BPF_ADD )
2773
+ insn .code = BPF_CLASS (insn .code ) | BPF_SUB ;
2774
+ else if (BPF_OP (insn .code ) == BPF_SUB )
2775
+ insn .code = BPF_CLASS (insn .code ) | BPF_ADD ;
2776
+ else
2777
+ continue ;
2761
2778
2762
- meta -> insn .code = insn .code | BPF_K ;
2779
+ meta -> insn .code = insn .code | BPF_K ;
2780
+ }
2763
2781
2764
2782
meta -> insn .imm = - insn .imm ;
2765
2783
}
0 commit comments