@@ -227,6 +227,23 @@ static int logical_immediate_p (uint64_t value, uint32_t reg_size)
227
227
|| }
228
228
|.endmacro
229
229
230
+ // Extract the low 8 bits from 'src_reg' into 'dst_reg'. 0xff can be encoded as imm for 'and' instruction.
231
+ |.macro GET_LOW_8BITS, dst_reg, src_reg
232
+ | and dst_reg, src_reg, #0xff
233
+ |.endmacro
234
+
235
+ // Bitwise operation with constants. 'ins' can be and/orr/eor/ands. Operands are 32-bit.
236
+ |.macro BW_OP_32_WITH_CONST, ins, reg, op, val, tmp_reg
237
+ || if (val == 0) {
238
+ | ins reg, op, wzr
239
+ || } else if (logical_immediate_p((uint32_t)val, 32)) {
240
+ | ins reg, op, #val
241
+ || } else {
242
+ | LOAD_32BIT_VAL tmp_reg, val
243
+ | ins reg, op, tmp_reg
244
+ || }
245
+ |.endmacro
246
+
230
247
// Bitwise operation with constants. 'ins' can be and/orr/eor/ands. Operands are 64-bit.
231
248
|.macro BW_OP_64_WITH_CONST, ins, reg, op, val, tmp_reg
232
249
|| if (val == 0) {
@@ -8375,8 +8392,7 @@ static int zend_jit_push_call_frame(dasm_State **Dst, const zend_op *opline, con
8375
8392
| str TMP1w, EX:RX->This.u1.type_info
8376
8393
} else {
8377
8394
| ldr TMP1w, EX:RX->This.u1.type_info
8378
- | LOAD_32BIT_VAL TMP2w, (ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS)
8379
- | orr TMP1w, TMP1w, TMP2w
8395
+ | BW_OP_32_WITH_CONST orr, TMP1w, TMP1w, (ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS), TMP2w
8380
8396
| str TMP1w, EX:RX->This.u1.type_info
8381
8397
}
8382
8398
}
@@ -8396,16 +8412,14 @@ static int zend_jit_push_call_frame(dasm_State **Dst, const zend_op *opline, con
8396
8412
| // call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_CLOSURE |
8397
8413
| // (closure->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE);
8398
8414
| ldr REG2w, [REG0, #offsetof(zend_closure, func.common.fn_flags)]
8399
- | and REG2w, REG2w, #ZEND_ACC_FAKE_CLOSURE
8400
- | LOAD_32BIT_VAL TMP1w, (ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_CLOSURE)
8401
- | orr REG2w, REG2w, TMP1w
8415
+ | BW_OP_32_WITH_CONST and, REG2w, REG2w, ZEND_ACC_FAKE_CLOSURE, TMP1w
8416
+ | BW_OP_32_WITH_CONST orr, REG2w, REG2w, (ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_CLOSURE), TMP1w
8402
8417
| // if (Z_TYPE(closure->this_ptr) != IS_UNDEF) {
8403
8418
| ldrb TMP1w, [REG0, #offsetof(zend_closure, this_ptr.u1.v.type)]
8404
8419
| cmp TMP1w, #IS_UNDEF
8405
8420
| beq >1
8406
8421
| // call_info |= ZEND_CALL_HAS_THIS;
8407
- | LOAD_32BIT_VAL TMP1w, ZEND_CALL_HAS_THIS
8408
- | orr REG2w, REG2w, TMP1w
8422
+ | BW_OP_32_WITH_CONST orr, REG2w, REG2w, ZEND_CALL_HAS_THIS, TMP1w
8409
8423
| // object_or_called_scope = Z_OBJ(closure->this_ptr);
8410
8424
| ldr REG1, [REG0, #offsetof(zend_closure, this_ptr.value.ptr)]
8411
8425
|1:
@@ -9267,7 +9281,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
9267
9281
| mov FCARG1x, RX
9268
9282
}
9269
9283
| EXT_CALL zend_jit_deprecated_helper, REG0
9270
- | and RETVALw, RETVALw, #0xff
9284
+ | GET_LOW_8BITS RETVALw, RETVALw
9271
9285
| cmp RETVALw, #0 // Result is 0 on exception
9272
9286
| ldr REG0, EX:RX->func // reload
9273
9287
| bne >1
@@ -9561,7 +9575,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
9561
9575
| mov FCARG1x, RX
9562
9576
}
9563
9577
| EXT_CALL zend_jit_deprecated_helper, REG0
9564
- | and RETVALw, RETVALw, #0xff
9578
+ | GET_LOW_8BITS RETVALw, RETVALw
9565
9579
| cmp RETVALw, #0 // Result is 0 on exception
9566
9580
| ldr REG0, EX:RX->func // reload
9567
9581
| bne >1
@@ -9940,7 +9954,7 @@ static int zend_jit_send_var(dasm_State **Dst, const zend_op *opline, const zend
9940
9954
if (!exit_addr) {
9941
9955
return 0;
9942
9956
}
9943
- | and TMP1w, REG1w, #0xff
9957
+ | GET_LOW_8BITS TMP1w, REG1w
9944
9958
| cmp TMP1w, #IS_REFERENCE
9945
9959
| bne &exit_addr
9946
9960
}
@@ -9961,7 +9975,7 @@ static int zend_jit_send_var(dasm_State **Dst, const zend_op *opline, const zend
9961
9975
9962
9976
| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG1, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
9963
9977
if (op1_info & MAY_BE_REF) {
9964
- | and TMP1w, REG1w, #0xff
9978
+ | GET_LOW_8BITS TMP1w, REG1w
9965
9979
| cmp TMP1w, #IS_REFERENCE
9966
9980
| beq >7
9967
9981
}
@@ -10037,7 +10051,7 @@ static int zend_jit_send_var(dasm_State **Dst, const zend_op *opline, const zend
10037
10051
if (opline->opcode == ZEND_SEND_VAR_NO_REF) {
10038
10052
| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG1, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
10039
10053
if (op1_info & MAY_BE_REF) {
10040
- | and TMP1w, REG1w, #0xff
10054
+ | GET_LOW_8BITS TMP1w, REG1w
10041
10055
| cmp TMP1w, #IS_REFERENCE
10042
10056
| beq >7
10043
10057
}
@@ -10121,12 +10135,12 @@ static int zend_jit_check_func_arg(dasm_State **Dst, const zend_op *opline)
10121
10135
| // ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
10122
10136
|| if (reuse_ip) {
10123
10137
| ldr TMP1w, [RX, #offsetof(zend_execute_data, This.u1.type_info)]
10124
- | orr TMP1w, TMP1w, # ZEND_CALL_SEND_ARG_BY_REF
10138
+ | BW_OP_32_WITH_CONST orr, TMP1w, TMP1w, ZEND_CALL_SEND_ARG_BY_REF, TMP2w
10125
10139
| str TMP1w, [RX, #offsetof(zend_execute_data, This.u1.type_info)]
10126
10140
|| } else {
10127
10141
| ldr REG0, EX->call
10128
10142
| ldr TMP1w, [REG0, #offsetof(zend_execute_data, This.u1.type_info)]
10129
- | orr TMP1w, TMP1w, # ZEND_CALL_SEND_ARG_BY_REF
10143
+ | BW_OP_32_WITH_CONST orr, TMP1w, TMP1w, ZEND_CALL_SEND_ARG_BY_REF, TMP2w
10130
10144
| str TMP1w, [REG0, #offsetof(zend_execute_data, This.u1.type_info)]
10131
10145
|| }
10132
10146
}
@@ -10136,12 +10150,12 @@ static int zend_jit_check_func_arg(dasm_State **Dst, const zend_op *opline)
10136
10150
| // ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
10137
10151
|| if (reuse_ip) {
10138
10152
| ldr TMP1w, [RX, #offsetof(zend_execute_data, This.u1.type_info)]
10139
- | and TMP1w, TMP1w, # (~ZEND_CALL_SEND_ARG_BY_REF)
10153
+ | BW_OP_32_WITH_CONST and, TMP1w, TMP1w, (~ZEND_CALL_SEND_ARG_BY_REF), TMP2w
10140
10154
| str TMP1w, [RX, #offsetof(zend_execute_data, This.u1.type_info)]
10141
10155
|| } else {
10142
10156
| ldr REG0, EX->call
10143
10157
| ldr TMP1w, [REG0, #offsetof(zend_execute_data, This.u1.type_info)]
10144
- | and TMP1w, TMP1w, # (~ZEND_CALL_SEND_ARG_BY_REF)
10158
+ | BW_OP_32_WITH_CONST and, TMP1w, TMP1w, (~ZEND_CALL_SEND_ARG_BY_REF), TMP2w
10145
10159
| str TMP1w, [REG0, #offsetof(zend_execute_data, This.u1.type_info)]
10146
10160
|| }
10147
10161
}
@@ -10162,8 +10176,7 @@ static int zend_jit_check_func_arg(dasm_State **Dst, const zend_op *opline)
10162
10176
|1:
10163
10177
| // ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
10164
10178
| ldr TMP1w, [RX, #offsetof(zend_execute_data, This.u1.type_info)]
10165
- | LOAD_32BIT_VAL TMP2w, ZEND_CALL_SEND_ARG_BY_REF
10166
- | orr TMP1w, TMP1w, TMP2w
10179
+ | BW_OP_32_WITH_CONST orr, TMP1w, TMP1w, ZEND_CALL_SEND_ARG_BY_REF, TMP2w
10167
10180
| str TMP1w, [RX, #offsetof(zend_execute_data, This.u1.type_info)]
10168
10181
| b >1
10169
10182
|.code
@@ -11078,7 +11091,7 @@ static int zend_jit_zval_copy_deref(dasm_State **Dst, zend_jit_addr res_addr, ze
11078
11091
11079
11092
| GET_ZVAL_PTR REG1, val_addr, TMP1
11080
11093
| IF_NOT_REFCOUNTED REG2w, >2, TMP1w
11081
- | and TMP2w, REG2w, #0xff // TMP2w -> low 8 bits of REG2w
11094
+ | GET_LOW_8BITS TMP2w, REG2w
11082
11095
| IF_NOT_TYPE TMP2w, IS_REFERENCE, >1
11083
11096
| add REG1, REG1, #offsetof(zend_reference, val)
11084
11097
| GET_Z_TYPE_INFO REG2w, REG1
@@ -11372,7 +11385,7 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
11372
11385
| IF_NOT_ZVAL_TYPE val_addr, type, &res_exit_addr, TMP1w, TMP2
11373
11386
} else {
11374
11387
| GET_ZVAL_TYPE_INFO REG2w, val_addr, TMP1
11375
- | and TMP1w, REG2w, #0xff
11388
+ | GET_LOW_8BITS TMP1w, REG2w
11376
11389
| IF_NOT_TYPE TMP1w, type, &res_exit_addr
11377
11390
}
11378
11391
| // ZVAL_COPY
@@ -11929,7 +11942,7 @@ static int zend_jit_verify_arg_type(dasm_State **Dst, const zend_op *opline, zen
11929
11942
| mov REG0w, RETVALw
11930
11943
11931
11944
if (check_exception) {
11932
- | and REG0w, REG0w, #0xff
11945
+ | GET_LOW_8BITS REG0w, REG0w
11933
11946
| tst REG0w, REG0w
11934
11947
if (in_cold) {
11935
11948
| bne >1
@@ -12346,7 +12359,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
12346
12359
|.code
12347
12360
}
12348
12361
} else if (flags == ZEND_FETCH_REF) {
12349
- | and TMP1w, REG2w, #0xff
12362
+ | GET_LOW_8BITS TMP1w, REG2w
12350
12363
| IF_TYPE TMP1w, IS_REFERENCE, >1
12351
12364
if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) {
12352
12365
| LOAD_ADDR FCARG2x, prop_info
@@ -12428,7 +12441,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
12428
12441
type = concrete_type(res_info);
12429
12442
12430
12443
| // ZVAL_DEREF()
12431
- | and TMP1w, REG2w, #0xff
12444
+ | GET_LOW_8BITS TMP1w, REG2w
12432
12445
| IF_NOT_TYPE TMP1w, IS_REFERENCE, >1
12433
12446
| GET_Z_PTR REG0, REG0
12434
12447
| add REG0, REG0, #offsetof(zend_reference, val)
@@ -12438,7 +12451,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
12438
12451
} else {
12439
12452
| GET_ZVAL_TYPE_INFO REG2w, val_addr, TMP1
12440
12453
|1:
12441
- | and TMP1w, REG2w, #0xff
12454
+ | GET_LOW_8BITS TMP1w, REG2w
12442
12455
| IF_NOT_TYPE TMP1w, type, &exit_addr
12443
12456
}
12444
12457
| // ZVAL_COPY
0 commit comments