@@ -2383,28 +2383,17 @@ static int zend_jit_trace_exit_stub(dasm_State **Dst)
2383
2383
| add r4, 8*4+8*8 /* CPU regs + SSE regs */
2384
2384
|.endif
2385
2385
2386
- | // check for interrupt (try to avoid this ???)
2387
- | MEM_OP2_1_ZTS cmp, byte, executor_globals, vm_interrupt, 0, r0
2388
- | jne ->interrupt_handler
2386
+ | test eax, eax
2387
+ | jne >1
2389
2388
2390
2389
| // execute_data = EG(current_execute_data)
2391
2390
| MEM_OP2_2_ZTS mov, FP, aword, executor_globals, current_execute_data, r0
2392
- | test eax, eax
2393
- | jl ->trace_halt
2394
2391
| // opline = EX(opline)
2395
2392
| LOAD_OPLINE
2396
2393
2397
2394
if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) {
2398
- #if 1
2399
- //TODO: this doesn't work for exit from first instruction ???
2400
2395
| add r4, HYBRID_SPAD
2401
2396
| JMP_IP
2402
- #else
2403
- | mov r0, EX->func
2404
- | mov r1, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])]
2405
- | mov r1, aword [r1 + offsetof(zend_jit_op_array_trace_extension, offset)]
2406
- | jmp aword [IP + r1]
2407
- #endif
2408
2397
} else if (GCC_GLOBAL_REGS) {
2409
2398
| add r4, SPAD // stack alignment
2410
2399
| JMP_IP
@@ -2416,6 +2405,44 @@ static int zend_jit_trace_exit_stub(dasm_State **Dst)
2416
2405
| ret
2417
2406
}
2418
2407
2408
+ |1:
2409
+ | jl ->trace_halt
2410
+
2411
+ | // execute_data = EG(current_execute_data)
2412
+ | MEM_OP2_2_ZTS mov, FP, aword, executor_globals, current_execute_data, r0
2413
+ | // opline = EX(opline)
2414
+ | LOAD_OPLINE
2415
+
2416
+ | // check for interrupt (try to avoid this ???)
2417
+ | MEM_OP2_1_ZTS cmp, byte, executor_globals, vm_interrupt, 0, r0
2418
+ | jne ->interrupt_handler
2419
+
2420
+ if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) {
2421
+ | add r4, HYBRID_SPAD
2422
+ | mov r0, EX->func
2423
+ | mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])]
2424
+ | mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)]
2425
+ | jmp aword [IP + r0]
2426
+ } else if (GCC_GLOBAL_REGS) {
2427
+ | add r4, SPAD // stack alignment
2428
+ | mov r0, EX->func
2429
+ | mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])]
2430
+ | mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)]
2431
+ | jmp aword [IP + r0]
2432
+ } else {
2433
+ | mov IP, aword EX->opline
2434
+ | mov FCARG1a, FP
2435
+ | mov r0, EX->func
2436
+ | mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])]
2437
+ | mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)]
2438
+ | call aword [IP + r0]
2439
+ | mov FP, aword T2 // restore FP
2440
+ | mov RX, aword T3 // restore IP
2441
+ | add r4, NR_SPAD // stack alignment
2442
+ | mov r0, 1 // ZEND_VM_ENTER
2443
+ | ret
2444
+ }
2445
+
2419
2446
return 1;
2420
2447
}
2421
2448
0 commit comments