@@ -267,6 +267,19 @@ static bool is_addsub_imm(u32 imm)
267
267
return !(imm & ~0xfff ) || !(imm & ~0xfff000 );
268
268
}
269
269
270
+ static inline void emit_a64_add_i (const bool is64 , const int dst , const int src ,
271
+ const int tmp , const s32 imm , struct jit_ctx * ctx )
272
+ {
273
+ if (is_addsub_imm (imm )) {
274
+ emit (A64_ADD_I (is64 , dst , src , imm ), ctx );
275
+ } else if (is_addsub_imm (- imm )) {
276
+ emit (A64_SUB_I (is64 , dst , src , - imm ), ctx );
277
+ } else {
278
+ emit_a64_mov_i (is64 , tmp , imm , ctx );
279
+ emit (A64_ADD (is64 , dst , src , tmp ), ctx );
280
+ }
281
+ }
282
+
270
283
/*
271
284
* There are 3 types of AArch64 LDR/STR (immediate) instruction:
272
285
* Post-index, Pre-index, Unsigned offset.
@@ -1144,14 +1157,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
1144
1157
/* dst = dst OP imm */
1145
1158
case BPF_ALU | BPF_ADD | BPF_K :
1146
1159
case BPF_ALU64 | BPF_ADD | BPF_K :
1147
- if (is_addsub_imm (imm )) {
1148
- emit (A64_ADD_I (is64 , dst , dst , imm ), ctx );
1149
- } else if (is_addsub_imm (- imm )) {
1150
- emit (A64_SUB_I (is64 , dst , dst , - imm ), ctx );
1151
- } else {
1152
- emit_a64_mov_i (is64 , tmp , imm , ctx );
1153
- emit (A64_ADD (is64 , dst , dst , tmp ), ctx );
1154
- }
1160
+ emit_a64_add_i (is64 , dst , dst , tmp , imm , ctx );
1155
1161
break ;
1156
1162
case BPF_ALU | BPF_SUB | BPF_K :
1157
1163
case BPF_ALU64 | BPF_SUB | BPF_K :
0 commit comments