@@ -671,8 +671,28 @@ static void* dasm_labels[zend_lb_MAX];
671
671
| brk #0 // TODO
672
672
|.endmacro
673
673
674
- |.macro LONG_OP_WITH_CONST, long_ins, op1_addr, lval
675
- | brk #0 // TODO
674
+ // Define LONG_CMP_WITH_CONST to replace LONG_OP_WITH_CONST in the x86 implementation.
675
+ // Note that the 'long_ins' in all use sites of LONG_OP_WITH_CONST are always 'cmp'.
676
+ // Note that this macro is different from LONG_CMP.
677
+ |.macro LONG_CMP_WITH_CONST, cmp_ins, op1_addr, lval, tmp_reg1, tmp_reg2
678
+ || if (Z_MODE(op1_addr) == IS_MEM_ZVAL) {
679
+ | SAFE_MEM_ACC_WITH_UOFFSET ldr, tmp_reg1, Rx(Z_REG(op1_addr)), Z_OFFSET(op1_addr), tmp_reg2
680
+ || if (lval >=0 && lval <= MAX_IMM12) {
681
+ | cmp_ins tmp_reg1, #lval
682
+ || } else {
683
+ | LOAD_64BIT_VAL tmp_reg2, lval
684
+ | cmp_ins tmp_reg1, tmp_reg2
685
+ || }
686
+ || } else if (Z_MODE(op1_addr) == IS_REG) {
687
+ || if (lval >=0 && lval <= MAX_IMM12) {
688
+ | cmp_ins Rx(Z_REG(op1_addr)), #lval
689
+ || } else {
690
+ | LOAD_64BIT_VAL tmp_reg1, lval
691
+ | cmp_ins Rx(Z_REG(op1_addr)), tmp_reg1
692
+ || }
693
+ || } else {
694
+ || ZEND_UNREACHABLE();
695
+ || }
676
696
|.endmacro
677
697
678
698
|.macro GET_ZVAL_LVAL, reg, addr, tmp_reg
@@ -895,9 +915,11 @@ static void* dasm_labels[zend_lb_MAX];
895
915
| IF_NOT_TYPE tmp_reg, val, label
896
916
|.endmacro
897
917
898
- |.macro CMP_ZVAL_TYPE, addr, val
918
+ |.macro CMP_ZVAL_TYPE, addr, val, tmp_reg1, tmp_reg2
899
919
|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL);
900
- | cmp byte [Ra(Z_REG(addr))+Z_OFFSET(addr)+offsetof(zval, u1.v.type)], val
920
+ || ZEND_ASSERT(val <= MAX_IMM12);
921
+ | SAFE_MEM_ACC_WITH_UOFFSET ldrb, tmp_reg1, Rx(Z_REG(addr)), Z_OFFSET(addr)+offsetof(zval, u1.v.type), tmp_reg2
922
+ | cmp tmp_reg1, #val
901
923
|.endmacro
902
924
903
925
|.macro IF_ZVAL_TYPE, addr, val, label, tmp_reg1, tmp_reg2
@@ -4218,7 +4240,7 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
4218
4240
}
4219
4241
swap = 1;
4220
4242
} else if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_MODE(op2_addr) != IS_CONST_ZVAL) {
4221
- | brk #0 // TODO
4243
+ | LONG_CMP_WITH_CONST cmp, op2_addr, Z_LVAL_P(Z_ZV(op1_addr)), TMP1, TMP2
4222
4244
swap = 1;
4223
4245
} else if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_MODE(op1_addr) != IS_CONST_ZVAL) {
4224
4246
| brk #0 // TODO
@@ -4311,7 +4333,36 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
4311
4333
ZEND_UNREACHABLE();
4312
4334
}
4313
4335
} else {
4314
- | brk #0 // TODO
4336
+ switch (opline->opcode) {
4337
+ case ZEND_IS_EQUAL:
4338
+ case ZEND_IS_IDENTICAL:
4339
+ case ZEND_CASE:
4340
+ case ZEND_CASE_STRICT:
4341
+ | brk #0 // TODO
4342
+ break;
4343
+ case ZEND_IS_NOT_EQUAL:
4344
+ case ZEND_IS_NOT_IDENTICAL:
4345
+ | brk #0 // TODO
4346
+ break;
4347
+ case ZEND_IS_SMALLER:
4348
+ if (swap) {
4349
+ | brk #0 // TODO
4350
+ } else {
4351
+ | brk #0 // TODO
4352
+ }
4353
+ break;
4354
+ case ZEND_IS_SMALLER_OR_EQUAL:
4355
+ if (swap) {
4356
+ | cset REG0w, ge
4357
+ } else {
4358
+ | brk #0 // TODO
4359
+ }
4360
+ break;
4361
+ default:
4362
+ ZEND_UNREACHABLE();
4363
+ }
4364
+ | add REG0w, REG0w, #2
4365
+ | SET_ZVAL_TYPE_INFO_FROM_REG res_addr, REG0w, TMP1
4315
4366
}
4316
4367
4317
4368
return 1;
@@ -4608,7 +4659,107 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_
4608
4659
bool set_delayed = 0;
4609
4660
bool jmp_done = 0;
4610
4661
4611
- | brk #0 // TODO
4662
+ if (branch_opcode == ZEND_BOOL) {
4663
+ set_bool = 1;
4664
+ } else if (branch_opcode == ZEND_BOOL_NOT) {
4665
+ set_bool = 1;
4666
+ set_bool_not = 1;
4667
+ } else if (branch_opcode == ZEND_JMPZ) {
4668
+ false_label = target_label;
4669
+ } else if (branch_opcode == ZEND_JMPNZ) {
4670
+ true_label = target_label;
4671
+ } else if (branch_opcode == ZEND_JMPZNZ) {
4672
+ true_label = target_label2;
4673
+ false_label = target_label;
4674
+ } else if (branch_opcode == ZEND_JMPZ_EX) {
4675
+ set_bool = 1;
4676
+ false_label = target_label;
4677
+ } else if (branch_opcode == ZEND_JMPNZ_EX) {
4678
+ set_bool = 1;
4679
+ true_label = target_label;
4680
+ } else {
4681
+ ZEND_UNREACHABLE();
4682
+ }
4683
+
4684
+ if (Z_MODE(op1_addr) == IS_CONST_ZVAL) {
4685
+ if (zend_is_true(Z_ZV(op1_addr))) {
4686
+ /* Always TRUE */
4687
+ | brk #0 // TODO
4688
+ } else {
4689
+ /* Always FALSE */
4690
+ | brk #0 // TODO
4691
+ }
4692
+ return 1;
4693
+ }
4694
+
4695
+ if (op1_info & MAY_BE_REF) {
4696
+ | brk #0 // TODO
4697
+ op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
4698
+ }
4699
+
4700
+ if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE)) {
4701
+ if (!(op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)-MAY_BE_TRUE))) {
4702
+ /* Always TRUE */
4703
+ | brk #0 // TODO
4704
+ } else {
4705
+ if (!(op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE)))) {
4706
+ /* Always FALSE */
4707
+ if (set_bool) {
4708
+ | brk #0 // TODO
4709
+ }
4710
+ } else {
4711
+ | CMP_ZVAL_TYPE op1_addr, IS_TRUE, TMP1w, TMP2
4712
+ if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) {
4713
+ | brk #0 // TODO
4714
+ }
4715
+ if (!(op1_info & MAY_BE_TRUE)) {
4716
+ /* It's FALSE */
4717
+ | brk #0 // TODO
4718
+ } else {
4719
+ if (exit_addr) {
4720
+ | brk #0 // TODO
4721
+ } else if (true_label != (uint32_t)-1 || false_label != (uint32_t)-1) {
4722
+ if (set_bool) {
4723
+ | brk #0 // TODO
4724
+ } else {
4725
+ if (true_label != (uint32_t)-1) {
4726
+ | brk #0 // TODO
4727
+ } else if (!(op1_info & (MAY_BE_UNDEF|MAY_BE_LONG))) {
4728
+ | bne =>false_label
4729
+ jmp_done = 1;
4730
+ } else {
4731
+ | brk #0 // TODO
4732
+ }
4733
+ }
4734
+ } else if (set_bool) {
4735
+ | brk #0 // TODO
4736
+ }
4737
+ }
4738
+ }
4739
+
4740
+ /* It's FALSE, but may be UNDEF */
4741
+ if (op1_info & MAY_BE_UNDEF) {
4742
+ | brk #0 // TODO
4743
+ }
4744
+
4745
+ if (!jmp_done) {
4746
+ | brk #0 // TODO
4747
+ }
4748
+ }
4749
+ }
4750
+
4751
+ if (op1_info & MAY_BE_LONG) {
4752
+ | brk #0 // TODO
4753
+ }
4754
+
4755
+ if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
4756
+ | brk #0 // TODO
4757
+ } else if (op1_info & (MAY_BE_ANY - (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG))) {
4758
+ | brk #0 // TODO
4759
+ }
4760
+
4761
+ |9:
4762
+
4612
4763
return 1;
4613
4764
}
4614
4765
@@ -7023,7 +7174,12 @@ static int zend_jit_verify_arg_type(dasm_State **Dst, const zend_op *opline, zen
7023
7174
|| ZEND_ASSERT(type_code <= MAX_IMM12);
7024
7175
| IF_NOT_ZVAL_TYPE res_addr, type_code, >1, TMP1w, TMP2
7025
7176
} else {
7026
- | brk #0 // TODO
7177
+ | mov REG2w, #1
7178
+ | SAFE_MEM_ACC_WITH_UOFFSET ldrb, REG1w, Rx(Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type), TMP1
7179
+ | lsl REG2w, REG2w, REG1w
7180
+ | LOAD_32BIT_VAL TMP1w, type_mask
7181
+ | tst REG2w, TMP1w
7182
+ | beq >1
7027
7183
}
7028
7184
7029
7185
|.cold_code
0 commit comments