diff --git a/ext/opcache/jit/zend_jit_x86.c b/ext/opcache/jit/zend_jit_x86.c new file mode 100644 index 00000000000..b14042dffdb --- /dev/null +++ b/ext/opcache/jit/zend_jit_x86.c @@ -0,0 +1,52252 @@ +/* +** This file has been pre-processed with DynASM. +** https://luajit.org/dynasm.html +** DynASM version 1.5.0, DynASM x64 version 1.5.0 +** DO NOT EDIT! The original file is in "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc". +*/ + +#line 1 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +/* + * +----------------------------------------------------------------------+ + * | Zend JIT | + * +----------------------------------------------------------------------+ + * | Copyright (c) The PHP Group | + * +----------------------------------------------------------------------+ + * | This source file is subject to version 3.01 of the PHP license, | + * | that is bundled with this package in the file LICENSE, and is | + * | available through the world-wide-web at the following url: | + * | https://www.php.net/license/3_01.txt | + * | If you did not receive a copy of the PHP license and are unable to | + * | obtain it through the world-wide-web, please send a note to | + * | license@php.net so we can mail you a copy immediately. | + * +----------------------------------------------------------------------+ + * | Authors: Dmitry Stogov | + * | Xinchen Hui | + * +----------------------------------------------------------------------+ + */ + +//|.if X64 + //|.arch x64 +#if DASM_VERSION != 10500 +#error "Version mismatch between DynASM and included encoding engine" +#endif +#line 22 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +//|.else + //|.arch x86 +//|.endif + +//|.if X64WIN + //|.define FP, r14 + //|.define IP, r15 + //|.define IPl, r15d + //|.define RX, r15 // the same as VM IP reused as a general purpose reg + //|.define CARG1, rcx // x64/POSIX C call arguments. + //|.define CARG2, rdx + //|.define CARG3, r8 + //|.define CARG4, r9 + //|.define CARG1d, ecx + //|.define CARG2d, edx + //|.define CARG3d, r8d + //|.define CARG4d, r9d + //|.define FCARG1a, CARG1 // Simulate x86 fastcall. + //|.define FCARG2a, CARG2 + //|.define FCARG1d, CARG1d + //|.define FCARG2d, CARG2d + //|.define SPAD, 0x58 // padding for CPU stack alignment + //|.define NR_SPAD, 0x58 // padding for CPU stack alignment + //|.define T3, [r4+0x50] // Used to store old value of IP + //|.define T2, [r4+0x48] // Used to store old value of FP + //|.define T1, [r4+0x40] + //|.define A6, [r4+0x28] // preallocated slot for 6-th argument + //|.define A5, [r4+0x20] // preallocated slot for 5-th argument +//|.elif X64 + //|.define FP, r14 + //|.define IP, r15 + //|.define IPl, r15d + //|.define RX, r15 // the same as VM IP reused as a general purpose reg + //|.define CARG1, rdi // x64/POSIX C call arguments. + //|.define CARG2, rsi + //|.define CARG3, rdx + //|.define CARG4, rcx + //|.define CARG5, r8 + //|.define CARG6, r9 + //|.define CARG1d, edi + //|.define CARG2d, esi + //|.define CARG3d, edx + //|.define CARG4d, ecx + //|.define CARG5d, r8d + //|.define CARG6d, r9d + //|.define FCARG1a, CARG1 // Simulate x86 fastcall. + //|.define FCARG2a, CARG2 + //|.define FCARG1d, CARG1d + //|.define FCARG2d, CARG2d + //|.define SPAD, 0x18 // padding for CPU stack alignment + //|.define NR_SPAD, 0x28 // padding for CPU stack alignment + //|.define T3, [r4+0x20] // Used to store old value of IP (CALL VM only) + //|.define T2, [r4+0x18] // Used to store old value of FP (CALL VM only) + //|.define T1, [r4] +//|.else + //|.define FP, esi + //|.define IP, edi + //|.define IPl, edi + //|.define RX, edi // the same as VM IP reused as a general purpose reg + //|.define FCARG1a, ecx // x86 fastcall arguments. + //|.define FCARG2a, edx + //|.define FCARG1d, ecx + //|.define FCARG2d, edx + //|.define SPAD, 0x1c // padding for CPU stack alignment + //|.define NR_SPAD, 0x1c // padding for CPU stack alignment + //|.define T3, [r4+0x18] // Used to store old value of IP (CALL VM only) + //|.define T2, [r4+0x14] // Used to store old value of FP (CALL VM only) + //|.define T1, [r4] + //|.define A4, [r4+0xC] // preallocated slots for arguments of "cdecl" functions (intersect with T1) + //|.define A3, [r4+0x8] + //|.define A2, [r4+0x4] + //|.define A1, [r4] +//|.endif + +//|.define HYBRID_SPAD, 16 // padding for stack alignment + +#ifdef _WIN64 +# define TMP_ZVAL_OFFSET 0x20 +#else +# define TMP_ZVAL_OFFSET 0 +#endif + +#define DASM_ALIGNMENT 16 + +/* According to x86 and x86_64 ABI, CPU stack has to be 16 byte aligned to + * guarantee proper alignment of 128-bit SSE data allocated on stack. + * With broken alignment any execution of SSE code, including calls to + * memcpy() and others, may lead to crash. + */ + +const char* zend_reg_name[] = { +#if defined(__x86_64__) || defined(_M_X64) + "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", + "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" +#else + "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" +#endif +}; + +/* Simulate x86 fastcall */ +#ifdef _WIN64 +# define ZREG_FCARG1 ZREG_RCX +# define ZREG_FCARG2 ZREG_RDX +#elif defined(__x86_64__) +# define ZREG_FCARG1 ZREG_RDI +# define ZREG_FCARG2 ZREG_RSI +#else +# define ZREG_FCARG1 ZREG_RCX +# define ZREG_FCARG2 ZREG_RDX +#endif + +//|.type EX, zend_execute_data, FP +#define Dt1(_V) (int)(ptrdiff_t)&(((zend_execute_data *)0)_V) +#line 137 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +//|.type OP, zend_op +#define Dt2(_V) (int)(ptrdiff_t)&(((zend_op *)0)_V) +#line 138 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +//|.type ZVAL, zval +#define Dt3(_V) (int)(ptrdiff_t)&(((zval *)0)_V) +#line 139 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +//|.actionlist dasm_actions +static const unsigned char dasm_actions[8641] = { + 77,139,190,233,255,248,10,255,77,137,190,233,255,100,255,72,139,4,37,237, + 255,72,139,4,37,8,0,0,0,72,139,128,233,72,139,128,233,255,198,128,233,0,100, + 255,128,184,233,0,15,132,244,247,255,232,243,255,72,199,192,237,255,72,184, + 237,237,255,252,255,208,255,248,1,255,76,137,252,247,255,72,131,184,233,0, + 15,132,244,247,255,248,1,100,255,76,139,176,233,255,72,131,196,16,255,65, + 252,255,39,255,72,139,135,233,252,255,32,255,72,131,196,24,255,76,139,116, + 36,24,76,139,124,36,32,72,131,196,40,72,199,192,1,0,0,0,195,255,248,11,255, + 252,233,243,255,252,255,224,255,76,139,116,36,24,76,139,124,36,32,72,131, + 196,40,133,192,15,140,244,247,72,199,192,1,0,0,0,248,1,195,255,248,12,100, + 255,72,139,128,233,252,246,128,233,235,15,132,244,247,139,128,233,65,199, + 132,253,6,233,237,248,1,252,233,244,11,255,248,13,65,252,246,135,233,235, + 15,132,244,247,65,139,135,233,65,199,132,253,6,233,237,248,1,65,252,246,135, + 233,235,15,132,244,255,65,139,135,233,76,1,252,240,255,64,252,246,128,253, + 240,11,233,235,15,133,244,247,254,1,64,252,246,128,253,240,11,233,235,15, + 132,244,250,255,72,139,184,253,240,3,233,131,47,1,255,15,133,244,249,255, + 15,133,244,250,255,73,199,134,233,237,255,72,184,237,237,73,137,134,233,255, + 252,233,244,250,255,248,3,255,64,128,184,253,240,11,233,235,15,133,244,247, + 255,72,139,184,253,240,3,233,248,1,255,252,247,71,4,237,15,133,244,250,255, + 252,233,244,250,254,0,248,4,255,248,9,65,252,246,135,233,235,15,132,244,255, + 65,139,135,233,76,1,252,240,255,248,9,252,233,244,11,255,248,14,100,255,76, + 139,184,233,65,252,246,135,233,235,15,132,244,247,65,139,135,233,65,199,132, + 253,6,233,237,248,1,65,252,246,135,233,235,15,132,244,255,65,139,135,233, + 76,1,252,240,255,248,15,65,139,190,233,255,252,247,199,237,15,133,244,247, + 255,76,137,252,246,76,139,116,36,24,76,139,124,36,32,72,131,196,40,255,248, + 16,255,65,128,191,233,235,15,132,244,251,100,255,76,137,184,233,248,5,255, + 76,139,60,37,237,255,76,139,60,37,8,0,0,0,77,139,191,233,77,139,191,233,255, + 77,141,191,233,255,77,141,191,233,77,137,190,233,255,77,137,190,233,252,233, + 244,11,255,76,137,252,255,255,73,139,190,233,255,72,137,184,233,248,5,255, + 76,139,116,36,24,76,139,124,36,32,72,131,196,40,72,199,192,2,0,0,0,195,255, + 248,17,77,139,190,233,65,128,191,233,235,15,132,244,247,100,255,76,137,184, + 233,248,1,255,248,18,73,139,134,233,139,136,233,65,199,132,253,15,233,237, + 77,59,190,233,15,132,244,247,73,139,142,233,73,137,143,233,77,137,190,233, + 248,1,73,137,199,139,184,233,255,65,128,191,233,235,15,133,244,255,65,139, + 135,233,76,1,252,240,255,248,19,255,252,233,244,20,255,248,20,255,248,21, + 255,252,233,244,22,255,248,22,255,248,23,255,252,233,244,24,255,248,24,72, + 131,252,236,8,73,139,134,233,128,184,233,235,15,132,244,247,139,128,233,65, + 199,132,253,6,233,237,248,1,72,49,252,255,255,72,199,198,237,255,72,190,237, + 237,255,72,131,196,8,195,255,248,25,73,139,134,233,72,49,252,255,255,72,99, + 144,233,72,139,20,16,72,129,194,239,255,248,26,77,139,190,233,255,72,199, + 199,237,255,72,191,237,237,255,252,233,244,13,255,248,27,77,139,190,233,255, + 248,28,73,139,134,233,139,128,233,65,199,132,253,6,233,237,72,49,252,255, + 255,248,29,0,0,0,0,0,0,252,240,63,255,248,30,255,248,31,255,72,252,255,0, + 73,139,134,233,73,139,150,233,72,139,128,233,72,252,255,130,233,252,255,160, + 233,255,248,32,102,199,2,236,76,137,252,247,255,76,137,252,254,255,73,139, + 182,233,255,252,243,15,30,252,250,255,73,139,134,233,72,139,136,233,72,139, + 145,233,102,129,42,238,15,142,244,32,255,76,137,252,250,255,73,139,150,233, + 255,72,43,144,233,255,72,193,252,250,2,252,255,164,253,17,233,255,248,33, + 255,248,34,255,248,35,102,199,2,236,76,137,252,247,255,133,192,15,140,244, + 247,100,255,73,139,134,233,72,139,136,233,72,139,137,233,73,139,148,253,15, + 233,102,129,42,238,15,142,244,35,65,252,255,36,15,255,248,36,255,248,37,255, + 248,38,255,248,39,255,72,131,196,24,77,49,252,255,195,255,76,139,116,36,24, + 76,139,124,36,32,72,131,196,40,72,199,192,252,255,252,255,252,255,252,255, + 195,255,248,40,72,129,252,236,239,76,137,188,253,36,233,76,137,156,253,36, + 233,76,137,148,253,36,233,76,137,140,253,36,233,76,137,132,253,36,233,72, + 137,188,253,36,233,72,137,180,253,36,233,72,137,148,253,36,233,72,137,140, + 253,36,233,72,137,132,253,36,233,72,139,188,253,36,233,72,137,230,252,242, + 68,15,17,188,253,36,233,252,242,68,15,17,180,253,36,233,252,242,68,15,17, + 172,253,36,233,252,242,68,15,17,164,253,36,233,252,242,68,15,17,156,253,36, + 233,252,242,68,15,17,148,253,36,233,255,252,242,68,15,17,140,253,36,233,252, + 242,68,15,17,132,253,36,233,252,242,15,17,188,253,36,233,252,242,15,17,180, + 253,36,233,252,242,15,17,172,253,36,233,252,242,15,17,164,253,36,233,252, + 242,15,17,156,253,36,233,252,242,15,17,148,253,36,233,252,242,15,17,140,253, + 36,233,252,242,15,17,132,253,36,233,255,72,129,196,239,255,133,192,15,133, + 244,247,255,248,1,15,140,244,39,255,128,184,233,0,15,133,244,10,255,73,139, + 134,233,72,139,128,233,72,139,128,233,65,252,255,36,7,255,72,131,196,24,73, + 139,134,233,72,139,128,233,72,139,128,233,65,252,255,36,7,255,77,139,190, + 233,76,137,252,247,73,139,134,233,72,139,128,233,72,139,128,233,65,252,255, + 20,7,133,192,15,140,244,39,76,139,116,36,24,76,139,124,36,32,72,131,196,40, + 72,199,192,1,0,0,0,195,255,248,41,255,106,235,252,235,235,255,106,235,72, + 129,4,253,36,239,252,233,244,40,255,248,42,88,255,72,131,196,24,65,252,255, + 39,255,76,137,252,247,73,139,6,76,139,116,36,24,76,139,124,36,32,72,131,196, + 40,252,255,32,255,248,43,72,131,252,236,8,255,248,44,72,131,252,236,8,255, + 248,45,72,131,252,236,8,255,248,46,72,131,252,236,8,255,248,47,72,131,252, + 236,8,255,204,255,250,15,255,72,131,252,236,16,255,72,131,252,236,24,255, + 72,131,252,236,40,76,137,116,36,24,76,137,124,36,32,73,137,252,254,255,73, + 199,135,233,0,0,0,0,255,73,139,134,233,73,137,135,233,255,73,129,199,239, + 255,73,129,134,233,239,255,73,199,199,237,255,73,191,237,237,255,73,191,237, + 237,77,137,190,233,255,128,184,233,0,255,15,133,243,255,252,233,244,10,254, + 0,128,184,233,0,15,132,245,252,233,243,255,252,233,245,255,72,131,184,233, + 0,15,133,244,11,255,72,131,184,233,0,15,133,244,12,255,80,100,255,199,128, + 233,237,88,255,72,139,4,240,131,37,237,255,72,139,4,240,131,37,8,0,0,0,72, + 139,128,253,240,131,240,3,233,72,139,128,253,240,131,240,3,233,255,64,199, + 128,253,240,11,233,237,255,249,254,0,128,184,233,0,15,132,243,252,233,243, + 255,252,233,244,41,255,76,137,252,247,73,139,134,233,72,139,128,233,72,139, + 128,233,65,252,255,20,7,255,72,199,192,2,0,0,0,255,65,128,190,233,235,15, + 133,243,255,65,128,190,233,235,15,131,243,255,72,49,192,240,131,240,35,255, + 72,184,240,34,237,237,255,72,199,192,240,35,237,255,72,137,192,240,131,240, + 35,255,252,247,135,233,237,15,132,243,255,252,247,135,233,237,15,133,243, + 255,72,139,12,37,237,255,72,139,12,37,8,0,0,0,72,139,137,233,72,139,137,233, + 255,72,131,185,233,0,15,133,244,11,255,76,139,177,233,255,73,129,252,255, + 239,15,132,244,39,255,77,133,252,255,15,132,244,39,255,133,192,15,140,244, + 39,255,252,233,244,39,255,65,129,252,255,239,255,65,129,190,233,239,255,76, + 137,252,247,76,139,116,36,24,76,139,124,36,32,72,131,196,40,255,15,133,245, + 255,232,244,42,255,15,132,245,232,244,42,255,72,137,128,253,240,131,240,3, + 233,255,196,225,120,40,192,240,133,240,45,255,64,15,40,192,240,132,240,52, + 255,196,225,252,251,17,128,253,240,133,240,5,233,255,252,242,64,15,17,128, + 253,240,132,240,20,233,255,197,252,251,16,4,240,132,37,237,255,252,242,64, + 15,16,4,240,140,37,237,255,197,252,251,16,0,240,132,255,252,242,64,15,16, + 0,240,140,255,196,225,123,16,128,253,240,133,240,13,233,255,252,242,64,15, + 16,128,253,240,132,240,20,233,255,64,252,246,128,253,240,11,233,235,15,132, + 244,248,255,72,139,128,253,240,3,233,131,0,1,248,2,255,252,233,244,41,248, + 1,255,72,199,192,240,35,0,0,0,0,255,72,199,128,253,240,3,233,0,0,0,0,255, + 64,199,128,253,240,11,233,0,0,224,195,255,64,199,128,253,240,11,233,0,0,0, + 128,255,72,199,192,240,35,252,255,252,255,252,255,252,255,255,72,199,128, + 253,240,3,233,252,255,252,255,252,255,252,255,255,64,199,128,253,240,11,233, + 252,255,252,255,252,255,127,255,64,199,128,253,240,11,233,0,0,224,67,255, + 64,252,246,128,253,240,11,233,235,15,132,244,247,255,72,139,136,253,240,3, + 233,131,1,1,248,1,255,64,139,128,253,240,131,240,19,233,255,64,137,128,253, + 240,131,240,19,233,255,132,252,237,15,132,244,247,255,131,2,1,248,1,255,252, + 247,128,233,237,15,132,244,247,72,137,199,255,64,128,184,253,240,11,233,235, + 15,133,244,248,255,72,129,128,253,240,3,233,239,255,72,129,192,240,35,239, + 255,72,129,168,253,240,3,233,239,255,72,129,232,240,35,239,255,15,128,243, + 255,15,128,244,247,255,72,137,192,240,35,255,72,137,128,253,240,3,233,255, + 252,233,244,249,254,0,64,128,184,253,240,11,233,235,15,133,244,248,191,237, + 255,72,141,184,253,240,3,233,255,72,137,199,240,131,255,128,191,233,235,15, + 133,244,248,72,139,63,72,131,191,233,0,15,132,244,247,255,72,141,176,253, + 240,3,233,255,72,137,198,240,131,255,72,49,252,246,255,252,233,244,249,248, + 1,72,141,191,233,248,2,255,132,228,15,132,244,247,255,197,252,251,240,160, + 88,5,240,132,244,29,255,252,242,64,15,88,5,240,140,244,29,255,197,252,251, + 240,160,92,5,240,132,244,29,255,252,242,64,15,92,5,240,140,244,29,255,72, + 141,132,253,240,131,0,240,68,240,36,233,255,72,1,192,240,131,240,35,255,72, + 193,224,240,35,235,255,72,193,232,240,35,235,255,72,141,128,253,240,131,240, + 3,233,255,72,41,192,240,131,240,35,255,72,15,175,192,240,132,240,36,255,72, + 9,192,240,131,240,35,255,72,33,192,240,131,240,35,255,72,184,240,34,237,237, + 72,1,192,240,131,240,35,255,72,3,128,253,240,131,240,3,233,255,72,184,240, + 34,237,237,72,41,192,240,131,240,35,255,72,43,128,253,240,131,240,3,233,255, + 72,184,240,34,237,237,72,15,175,192,240,132,240,36,255,72,105,192,240,131, + 240,35,239,255,72,15,175,128,253,240,132,240,4,233,255,72,184,240,34,237, + 237,72,9,192,240,131,240,35,255,72,129,200,240,35,239,255,72,11,128,253,240, + 131,240,3,233,255,72,184,240,34,237,237,72,33,192,240,131,240,35,255,72,129, + 224,240,35,239,255,72,35,128,253,240,131,240,3,233,255,72,184,240,34,237, + 237,72,49,192,240,131,240,35,255,72,129,252,240,240,35,239,255,72,51,128, + 253,240,131,240,3,233,255,15,129,243,255,15,129,244,247,255,102,72,15,110, + 192,240,132,240,36,255,196,225,120,240,160,87,192,240,133,240,45,255,64,15, + 87,192,240,132,240,52,255,196,225,120,240,160,87,192,240,133,240,45,196,225, + 252,251,240,160,42,192,240,133,240,37,255,64,15,87,192,240,132,240,52,252, + 242,72,15,42,192,240,132,240,36,255,196,225,120,240,160,87,192,240,133,240, + 45,196,225,252,251,240,160,42,128,253,240,133,240,5,233,255,64,15,87,192, + 240,132,240,52,252,242,72,15,42,128,253,240,132,240,4,233,255,196,225,123, + 240,160,88,192,240,133,240,45,255,196,225,123,240,160,92,192,240,133,240, + 45,255,196,225,123,240,160,89,192,240,133,240,45,255,196,225,123,240,160, + 94,192,240,133,240,45,255,252,242,64,15,88,192,240,132,240,52,255,252,242, + 64,15,92,192,240,132,240,52,255,252,242,64,15,89,192,240,132,240,52,255,252, + 242,64,15,94,192,240,132,240,52,255,252,233,244,248,254,0,197,252,251,240, + 160,88,4,240,132,37,237,255,72,185,237,237,197,252,251,240,160,88,1,240,132, + 255,196,225,123,240,160,88,128,253,240,133,240,13,233,255,197,252,251,240, + 160,92,4,240,132,37,237,255,72,185,237,237,197,252,251,240,160,92,1,240,132, + 255,196,225,123,240,160,92,128,253,240,133,240,13,233,255,197,252,251,240, + 160,89,4,240,132,37,237,255,72,185,237,237,197,252,251,240,160,89,1,240,132, + 255,196,225,123,240,160,89,128,253,240,133,240,13,233,255,197,252,251,240, + 160,94,4,240,132,37,237,255,72,185,237,237,197,252,251,240,160,94,1,240,132, + 255,196,225,123,240,160,94,128,253,240,133,240,13,233,255,252,242,64,15,88, + 4,240,140,37,237,255,72,185,237,237,252,242,64,15,88,1,240,140,255,252,242, + 64,15,88,128,253,240,132,240,20,233,255,252,242,64,15,92,4,240,140,37,237, + 255,72,185,237,237,252,242,64,15,92,1,240,140,255,252,242,64,15,92,128,253, + 240,132,240,20,233,255,252,242,64,15,89,4,240,140,37,237,255,72,185,237,237, + 252,242,64,15,89,1,240,140,255,252,242,64,15,89,128,253,240,132,240,20,233, + 255,252,242,64,15,94,4,240,140,37,237,255,72,185,237,237,252,242,64,15,94, + 1,240,140,255,252,242,64,15,94,128,253,240,132,240,20,233,255,72,184,237, + 237,197,252,251,240,160,88,0,240,132,255,72,184,237,237,197,252,251,240,160, + 92,0,240,132,255,72,184,237,237,197,252,251,240,160,89,0,240,132,255,72,184, + 237,237,197,252,251,240,160,94,0,240,132,255,72,184,237,237,252,242,64,15, + 88,0,240,140,255,72,184,237,237,252,242,64,15,92,0,240,140,255,72,184,237, + 237,252,242,64,15,89,0,240,140,255,72,184,237,237,252,242,64,15,94,0,240, + 140,255,64,128,184,253,240,11,233,235,15,133,244,249,255,64,128,184,253,240, + 11,233,235,15,133,244,252,255,64,128,184,253,240,11,233,235,15,133,244,247, + 254,1,252,233,244,251,254,0,252,233,244,251,255,248,6,255,72,199,194,237, + 255,72,186,237,237,255,72,141,144,253,240,3,233,255,72,137,194,240,131,255, + 72,131,184,233,0,15,133,244,14,255,252,233,244,5,254,0,72,137,198,255,252, + 233,244,26,255,72,129,252,249,239,15,131,244,247,254,1,248,1,72,131,252,249, + 0,72,199,192,240,35,0,0,0,0,15,143,244,247,255,252,233,244,26,254,0,72,211, + 224,240,35,248,1,255,72,193,252,248,240,35,235,255,248,1,72,131,252,249,0, + 72,199,193,237,15,143,244,247,255,248,1,72,211,252,248,240,35,255,252,233, + 244,27,255,72,137,4,36,255,72,137,4,240,131,36,255,72,153,72,252,247,252, + 248,240,35,255,72,139,4,36,255,72,139,4,240,131,36,255,72,131,184,253,240, + 3,233,0,255,72,133,192,240,131,240,35,255,15,132,244,247,254,1,252,233,244, + 27,254,0,72,131,184,253,240,3,233,252,255,255,72,131,252,248,240,35,252,255, + 255,72,153,255,72,252,247,184,253,240,3,233,255,252,247,135,233,237,15,132, + 244,250,255,139,135,233,255,72,133,192,255,72,129,252,248,239,255,72,57,252, + 240,255,15,134,243,255,15,134,244,255,255,15,134,244,253,255,15,134,244,248, + 255,72,139,135,233,255,72,129,192,239,255,72,137,252,240,72,193,224,4,72, + 3,135,233,255,15,132,244,255,255,252,233,244,255,255,128,184,233,235,15,133, + 244,254,255,128,184,233,235,15,132,243,255,128,184,233,235,15,132,244,253, + 255,128,184,233,235,15,132,244,248,255,252,233,244,253,255,252,233,244,248, + 255,232,244,19,255,232,244,20,255,64,199,128,253,240,11,233,237,252,233,244, + 255,255,248,2,248,4,255,15,133,244,254,252,233,243,254,0,252,233,244,254, + 255,128,190,233,235,15,142,244,247,254,1,252,233,244,247,254,0,15,132,244, + 248,254,1,232,244,21,255,232,244,22,255,128,184,233,235,15,133,244,247,72, + 139,0,72,129,192,239,248,1,255,128,184,233,235,255,15,142,243,255,15,143, + 243,255,15,142,244,255,255,15,133,244,254,252,233,244,255,255,72,133,192, + 15,133,244,254,252,233,244,255,255,72,199,128,253,240,3,233,237,255,72,184, + 240,34,237,237,64,131,128,253,240,11,233,1,255,131,4,37,237,1,255,72,184, + 240,34,237,237,64,131,128,253,240,11,233,2,255,131,4,37,237,2,255,64,128, + 184,253,240,11,233,235,15,132,244,247,254,1,72,137,60,36,255,72,184,240,34, + 237,237,73,137,134,253,240,131,233,255,72,133,192,15,132,244,12,255,72,139, + 60,36,255,252,233,244,249,255,128,186,233,235,15,133,244,247,72,139,18,72, + 129,194,239,248,1,255,72,139,144,253,240,3,233,131,42,1,255,132,228,15,132, + 244,249,255,64,252,247,192,240,43,237,15,132,244,249,255,252,233,244,249, + 248,2,255,132,228,15,132,244,248,255,64,252,247,192,240,43,237,15,132,244, + 248,255,72,139,128,253,240,131,240,3,233,64,131,128,253,240,11,233,1,248, + 2,255,72,137,215,255,72,49,252,246,49,210,72,49,201,77,49,192,255,132,252, + 246,15,132,244,247,255,64,131,128,253,240,11,233,1,248,1,255,64,131,128,253, + 240,11,233,2,248,1,255,72,131,191,233,0,15,133,244,248,254,1,72,131,184,233, + 0,15,132,244,254,252,233,244,11,255,64,128,184,253,240,11,233,235,15,132, + 243,255,72,139,52,37,237,255,72,139,52,37,8,0,0,0,72,139,182,233,72,139,182, + 233,255,72,141,182,233,232,244,43,252,233,244,255,254,0,232,244,44,255,232, + 244,43,255,232,244,45,255,232,244,46,255,232,244,47,255,248,9,255,64,128, + 184,253,240,11,233,235,15,133,244,249,72,139,184,253,240,3,233,255,72,141, + 135,253,240,131,233,248,3,255,248,4,252,247,71,4,237,15,133,244,254,255,248, + 8,100,255,64,252,246,128,253,240,11,233,235,15,132,244,251,255,72,139,184, + 253,240,3,233,131,47,1,252,247,71,4,237,15,133,244,251,255,72,139,128,253, + 240,131,240,3,233,64,131,168,253,240,11,233,1,255,248,8,255,128,191,233,235, + 15,133,244,247,72,139,55,128,190,233,235,15,133,244,248,72,141,190,233,252, + 233,244,249,254,1,72,133,192,72,137,199,15,133,244,247,252,233,244,12,254, + 0,64,128,184,253,240,11,233,235,15,133,244,253,255,131,56,1,15,134,244,248, + 255,248,2,72,137,199,255,131,63,1,255,15,135,244,247,254,1,64,252,246,128, + 253,240,11,233,235,15,132,244,247,131,47,1,248,1,255,64,199,128,253,240,11, + 233,237,72,137,199,255,64,128,184,253,240,11,233,235,15,143,244,253,255,72, + 141,182,233,255,72,133,192,15,132,244,247,254,1,232,244,23,255,232,244,24, + 255,248,7,255,64,128,184,253,240,11,233,235,15,143,244,248,255,64,199,128, + 253,240,11,233,237,72,137,199,252,233,244,6,248,2,255,72,49,201,255,72,199, + 193,237,255,72,185,237,237,255,72,141,136,253,240,3,233,255,72,137,193,240, + 131,255,128,184,233,235,15,133,243,255,128,184,233,235,15,133,244,247,72, + 139,56,72,131,191,233,0,15,133,244,248,72,141,135,233,254,1,128,191,233,235, + 15,133,244,247,72,139,63,72,131,191,233,0,15,133,244,248,72,129,199,239,254, + 1,72,184,237,237,72,57,192,240,35,255,72,129,252,248,240,35,239,255,72,59, + 128,253,240,131,240,3,233,255,72,57,192,240,131,240,35,255,72,184,237,237, + 72,57,128,253,240,3,233,255,72,129,184,253,240,3,233,239,255,15,148,208,255, + 15,149,208,255,15,159,208,255,15,156,208,255,15,157,208,255,15,158,208,255, + 15,182,192,141,128,233,255,64,137,128,253,240,11,233,255,15,132,245,255,15, + 142,245,255,15,141,243,255,15,141,245,255,15,140,243,255,15,140,245,255,15, + 143,245,255,15,182,192,131,192,2,255,15,133,243,15,138,243,255,15,133,245, + 15,138,245,255,15,138,244,247,255,15,138,244,247,15,132,245,248,1,255,15, + 134,245,255,15,131,243,15,138,243,255,15,131,245,15,138,245,255,15,130,243, + 255,15,130,245,255,15,135,243,15,138,243,255,15,135,245,15,138,245,255,15, + 138,244,247,15,132,243,248,1,255,15,135,243,255,15,135,245,255,15,131,245, + 255,64,199,128,253,240,11,233,237,15,133,245,15,138,245,255,64,199,128,253, + 240,11,233,237,15,132,245,248,1,255,64,199,128,253,240,11,233,237,15,134, + 245,255,64,199,128,253,240,11,233,237,15,131,245,15,138,245,255,64,199,128, + 253,240,11,233,237,15,130,245,255,64,199,128,253,240,11,233,237,15,135,245, + 15,138,245,255,15,151,208,15,182,192,141,128,233,255,64,137,128,253,240,11, + 233,15,135,245,255,64,199,128,253,240,11,233,237,15,130,245,248,1,255,15, + 147,208,15,182,192,141,128,233,255,64,137,128,253,240,11,233,15,131,245,255, + 64,199,128,253,240,11,233,237,15,134,245,248,1,255,15,138,244,247,184,237, + 15,132,244,248,248,1,184,237,248,2,255,15,151,208,15,182,192,131,192,2,255, + 15,138,244,247,184,237,15,130,244,248,248,1,184,237,248,2,255,15,147,208, + 15,182,192,131,192,2,255,15,138,244,247,184,237,15,134,244,248,248,1,184, + 237,248,2,255,197,252,249,46,4,240,132,37,237,255,102,64,15,46,4,240,140, + 37,237,255,197,252,249,46,0,240,132,255,102,64,15,46,0,240,140,255,196,225, + 121,46,128,253,240,133,240,13,233,255,102,64,15,46,128,253,240,132,240,20, + 233,255,196,225,121,46,192,240,133,240,45,255,102,64,15,46,192,240,132,240, + 52,255,64,128,184,253,240,11,233,235,15,133,244,250,255,64,128,184,253,240, + 11,233,235,15,133,244,255,255,64,128,184,253,240,11,233,235,15,133,244,249, + 254,1,252,233,244,252,254,0,64,128,184,253,240,11,233,235,15,133,244,251, + 255,252,233,244,252,255,128,191,233,235,15,133,244,247,72,199,199,237,255, + 72,139,60,37,237,255,72,139,60,37,8,0,0,0,72,139,191,233,72,139,191,233,255, + 72,141,191,233,248,1,255,64,128,184,253,240,11,233,235,15,133,244,247,72, + 137,60,36,72,199,199,237,255,72,139,60,36,100,255,72,141,182,233,252,233, + 244,248,248,1,255,128,191,233,235,15,132,244,247,254,1,72,141,191,233,252, + 233,244,247,254,0,128,190,233,235,15,132,244,247,254,1,72,137,60,36,191,237, + 255,72,141,182,233,252,233,244,247,254,0,128,191,233,235,15,133,244,247,72, + 139,63,72,129,199,239,248,1,255,128,190,233,235,15,133,244,247,72,139,54, + 72,129,198,239,248,1,255,128,190,233,235,255,128,191,233,235,255,132,192, + 255,15,182,192,255,252,247,216,141,128,233,255,64,128,184,253,240,11,233, + 235,255,15,140,244,255,255,15,148,208,15,182,192,255,252,247,216,131,192, + 3,255,64,137,128,253,240,11,233,15,132,244,247,255,64,128,184,253,240,11, + 233,235,15,132,244,247,255,15,149,208,15,182,192,255,197,252,248,87,192,255, + 15,87,192,255,64,199,128,253,240,11,233,237,15,138,243,15,133,243,255,64, + 199,128,253,240,11,233,237,15,132,243,248,1,255,64,199,128,253,240,11,233, + 237,15,138,245,15,133,245,255,184,237,15,138,244,247,15,133,244,247,184,237, + 248,1,255,15,138,243,15,133,243,248,1,255,64,252,246,128,253,240,11,233,235, + 15,132,244,249,255,72,139,184,253,240,3,233,131,47,1,15,133,244,249,72,137, + 4,36,255,72,139,4,36,248,3,255,72,131,185,233,0,15,133,244,12,255,72,139, + 136,233,100,255,72,43,136,233,72,129,252,249,239,15,130,243,255,252,246,128, + 233,1,72,199,199,237,15,133,244,247,255,186,237,255,59,144,233,15,71,144, + 233,43,144,233,43,144,233,255,193,226,4,72,99,210,72,41,215,248,1,255,72, + 139,20,37,237,255,72,139,20,37,8,0,0,0,72,139,146,233,72,139,146,233,255, + 72,139,146,233,76,41,252,250,255,72,129,252,250,239,255,72,57,252,250,255, + 15,130,244,247,254,1,72,141,176,233,255,73,137,199,252,233,244,247,254,0, + 72,129,130,233,239,255,72,1,186,233,255,65,199,135,233,237,255,73,199,135, + 233,237,255,72,185,237,237,73,137,143,233,255,72,141,136,233,73,137,143,233, + 255,72,139,12,36,73,137,143,233,255,65,129,143,233,239,255,131,1,1,255,131, + 0,1,255,72,139,136,233,73,137,143,233,139,144,233,129,226,239,129,202,239, + 128,184,233,235,15,132,244,247,129,202,239,72,139,136,233,248,1,65,9,151, + 233,73,137,143,233,72,131,184,233,0,15,133,244,247,72,141,184,233,255,73, + 139,142,233,255,72,186,237,237,72,57,145,233,255,72,129,185,233,239,255,73, + 139,134,233,255,73,139,150,233,72,139,130,233,255,72,185,237,237,72,57,200, + 255,72,133,192,15,132,244,247,255,72,137,186,233,255,72,141,178,233,255,72, + 133,192,15,133,244,249,255,72,185,237,237,72,57,136,233,255,72,129,184,233, + 239,255,252,233,244,25,255,64,128,184,253,240,11,233,235,15,133,243,255,252, + 233,244,11,254,0,73,139,134,233,72,139,128,233,72,133,192,15,132,244,247, + 255,73,139,134,233,72,139,144,233,72,59,151,233,15,133,244,247,72,139,128, + 233,255,72,141,20,36,255,72,133,192,15,133,244,248,252,233,244,11,254,0,252, + 247,128,233,237,15,133,244,247,254,1,72,139,60,36,72,137,198,186,237,255, + 72,133,192,15,132,244,11,255,73,137,199,255,72,139,128,253,240,3,233,255, + 72,191,237,237,72,57,184,233,255,73,139,135,233,252,247,128,233,237,15,133, + 243,255,73,199,134,233,0,0,0,0,255,73,139,135,233,73,137,134,233,255,77,137, + 183,233,255,73,139,135,233,255,132,192,73,139,135,233,15,133,244,247,252, + 233,244,11,254,0,132,192,15,132,244,11,255,73,137,151,233,255,73,139,150, + 233,73,137,151,233,255,72,139,145,233,72,139,146,233,255,73,139,135,233,72, + 139,144,233,255,72,139,144,233,72,252,247,194,1,0,0,0,15,132,244,247,100, + 255,72,3,145,233,72,139,18,248,1,255,76,137,185,233,77,137,252,254,255,76, + 139,184,233,255,72,139,184,233,255,72,129,199,239,255,73,137,190,233,255, + 232,244,247,254,1,248,1,88,252,233,245,254,0,72,139,184,233,73,137,190,233, + 255,65,139,142,233,129,252,249,239,255,139,144,233,65,139,142,233,57,209, + 255,15,143,244,247,254,1,65,139,142,233,252,233,244,247,254,0,252,247,128, + 233,237,15,133,244,247,255,137,202,72,193,226,5,255,73,1,215,255,73,1,150, + 233,255,41,202,15,142,244,249,255,72,193,225,4,73,141,140,253,14,233,248, + 2,199,129,233,237,131,252,234,1,72,141,137,233,15,133,244,2,248,3,255,132, + 192,15,132,244,11,73,139,135,233,255,76,137,185,233,255,252,255,144,233,255, + 76,137,176,233,255,65,252,246,135,233,235,15,133,244,247,254,1,248,1,73,139, + 191,233,255,248,1,73,139,191,233,64,131,168,253,240,11,233,1,15,133,244,247, + 255,252,233,244,248,248,1,64,252,247,64,240,11,4,237,15,133,244,247,255,248, + 1,252,233,244,248,254,0,248,1,76,137,252,255,255,72,131,184,233,0,15,133, + 244,17,255,73,139,135,233,252,247,128,233,237,15,133,244,247,254,1,252,233, + 244,18,254,0,72,184,237,237,131,0,1,255,73,139,190,233,252,246,135,233,235, + 15,133,244,247,254,1,72,133,192,15,133,244,11,252,233,244,248,254,0,72,141, + 128,253,240,3,233,255,72,137,192,240,131,255,128,184,233,235,15,133,244,247, + 72,139,0,248,1,255,64,199,128,253,240,11,233,237,252,233,244,248,248,1,255, + 72,139,136,253,240,3,233,131,1,1,255,72,137,136,253,240,3,233,255,64,199, + 128,253,240,11,233,237,252,233,244,252,255,186,237,72,49,201,77,49,192,255, + 199,0,2,0,0,0,199,128,233,237,72,199,128,233,0,0,0,0,255,72,139,12,36,255, + 252,233,244,253,254,0,128,252,249,235,15,133,243,255,128,252,249,235,15,132, + 244,253,255,252,247,128,233,237,15,133,244,253,255,65,252,247,135,233,237, + 15,133,244,247,254,1,64,199,128,253,240,11,233,237,72,133,192,15,132,244, + 11,255,131,47,1,15,132,244,247,132,228,15,132,244,248,131,2,1,252,233,244, + 248,248,1,255,73,139,134,233,129,136,233,239,255,65,129,167,233,239,255,73, + 139,134,233,129,160,233,239,255,248,1,65,129,143,233,239,252,233,244,247, + 254,0,65,129,167,233,239,248,1,255,73,139,134,233,72,139,128,233,72,133,192, + 15,132,244,247,72,169,1,0,0,0,15,133,244,250,254,1,248,4,100,255,72,139,191, + 233,72,209,232,57,135,233,255,15,133,244,247,248,2,255,64,199,128,253,240, + 11,233,237,252,233,244,249,255,138,128,233,255,65,138,134,233,255,136,4,36, + 255,138,12,36,252,233,244,248,255,138,136,233,255,65,138,142,233,255,184, + 1,0,0,0,211,224,169,237,255,15,149,208,15,182,192,131,192,2,255,248,2,128, + 252,249,235,255,65,128,190,233,235,255,73,139,134,233,100,255,72,137,130, + 233,255,73,139,190,233,100,255,72,137,184,233,76,137,252,247,255,252,247, + 199,237,255,65,252,247,134,233,237,255,252,233,244,254,254,0,15,133,244,15, + 255,73,139,190,233,72,129,252,239,239,64,131,168,253,240,11,233,1,15,133, + 244,247,255,252,233,244,250,248,1,64,252,247,64,240,11,4,237,15,133,244,247, + 255,248,1,248,4,255,252,247,199,237,15,132,244,250,255,73,139,190,233,64, + 131,168,253,240,11,233,1,15,133,244,247,255,76,137,176,233,77,139,182,233, + 255,72,131,184,233,0,15,133,244,16,255,15,133,244,41,255,72,131,184,233,0, + 255,65,252,255,55,195,255,76,137,252,247,73,139,6,76,139,116,36,24,76,139, + 124,36,32,72,131,196,40,252,255,48,195,255,72,133,210,255,72,133,201,255, + 64,252,246,128,253,240,11,233,235,15,132,245,255,64,252,246,128,253,240,11, + 233,235,15,132,244,255,255,131,40,1,15,132,244,248,255,132,252,246,15,132, + 245,255,132,252,246,15,132,244,255,255,72,139,144,253,240,3,233,131,2,1,255, + 72,139,136,253,240,3,233,132,252,246,15,132,244,248,128,252,250,235,15,133, + 244,247,139,145,233,72,139,137,233,132,252,246,15,132,244,248,248,1,131,1, + 1,248,2,255,64,137,144,253,240,11,233,255,64,128,184,253,240,11,233,235,15, + 133,244,247,191,237,255,64,128,184,253,240,11,233,235,15,133,243,72,139,0, + 72,129,192,239,255,64,128,184,253,240,11,233,235,15,132,244,247,252,233,243, + 254,0,64,139,144,253,240,11,233,128,252,250,235,15,133,244,247,254,1,248, + 1,128,252,250,235,15,133,243,72,139,0,72,129,192,239,255,64,139,144,253,240, + 11,233,128,252,250,235,15,132,244,247,252,233,243,254,0,64,139,144,253,240, + 11,233,128,252,250,235,15,133,243,255,64,199,128,253,240,11,233,237,252,233, + 244,254,254,0,72,133,192,15,132,244,255,255,64,199,128,253,240,11,233,237, + 252,233,244,254,255,73,139,182,233,72,139,134,233,72,131,232,1,100,255,139, + 137,233,72,193,225,5,72,57,200,15,131,244,255,100,255,72,3,129,233,128,184, + 233,235,15,133,244,255,255,15,133,244,255,72,139,0,131,0,1,248,1,255,64,252, + 246,128,253,240,11,233,235,15,133,244,248,254,1,64,199,128,253,240,11,233, + 237,131,47,1,255,248,3,252,247,71,4,237,15,133,244,251,255,252,255,209,255, + 72,129,198,239,255,252,233,244,1,254,0,64,128,184,253,240,11,233,235,15,133, + 244,247,72,139,128,253,240,131,240,3,233,72,129,192,240,35,239,248,1,255, + 186,1,0,0,0,64,138,136,253,240,11,233,211,226,252,247,194,237,15,132,244, + 247,255,65,129,190,233,239,15,130,243,255,65,129,190,233,239,15,130,244,247, + 254,1,65,129,190,233,239,15,131,244,251,255,73,139,134,233,72,139,176,233, + 255,132,192,15,133,244,247,254,1,64,199,128,253,240,11,233,237,252,233,244, + 11,254,0,72,184,237,237,72,57,135,233,255,72,129,191,233,239,255,128,191, + 233,235,15,133,244,247,72,139,63,248,1,255,73,139,134,233,72,139,144,233, + 72,59,151,233,15,133,244,251,72,139,128,233,255,15,140,244,251,255,15,140, + 244,254,255,139,148,253,7,233,132,210,15,132,244,251,72,1,199,255,73,139, + 134,233,72,139,176,233,72,133,252,246,15,133,244,247,254,1,248,1,252,247, + 134,233,237,255,128,191,233,235,15,133,244,248,72,139,7,131,0,1,255,64,199, + 128,253,240,11,233,237,252,233,244,255,248,2,139,135,233,169,237,15,132,244, + 252,129,224,239,137,135,233,255,248,6,72,137,252,247,255,64,199,128,253,240, + 11,233,237,252,233,244,255,248,3,255,139,151,233,132,210,15,132,243,255,139, + 151,233,132,210,15,132,244,251,255,139,151,233,255,128,252,250,235,15,133, + 244,250,255,72,139,128,253,240,3,233,131,0,1,255,64,199,128,253,240,11,233, + 237,252,233,244,255,254,1,248,4,139,135,233,169,237,15,132,244,252,129,224, + 239,137,135,233,252,233,244,250,248,6,255,64,199,128,253,240,11,233,237,252, + 233,244,255,254,0,128,252,250,235,15,142,244,247,254,1,128,252,250,235,15, + 132,244,247,255,72,139,135,233,72,139,128,233,72,139,176,233,255,252,233, + 244,255,248,1,255,72,137,184,253,240,3,233,255,128,252,250,235,15,133,244, + 247,72,139,0,72,129,192,239,255,64,139,144,253,240,11,233,255,248,1,128,252, + 250,235,15,133,243,255,248,8,72,137,198,255,72,139,184,253,240,3,233,131, + 47,1,15,133,244,247,255,73,139,134,233,72,139,144,233,72,59,151,233,15,133, + 244,253,255,72,131,184,233,0,15,133,244,253,255,72,139,128,233,72,133,192, + 15,140,244,253,255,128,188,253,7,233,235,15,132,244,253,255,128,191,233,235, + 15,132,243,255,128,191,233,235,15,132,244,253,255,72,139,184,253,240,3,233, + 72,131,191,233,0,15,133,244,247,72,141,191,233,254,1,15,128,244,249,255,73, + 139,150,233,72,129,194,239,255,72,139,184,253,240,3,233,72,131,191,233,0, + 15,133,244,247,72,141,135,233,254,1,73,139,142,233,72,129,193,239,255,73, + 199,192,237,255,73,184,237,237,255,73,139,134,233,72,139,144,233,72,59,151, + 233,15,133,244,251,255,72,139,128,233,72,133,192,15,140,244,251,128,188,253, + 7,233,235,15,132,244,251,72,1,199,255,128,191,233,235,15,132,244,251,255, + 76,141,128,253,240,3,233,255,73,137,192,240,131,255,64,128,184,253,240,11, + 233,235,15,132,244,253,255,65,139,190,233,131,252,255,252,255,15,132,244, + 253,255,72,139,128,253,240,3,233,72,141,184,233,72,139,176,233,255,72,139, + 128,253,240,3,233,72,139,128,233,255,64,199,128,253,240,11,233,237,131,7, + 1,255,65,128,190,233,235,15,133,244,247,254,1,252,233,244,28,254,0,72,43, + 135,233,255,72,153,72,252,247,252,255,255,72,141,61,244,250,252,255,36,7, + 255,252,255,160,246,250,255,254,2,250,7,248,4,255,246,249,255,72,139,176, + 253,240,3,233,255,128,190,233,235,15,133,244,249,255,72,139,182,233,252,233, + 244,248,254,0,72,129,252,254,239,255,15,131,244,249,255,72,141,5,244,250, + 252,255,36,252,240,255,252,255,36,252,245,246,250,255,72,139,176,253,240, + 3,233,254,1,64,128,184,253,240,11,233,235,15,133,245,255,186,1,0,0,0,255, + 64,138,136,253,240,11,233,211,226,252,247,194,237,15,132,244,252,255,72,185, + 237,237,73,137,142,233,255,64,128,184,253,240,11,233,235,15,133,244,253,72, + 199,199,237,255,252,255,214,255,72,133,192,15,132,244,11,100,255,72,141,191, + 233,252,233,244,254,255,248,8,73,139,182,233,255,73,139,134,233,72,141,136, + 233,255,15,159,208,15,182,192,141,128,233,255,131,7,1,248,1,255,65,199,134, + 233,0,0,0,0,255,65,139,134,233,255,252,247,135,233,237,15,133,244,248,255, + 137,198,72,193,230,5,72,3,183,233,248,1,57,135,233,255,15,134,244,249,255, + 131,192,1,255,72,129,198,239,252,233,244,1,255,137,198,72,193,230,4,72,3, + 183,233,248,1,57,135,233,255,15,134,244,250,255,128,190,233,235,15,133,244, + 250,255,248,3,65,137,134,233,255,72,131,190,233,0,15,132,244,248,255,72,139, + 134,233,255,72,137,128,253,240,3,233,252,247,128,233,237,15,132,244,247,255, + 64,199,128,253,240,11,233,237,252,233,244,249,248,1,131,0,1,255,248,4,65, + 137,134,233,72,131,232,1,255,248,3,248,4,65,137,134,233,255,248,3,248,4,255, + 73,139,190,233,72,139,135,233,72,133,192,15,132,244,255,255,72,169,237,15, + 133,244,255,255,72,133,192,15,133,244,8,252,233,244,11,254,0,15,149,208,15, + 182,192,141,128,233,255,72,139,136,253,240,3,233,73,137,142,233,255,64,139, + 128,253,240,11,233,255,73,141,190,233,190,237,255,128,191,233,235,15,133, + 243,255 +}; + +#line 140 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +//|.globals zend_lb +enum { + zend_lbinterrupt_handler, + zend_lbexception_handler, + zend_lbexception_handler_undef, + zend_lbexception_handler_free_op1_op2, + zend_lbexception_handler_free_op2, + zend_lbleave_function_handler, + zend_lbleave_throw_handler, + zend_lbicall_throw_handler, + zend_lbthrow_cannot_pass_by_ref, + zend_lbundefined_offset_ex, + zend_lbundefined_offset, + zend_lbundefined_index_ex, + zend_lbundefined_index, + zend_lbcannot_add_element_ex, + zend_lbcannot_add_element, + zend_lbundefined_function, + zend_lbnegative_shift, + zend_lbmod_by_zero, + zend_lbinvalid_this, + zend_lbone, + zend_lbhybrid_runtime_jit, + zend_lbhybrid_profile_jit, + zend_lbhybrid_hot_code, + zend_lbhybrid_func_hot_counter, + zend_lbhybrid_loop_hot_counter, + zend_lbhybrid_hot_trace, + zend_lbhybrid_func_trace_counter, + zend_lbhybrid_ret_trace_counter, + zend_lbhybrid_loop_trace_counter, + zend_lbtrace_halt, + zend_lbtrace_exit, + zend_lbtrace_escape, + zend_lbcontext_threaded_call, + zend_lbassign_const, + zend_lbassign_tmp, + zend_lbassign_var, + zend_lbassign_cv_noref, + zend_lbassign_cv, + zend_lb_MAX +}; +#line 141 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +//|.section code, cold_code, jmp_table +#define DASM_SECTION_CODE 0 +#define DASM_SECTION_COLD_CODE 1 +#define DASM_SECTION_JMP_TABLE 2 +#define DASM_MAXSECTION 3 +#line 142 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + +static void* dasm_labels[zend_lb_MAX]; + +#if ZTS +static size_t tsrm_ls_cache_tcb_offset = 0; +static size_t tsrm_tls_index; +static size_t tsrm_tls_offset; +#endif + +#define IS_32BIT(addr) (((uintptr_t)(addr)) <= 0x7fffffff) + +#define IS_SIGNED_32BIT(val) ((((intptr_t)(val)) <= 0x7fffffff) && (((intptr_t)(val)) >= (-2147483647 - 1))) + +/* Call range is before or after 2GB */ +#define MAY_USE_32BIT_ADDR(addr) \ + (IS_SIGNED_32BIT((char*)(addr) - (char*)dasm_buf) && \ + IS_SIGNED_32BIT((char*)(addr) - (char*)dasm_end)) + +#define CAN_USE_AVX() (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) + +/* Not Implemented Yet */ +//|.macro NIY +//|| //ZEND_ASSERT(0); +//| int3 +//|.endmacro + +//|.macro NIY_STUB +//|| //ZEND_ASSERT(0); +//| int3 +//|.endmacro + +//|.macro ADD_HYBRID_SPAD +//||#ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE +//| add r4, HYBRID_SPAD +//||#endif +//|.endmacro + +//|.macro SUB_HYBRID_SPAD +//||#ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE +//| sub r4, HYBRID_SPAD +//||#endif +//|.endmacro + +//|.macro LOAD_ADDR, reg, addr +//| .if X64 +//|| if (IS_SIGNED_32BIT(addr)) { +//| mov reg, ((ptrdiff_t)addr) // 0x48 0xc7 0xc0 +//|| } else { +//| mov64 reg, ((ptrdiff_t)addr) // 0x48 0xb8 +//|| } +//| .else +//| mov reg, ((ptrdiff_t)addr) +//| .endif +//|.endmacro + +//|.macro LOAD_TSRM_CACHE, reg +//| .if X64WIN +//| gs +//| mov reg, aword [0x58] +//| mov reg, aword [reg+tsrm_tls_index] +//| mov reg, aword [reg+tsrm_tls_offset] +//| .elif WIN +//| fs +//| mov reg, aword [0x2c] +//| mov reg, aword [reg+tsrm_tls_index] +//| mov reg, aword [reg+tsrm_tls_offset] +//| .elif X64APPLE +//| gs +//|| if (tsrm_ls_cache_tcb_offset) { +//| mov reg, aword [tsrm_ls_cache_tcb_offset] +//|| } else { +//| mov reg, aword [tsrm_tls_index] +//| mov reg, aword [reg+tsrm_tls_offset] +//|| } +//| .elif X64 +//| fs +//|| if (tsrm_ls_cache_tcb_offset) { +//| mov reg, aword [tsrm_ls_cache_tcb_offset] +//|| } else { +//| mov reg, [0x8] +//| mov reg, aword [reg+tsrm_tls_index] +//| mov reg, aword [reg+tsrm_tls_offset] +//|| } +//| .else +//| gs +//|| if (tsrm_ls_cache_tcb_offset) { +//| mov reg, aword [tsrm_ls_cache_tcb_offset] +//|| } else { +//| mov reg, [0x4] +//| mov reg, aword [reg+tsrm_tls_index] +//| mov reg, aword [reg+tsrm_tls_offset] +//|| } +//| .endif +//|.endmacro + +//|.macro LOAD_ADDR_ZTS, reg, struct, field +//| .if ZTS +//| LOAD_TSRM_CACHE reg +//| lea reg, aword [reg + (struct.._offset + offsetof(zend_..struct, field))] +//| .else +//| LOAD_ADDR reg, &struct.field +//| .endif +//|.endmacro + +//|.macro PUSH_ADDR, addr, tmp_reg +//| .if X64 +//|| if (IS_SIGNED_32BIT(addr)) { +//| push ((ptrdiff_t)addr) +//|| } else { +//| mov64 tmp_reg, ((ptrdiff_t)addr) +//| push tmp_reg +//|| } +//| .else +//| push ((ptrdiff_t)addr) +//| .endif +//|.endmacro + +//|.macro ADDR_STORE, mem, addr, tmp_reg +//| .if X64 +//|| if (IS_SIGNED_32BIT(addr)) { +//| mov mem, ((ptrdiff_t)addr) +//|| } else { +//| mov64 tmp_reg, ((ptrdiff_t)addr) +//| mov mem, tmp_reg +//|| } +//| .else +//| mov mem, ((ptrdiff_t)addr) +//| .endif +//|.endmacro + +//|.macro ADDR_CMP, mem, addr, tmp_reg +//| .if X64 +//|| if (IS_SIGNED_32BIT(addr)) { +//| cmp mem, ((ptrdiff_t)addr) +//|| } else { +//| mov64 tmp_reg, ((ptrdiff_t)addr) +//| cmp mem, tmp_reg +//|| } +//| .else +//| cmp mem, ((ptrdiff_t)addr) +//| .endif +//|.endmacro + +//|.macro PUSH_ADDR_ZTS, struct, field, tmp_reg +//| .if ZTS +//| LOAD_TSRM_CACHE tmp_reg +//| lea tmp_reg, aword [tmp_reg + (struct.._offset + offsetof(zend_..struct, field))] +//| push tmp_reg +//| .else +//| PUSH_ADDR &struct.field, tmp_reg +//| .endif +//|.endmacro + +//|.macro _MEM_OP, mem_ins, prefix, addr, op2, tmp_reg +//| .if X64 +//|| if (IS_SIGNED_32BIT(addr)) { +//| mem_ins prefix [addr], op2 +//|| } else { +//| mov64 tmp_reg, ((ptrdiff_t)addr) +//| mem_ins prefix [tmp_reg], op2 +//|| } +//| .else +//| mem_ins prefix [addr], op2 +//| .endif +//|.endmacro + +//|.macro MEM_LOAD_OP, mem_ins, reg, prefix, addr, tmp_reg +//| .if X64 +//|| if (IS_SIGNED_32BIT(addr)) { +//| mem_ins reg, prefix [addr] +//|| } else { +//| mov64 tmp_reg, ((ptrdiff_t)addr) +//| mem_ins reg, prefix [tmp_reg] +//|| } +//| .else +//| mem_ins reg, prefix [addr] +//| .endif +//|.endmacro + +//|.macro MEM_LOAD, op1, prefix, addr, tmp_reg +//| MEM_LOAD_OP mov, op1, prefix, addr, tmp_reg +//|.endmacro + +//|.macro _MEM_OP_ZTS, mem_ins, prefix, struct, field, op2, tmp_reg +//| .if ZTS +//| LOAD_TSRM_CACHE tmp_reg +//| mem_ins prefix [tmp_reg+(struct.._offset+offsetof(zend_..struct, field))], op2 +//| .else +//| _MEM_OP mem_ins, prefix, &struct.field, op2, tmp_reg +//| .endif +//|.endmacro + +//|.macro MEM_STORE_ZTS, prefix, struct, field, op2, tmp_reg +//| _MEM_OP_ZTS mov, prefix, struct, field, op2, tmp_reg +//|.endmacro + +//|.macro MEM_CMP_ZTS, prefix, struct, field, op2, tmp_reg +//| _MEM_OP_ZTS cmp, prefix, struct, field, op2, tmp_reg +//|.endmacro + +//|.macro MEM_UPDATE_ZTS, mem_ins, prefix, struct, field, op2, tmp_reg +//| _MEM_OP_ZTS mem_ins, prefix, struct, field, op2, tmp_reg +//|.endmacro + +//|.macro MEM_LOAD_OP_ZTS, mem_ins, reg, prefix, struct, field, tmp_reg +//| .if ZTS +//| LOAD_TSRM_CACHE tmp_reg +//| mem_ins reg, prefix [tmp_reg+(struct.._offset+offsetof(zend_..struct, field))] +//| .else +//| MEM_LOAD_OP mem_ins, reg, prefix, &struct.field, tmp_reg +//| .endif +//|.endmacro + +//|.macro MEM_LOAD_ZTS, reg, prefix, struct, field, tmp_reg +//| MEM_LOAD_OP_ZTS mov, reg, prefix, struct, field, tmp_reg +//|.endmacro + +//|.macro EXT_CALL, func, tmp_reg +//| .if X64 +//|| if (MAY_USE_32BIT_ADDR(func)) { +//| call qword &func +//|| } else { +//| LOAD_ADDR tmp_reg, func +//| call tmp_reg +//|| } +//| .else +//| call dword &func +//| .endif +//|.endmacro + +//|.macro EXT_JMP, func, tmp_reg +//| .if X64 +//|| if (MAY_USE_32BIT_ADDR(func)) { +//| jmp qword &func +//|| } else { +//| LOAD_ADDR tmp_reg, func +//| jmp tmp_reg +//|| } +//| .else +//| jmp dword &func +//| .endif +//|.endmacro + +//|.macro SAVE_IP +//|| if (GCC_GLOBAL_REGS) { +//| mov aword EX->opline, IP +//|| } +//|.endmacro + +//|.macro LOAD_IP +//|| if (GCC_GLOBAL_REGS) { +//| mov IP, aword EX->opline +//|| } +//|.endmacro + +//|.macro LOAD_IP_ADDR, addr +//|| if (GCC_GLOBAL_REGS) { +//| LOAD_ADDR IP, addr +//|| } else { +//| ADDR_STORE aword EX->opline, addr, RX +//|| } +//|.endmacro + +//|.macro LOAD_IP_ADDR_ZTS, struct, field +//| .if ZTS +//|| if (GCC_GLOBAL_REGS) { +//| LOAD_TSRM_CACHE IP +//| lea IP, aword [IP + (struct.._offset + offsetof(zend_..struct, field))] +//|| } else { +//| LOAD_TSRM_CACHE RX +//| lea RX, aword [RX + (struct.._offset + offsetof(zend_..struct, field))] +//| mov aword EX->opline, RX +//|| } +//| .else +//| LOAD_IP_ADDR &struct.field +//| .endif +//|.endmacro + +//|.macro GET_IP, reg +//|| if (GCC_GLOBAL_REGS) { +//| mov reg, IP +//|| } else { +//| mov reg, aword EX->opline +//|| } +//|.endmacro + +//|.macro ADD_IP, val +//|| if (GCC_GLOBAL_REGS) { +//| add IP, val +//|| } else { +//| add aword EX->opline, val +//|| } +//|.endmacro + +//|.macro JMP_IP +//|| if (GCC_GLOBAL_REGS) { +//| jmp aword [IP] +//|| } else { +//| mov r0, aword EX:FCARG1a->opline +//| jmp aword [r0] +//|| } +//|.endmacro + +/* In 64-bit build we compare only low 32-bits. + * x86_64 cmp instruction doesn't support immediate 64-bit operand, and full + * comparison would require an additional load of 64-bit address into register. + * This is not a problem at all, while JIT buffer size is less than 4GB. + */ +//|.macro CMP_IP, addr +//|| if (GCC_GLOBAL_REGS) { +//| cmp IPl, addr +//|| } else { +//| cmp dword EX->opline, addr +//|| } +//|.endmacro + +//|.macro LOAD_ZVAL_ADDR, reg, addr +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| LOAD_ADDR reg, Z_ZV(addr) +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//|| if (Z_OFFSET(addr)) { +//| lea reg, qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else { +//| mov reg, Ra(Z_REG(addr)) +//|| } +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro PUSH_ZVAL_ADDR, addr, tmp_reg +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| PUSH_ADDR Z_ZV(addr), tmp_reg +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//|| if (Z_OFFSET(addr)) { +//| lea tmp_reg, qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//| push tmp_reg +//|| } else { +//| push Ra(Z_REG(addr)) +//|| } +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro GET_Z_TYPE_INFO, reg, zv +//| mov reg, dword [zv+offsetof(zval,u1.type_info)] +//|.endmacro + +//|.macro SET_Z_TYPE_INFO, zv, type +//| mov dword [zv+offsetof(zval,u1.type_info)], type +//|.endmacro + +//|.macro GET_ZVAL_TYPE, reg, addr +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov reg, byte [Ra(Z_REG(addr))+Z_OFFSET(addr)+offsetof(zval,u1.v.type)] +//|.endmacro + +//|.macro GET_ZVAL_TYPE_INFO, reg, addr +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov reg, dword [Ra(Z_REG(addr))+Z_OFFSET(addr)+offsetof(zval,u1.type_info)] +//|.endmacro + +//|.macro SET_ZVAL_TYPE_INFO, addr, type +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov dword [Ra(Z_REG(addr))+Z_OFFSET(addr)+offsetof(zval,u1.type_info)], type +//|.endmacro + +//|.macro GET_Z_PTR, reg, zv +//| mov reg, aword [zv] +//|.endmacro + +//|.macro GET_Z_W2, reg, zv +//| mov reg, dword [zv+4] +//|.endmacro + +//|.macro SET_Z_W2, zv, reg +//| mov dword [zv+4], reg +//|.endmacro + +//|.macro GET_ZVAL_PTR, reg, addr +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov reg, aword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|.endmacro + +//|.macro SET_ZVAL_PTR, addr, val +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov aword [Ra(Z_REG(addr))+Z_OFFSET(addr)], val +//|.endmacro + +//|.macro GET_ZVAL_W2, reg, addr +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov reg, dword [Ra(Z_REG(addr))+Z_OFFSET(addr)+4] +//|.endmacro + +//|.macro SET_ZVAL_W2, addr, val +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov dword [Ra(Z_REG(addr))+Z_OFFSET(addr)+4], val +//|.endmacro + +//|.macro UNDEF_OPLINE_RESULT +//| mov r0, EX->opline +//| mov eax, dword OP:r0->result.var +//| SET_Z_TYPE_INFO FP + r0, IS_UNDEF +//|.endmacro + +//|.macro UNDEF_OPLINE_RESULT_IF_USED +//| test byte OP:RX->result_type, (IS_TMP_VAR|IS_VAR) +//| jz >1 +//| mov eax, dword OP:RX->result.var +//| SET_Z_TYPE_INFO FP + r0, IS_UNDEF +//|1: +//|.endmacro + +//|.macro SSE_AVX_INS, sse_ins, avx_ins, op1, op2 +//|| if (CAN_USE_AVX()) { +//| avx_ins op1, op2 +//|| } else { +//| sse_ins op1, op2 +//|| } +//|.endmacro + +//|.macro SSE_OP, sse_ins, reg, addr, tmp_reg +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| MEM_LOAD_OP sse_ins, xmm(reg-ZREG_XMM0), qword, Z_ZV(addr), tmp_reg +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//| sse_ins xmm(reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else if (Z_MODE(addr) == IS_REG) { +//| sse_ins xmm(reg-ZREG_XMM0), xmm(Z_REG(addr)-ZREG_XMM0) +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro DOUBLE_CMP, reg, addr +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| .if X64 +//|| if (IS_SIGNED_32BIT(Z_ZV(addr))) { +//| SSE_AVX_INS ucomisd, vucomisd, xmm(reg-ZREG_XMM0), qword [Z_ZV(addr)] +//|| } else { +//| LOAD_ADDR r0, Z_ZV(addr) +//| SSE_AVX_INS ucomisd, vucomisd, xmm(reg-ZREG_XMM0), qword [r0] +//|| } +//| .else +//| SSE_AVX_INS ucomisd, vucomisd, xmm(reg-ZREG_XMM0), qword [Z_ZV(addr)] +//| .endif +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//| SSE_AVX_INS ucomisd, vucomisd, xmm(reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else if (Z_MODE(addr) == IS_REG) { +//| SSE_AVX_INS ucomisd, vucomisd, xmm(reg-ZREG_XMM0), xmm(Z_REG(addr)-ZREG_XMM0) +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro DOUBLE_GET_LONG, reg, lval, tmp_reg +//|| if (lval == 0) { +//|| if (CAN_USE_AVX()) { +//| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//|| } else { +//| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//|| } +//|| } else { +//|.if X64 +//|| if (!IS_SIGNED_32BIT(lval)) { +//| mov64 Ra(tmp_reg), lval +//|| } else { +//| mov Ra(tmp_reg), lval +//|| } +//|.else +//| mov Ra(tmp_reg), lval +//|.endif +//|| if (CAN_USE_AVX()) { +//| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//| vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(tmp_reg) +//|| } else { +//| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//| cvtsi2sd, xmm(reg-ZREG_XMM0), Ra(tmp_reg) +//|| } +//|| } +//|.endmacro + +//|.macro DOUBLE_GET_ZVAL_LVAL, reg, addr, tmp_reg +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| DOUBLE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr)), tmp_reg +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//|| if (CAN_USE_AVX()) { +//| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else { +//| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//| cvtsi2sd xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } +//|| } else if (Z_MODE(addr) == IS_REG) { +//|| if (CAN_USE_AVX()) { +//| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(Z_REG(addr)) +//|| } else { +//| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//| cvtsi2sd xmm(reg-ZREG_XMM0), Ra(Z_REG(addr)) +//|| } +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro DOUBLE_GET_ZVAL_DVAL, reg, addr +//|| if (Z_MODE(addr) != IS_REG || reg != Z_REG(addr)) { +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| .if X64 +//|| if (IS_SIGNED_32BIT(Z_ZV(addr))) { +//| SSE_AVX_INS movsd, vmovsd, xmm(reg-ZREG_XMM0), qword [Z_ZV(addr)] +//|| } else { +//| LOAD_ADDR r0, Z_ZV(addr) +//| SSE_AVX_INS movsd, vmovsd, xmm(reg-ZREG_XMM0), qword [r0] +//|| } +//| .else +//| SSE_AVX_INS movsd, vmovsd, xmm(reg-ZREG_XMM0), qword [Z_ZV(addr)] +//| .endif +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//| SSE_AVX_INS movsd, vmovsd, xmm(reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else if (Z_MODE(addr) == IS_REG) { +//| SSE_AVX_INS movaps, vmovaps, xmm(reg-ZREG_XMM0), xmm(Z_REG(addr)-ZREG_XMM0) +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|| } +//|.endmacro + +//|.macro SSE_MATH, opcode, reg, addr, tmp_reg +//|| switch (opcode) { +//|| case ZEND_ADD: +//| SSE_OP addsd, reg, addr, tmp_reg +//|| break; +//|| case ZEND_SUB: +//| SSE_OP subsd, reg, addr, tmp_reg +//|| break; +//|| case ZEND_MUL: +//| SSE_OP mulsd, reg, addr, tmp_reg +//|| break; +//|| case ZEND_DIV: +//| SSE_OP divsd, reg, addr, tmp_reg +//|| break; +//|| } +//|.endmacro + +//|.macro SSE_MATH_REG, opcode, dst_reg, src_reg +//|| switch (opcode) { +//|| case ZEND_ADD: +//| addsd xmm(dst_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| case ZEND_SUB: +//| subsd xmm(dst_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| case ZEND_MUL: +//| mulsd xmm(dst_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| case ZEND_DIV: +//| divsd xmm(dst_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| } +//|.endmacro + +//|.macro DOUBLE_SET_ZVAL_DVAL, addr, reg +//|| if (Z_MODE(addr) == IS_REG) { +//|| if (reg != Z_REG(addr)) { +//| SSE_AVX_INS movaps, vmovaps, xmm(Z_REG(addr)-ZREG_XMM0), xmm(reg-ZREG_XMM0) +//|| } +//|| } else { +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| SSE_AVX_INS movsd, vmovsd, qword [Ra(Z_REG(addr))+Z_OFFSET(addr)], xmm(reg-ZREG_XMM0) +//|| } +//|.endmacro + +//|.macro AVX_OP, avx_ins, reg, op1_reg, addr, tmp_reg +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| .if X64 +//|| if (IS_SIGNED_32BIT(Z_ZV(addr))) { +//| avx_ins xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword [Z_ZV(addr)] +//|| } else { +//| mov64 tmp_reg, ((ptrdiff_t)Z_ZV(addr)) +//| avx_ins xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword [tmp_reg] +//|| } +//| .else +//| avx_ins xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword [addr] +//| .endif +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//| avx_ins xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else if (Z_MODE(addr) == IS_REG) { +//| avx_ins xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), xmm(Z_REG(addr)-ZREG_XMM0) +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro AVX_MATH, opcode, reg, op1_reg, addr, tmp_reg +//|| switch (opcode) { +//|| case ZEND_ADD: +//| AVX_OP vaddsd, reg, op1_reg, addr, tmp_reg +//|| break; +//|| case ZEND_SUB: +//| AVX_OP vsubsd, reg, op1_reg, addr, tmp_reg +//|| break; +//|| case ZEND_MUL: +//| AVX_OP vmulsd, reg, op1_reg, addr, tmp_reg +//|| break; +//|| case ZEND_DIV: +//| AVX_OP vdivsd, reg, op1_reg, addr, tmp_reg +//|| break; +//|| } +//|.endmacro + +//|.macro AVX_MATH_REG, opcode, dst_reg, op1_reg, src_reg +//|| switch (opcode) { +//|| case ZEND_ADD: +//| vaddsd xmm(dst_reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| case ZEND_SUB: +//| vsubsd xmm(dst_reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| case ZEND_MUL: +//| vmulsd xmm(dst_reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| case ZEND_DIV: +//| vdivsd xmm(dst_reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), xmm(src_reg-ZREG_XMM0) +//|| break; +//|| } +//|.endmacro + +//|.macro LONG_OP, long_ins, reg, addr, tmp_reg +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//| .if X64 +//|| if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(addr)))) { +//| mov64 tmp_reg, Z_LVAL_P(Z_ZV(addr)) +//| long_ins Ra(reg), tmp_reg +//|| } else { +//| long_ins Ra(reg), Z_LVAL_P(Z_ZV(addr)) +//|| } +//| .else +//| long_ins Ra(reg), Z_LVAL_P(Z_ZV(addr)) +//| .endif +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//| long_ins Ra(reg), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else if (Z_MODE(addr) == IS_REG) { +//| long_ins Ra(reg), Ra(Z_REG(addr)) +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro LONG_OP_WITH_32BIT_CONST, long_ins, op1_addr, lval +//|| if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { +//| long_ins aword [Ra(Z_REG(op1_addr))+Z_OFFSET(op1_addr)], lval +//|| } else if (Z_MODE(op1_addr) == IS_REG) { +//| long_ins Ra(Z_REG(op1_addr)), lval +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro LONG_OP_WITH_CONST, long_ins, op1_addr, lval +//|| if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { +//| .if X64 +//|| if (!IS_SIGNED_32BIT(lval)) { +//| mov64 r0, lval +//| long_ins aword [Ra(Z_REG(op1_addr))+Z_OFFSET(op1_addr)], r0 +//|| } else { +//| long_ins aword [Ra(Z_REG(op1_addr))+Z_OFFSET(op1_addr)], lval +//|| } +//| .else +//| long_ins aword [Ra(Z_REG(op1_addr))+Z_OFFSET(op1_addr)], lval +//| .endif +//|| } else if (Z_MODE(op1_addr) == IS_REG) { +//| .if X64 +//|| if (!IS_SIGNED_32BIT(lval)) { +//| mov64 r0, lval +//| long_ins Ra(Z_REG(op1_addr)), r0 +//|| } else { +//| long_ins Ra(Z_REG(op1_addr)), lval +//|| } +//| .else +//| long_ins Ra(Z_REG(op1_addr)), lval +//| .endif +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro GET_ZVAL_LVAL, reg, addr +//|| if (Z_MODE(addr) == IS_CONST_ZVAL) { +//|| if (Z_LVAL_P(Z_ZV(addr)) == 0) { +//| xor Ra(reg), Ra(reg) +//|| } else { +//| .if X64 +//|| if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(addr)))) { +//| mov64 Ra(reg), Z_LVAL_P(Z_ZV(addr)) +//|| } else { +//| mov Ra(reg), Z_LVAL_P(Z_ZV(addr)) +//|| } +//| .else +//| mov Ra(reg), Z_LVAL_P(Z_ZV(addr)) +//| .endif +//|| } +//|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) { +//| mov Ra(reg), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)] +//|| } else if (Z_MODE(addr) == IS_REG) { +//|| if (reg != Z_REG(addr)) { +//| mov Ra(reg), Ra(Z_REG(addr)) +//|| } +//|| } else { +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro LONG_MATH, opcode, reg, addr, tmp_reg +//|| switch (opcode) { +//|| case ZEND_ADD: +//| LONG_OP add, reg, addr, Ra(tmp_reg) +//|| break; +//|| case ZEND_SUB: +//| LONG_OP sub, reg, addr, Ra(tmp_reg) +//|| break; +//|| case ZEND_MUL: +//| LONG_OP imul, reg, addr, Ra(tmp_reg) +//|| break; +//|| case ZEND_BW_OR: +//| LONG_OP or, reg, addr, Ra(tmp_reg) +//|| break; +//|| case ZEND_BW_AND: +//| LONG_OP and, reg, addr, Ra(tmp_reg) +//|| break; +//|| case ZEND_BW_XOR: +//| LONG_OP xor, reg, addr, Ra(tmp_reg) +//|| break; +//|| default: +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro LONG_MATH_REG, opcode, dst_reg, src_reg +//|| switch (opcode) { +//|| case ZEND_ADD: +//| add dst_reg, src_reg +//|| break; +//|| case ZEND_SUB: +//| sub dst_reg, src_reg +//|| break; +//|| case ZEND_MUL: +//| imul dst_reg, src_reg +//|| break; +//|| case ZEND_BW_OR: +//| or dst_reg, src_reg +//|| break; +//|| case ZEND_BW_AND: +//| and dst_reg, src_reg +//|| break; +//|| case ZEND_BW_XOR: +//| xor dst_reg, src_reg +//|| break; +//|| default: +//|| ZEND_UNREACHABLE(); +//|| } +//|.endmacro + +//|.macro SET_ZVAL_LVAL, addr, lval +//|| if (Z_MODE(addr) == IS_REG) { +//| mov Ra(Z_REG(addr)), lval +//|| } else { +//|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); +//| mov aword [Ra(Z_REG(addr))+Z_OFFSET(addr)], lval +//|| } +//|.endmacro + +//|.macro ZVAL_COPY_CONST, dst_addr, dst_info, dst_def_info, zv, tmp_reg +//|| if (Z_TYPE_P(zv) > IS_TRUE) { +//|| if (Z_TYPE_P(zv) == IS_DOUBLE) { +//|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0; +//|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { +//|| if (CAN_USE_AVX()) { +//| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) +//|| } else { +//| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) +//|| } +//| .if X64 +//|| } else if (!IS_SIGNED_32BIT(zv)) { +//| mov64 Ra(tmp_reg), ((uintptr_t)zv) +//| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [Ra(tmp_reg)] +//| .endif +//|| } else { +//| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [((uint32_t)(uintptr_t)zv)] +//|| } +//| DOUBLE_SET_ZVAL_DVAL dst_addr, dst_reg +//|| } else if (Z_TYPE_P(zv) == IS_LONG && dst_def_info == MAY_BE_DOUBLE) { +//|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0; +//| DOUBLE_GET_LONG dst_reg, Z_LVAL_P(zv), ZREG_R0 +//| DOUBLE_SET_ZVAL_DVAL dst_addr, dst_reg +//|| } else if (Z_LVAL_P(zv) == 0 && Z_MODE(dst_addr) == IS_REG) { +//| xor Ra(Z_REG(dst_addr)), Ra(Z_REG(dst_addr)) +//|| } else { +//| .if X64 +//|| if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { +//|| if (Z_MODE(dst_addr) == IS_REG) { +//| mov64 Ra(Z_REG(dst_addr)), ((uintptr_t)Z_LVAL_P(zv)) +//|| } else { +//| mov64 Ra(tmp_reg), ((uintptr_t)Z_LVAL_P(zv)) +//| SET_ZVAL_LVAL dst_addr, Ra(tmp_reg) +//|| } +//|| } else { +//| SET_ZVAL_LVAL dst_addr, Z_LVAL_P(zv) +//|| } +//| .else +//| SET_ZVAL_LVAL dst_addr, Z_LVAL_P(zv) +//| .endif +//|| } +//|| } +//|| if (Z_MODE(dst_addr) == IS_MEM_ZVAL) { +//|| if (dst_def_info == MAY_BE_DOUBLE) { +//|| if ((dst_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { +//| SET_ZVAL_TYPE_INFO dst_addr, IS_DOUBLE +//|| } +//|| } else if (((dst_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1< IS_TRUE) { +//|| if (Z_TYPE_P(zv) == IS_DOUBLE) { +//|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? +//|| Z_REG(dst_addr) : ((Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0); +//|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { +//|| if (CAN_USE_AVX()) { +//| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) +//|| } else { +//| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) +//|| } +//| .if X64 +//|| } else if (!IS_SIGNED_32BIT(zv)) { +//| mov64 Ra(tmp_reg), ((uintptr_t)zv) +//| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [Ra(tmp_reg)] +//| .endif +//|| } else { +//| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [((uint32_t)(uintptr_t)zv)] +//|| } +//| DOUBLE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0 +//| DOUBLE_SET_ZVAL_DVAL res_addr, ZREG_XMM0 +//|| } else if (Z_TYPE_P(zv) == IS_LONG && dst_def_info == MAY_BE_DOUBLE) { +//|| if (Z_MODE(dst_addr) == IS_REG) { +//| DOUBLE_GET_LONG Z_REG(dst_addr), Z_LVAL_P(zv), ZREG_R0 +//| DOUBLE_SET_ZVAL_DVAL res_addr, Z_REG(dst_addr) +//|| } else if (Z_MODE(res_addr) == IS_REG) { +//| DOUBLE_GET_LONG Z_REG(res_addr), Z_LVAL_P(zv), ZREG_R0 +//| DOUBLE_SET_ZVAL_DVAL dst_addr, Z_REG(res_addr) +//|| } else { +//| DOUBLE_GET_LONG ZREG_XMM0, Z_LVAL_P(zv), ZREG_R0 +//| DOUBLE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0 +//| DOUBLE_SET_ZVAL_DVAL res_addr, ZREG_XMM0 +//|| } +//|| } else if (Z_LVAL_P(zv) == 0 && (Z_MODE(dst_addr) == IS_REG || Z_MODE(res_addr) == IS_REG)) { +//|| if (Z_MODE(dst_addr) == IS_REG) { +//| xor Ra(Z_REG(dst_addr)), Ra(Z_REG(dst_addr)) +//| SET_ZVAL_LVAL res_addr, Ra(Z_REG(dst_addr)) +//|| } else { +//| xor Ra(Z_REG(res_addr)), Ra(Z_REG(res_addr)) +//| SET_ZVAL_LVAL dst_addr, Ra(Z_REG(res_addr)) +//|| } +//|| } else { +//| .if X64 +//|| if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { +//|| if (Z_MODE(dst_addr) == IS_REG) { +//| mov64 Ra(Z_REG(dst_addr)), ((uintptr_t)Z_LVAL_P(zv)) +//| SET_ZVAL_LVAL res_addr, Ra(Z_REG(dst_addr)) +//|| } else if (Z_MODE(res_addr) == IS_REG) { +//| mov64 Ra(Z_REG(res_addr)), ((uintptr_t)Z_LVAL_P(zv)) +//| SET_ZVAL_LVAL dst_addr, Ra(Z_REG(res_addr)) +//|| } else { +//| mov64 Ra(tmp_reg), ((uintptr_t)Z_LVAL_P(zv)) +//| SET_ZVAL_LVAL dst_addr, Ra(tmp_reg) +//| SET_ZVAL_LVAL res_addr, Ra(tmp_reg) +//|| } +//|| } else if (Z_MODE(dst_addr) == IS_REG) { +//| SET_ZVAL_LVAL dst_addr, Z_LVAL_P(zv) +//| SET_ZVAL_LVAL res_addr, Ra(Z_REG(dst_addr)) +//|| } else if (Z_MODE(res_addr) == IS_REG) { +//| SET_ZVAL_LVAL res_addr, Z_LVAL_P(zv) +//| SET_ZVAL_LVAL dst_addr, Ra(Z_REG(res_addr)) +//|| } else { +//| SET_ZVAL_LVAL dst_addr, Z_LVAL_P(zv) +//| SET_ZVAL_LVAL res_addr, Z_LVAL_P(zv) +//|| } +//| .else +//|| if (Z_MODE(dst_addr) == IS_REG) { +//| SET_ZVAL_LVAL dst_addr, Z_LVAL_P(zv) +//| SET_ZVAL_LVAL res_addr, Ra(Z_REG(dst_addr)) +//|| } else if (Z_MODE(res_addr) == IS_REG) { +//| SET_ZVAL_LVAL res_addr, Z_LVAL_P(zv) +//| SET_ZVAL_LVAL dst_addr, Ra(Z_REG(res_addr)) +//|| } else { +//| SET_ZVAL_LVAL dst_addr, Z_LVAL_P(zv) +//| SET_ZVAL_LVAL res_addr, Z_LVAL_P(zv) +//|| } +//| .endif +//|| } +//|| } +//|| if (Z_MODE(dst_addr) == IS_MEM_ZVAL) { +//|| if (dst_def_info == MAY_BE_DOUBLE) { +//|| if ((dst_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { +//| SET_ZVAL_TYPE_INFO dst_addr, IS_DOUBLE +//|| } +//|| } else if (((dst_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1<1 +//|| } +//| GC_ADDREF value_ptr_reg +//|1: +//|| } +//|.endmacro + +//|.macro TRY_ADDREF_2, val_info, type_flags_reg, value_ptr_reg +//|| if (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { +//|| if (val_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { +//| IF_NOT_REFCOUNTED type_flags_reg, >1 +//|| } +//| add dword [value_ptr_reg], 2 +//|1: +//|| } +//|.endmacro + +//|.macro ZVAL_DEREF, reg, info +//|| if (info & MAY_BE_REF) { +//| IF_NOT_Z_TYPE, reg, IS_REFERENCE, >1 +//| GET_Z_PTR reg, reg +//| add reg, offsetof(zend_reference, val) +//|1: +//|| } +//|.endmacro + +//|.macro SET_EX_OPLINE, op, tmp_reg +//|| if (op == last_valid_opline) { +//|| zend_jit_use_last_valid_opline(); +//| SAVE_IP +//|| } else { +//| ADDR_STORE aword EX->opline, op, tmp_reg +//|| if (!GCC_GLOBAL_REGS) { +//|| zend_jit_reset_last_valid_opline(); +//|| } +//|| } +//|.endmacro + +// zval should be in FCARG1a +//|.macro ZVAL_DTOR_FUNC, var_info, opline // arg1 must be in FCARG1a +//|| do { +//|| if (!((var_info) & MAY_BE_GUARD) +//|| && has_concrete_type((var_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { +//|| uint8_t type = concrete_type((var_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); +//|| if (type == IS_STRING && !ZEND_DEBUG) { +//| EXT_CALL _efree, r0 +//|| break; +//|| } else if (type == IS_ARRAY) { +//|| if ((var_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { +//|| if (opline && ((var_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { +//| SET_EX_OPLINE opline, r0 +//|| } +//| EXT_CALL zend_array_destroy, r0 +//|| } else { +//| EXT_CALL zend_jit_array_free, r0 +//|| } +//|| break; +//|| } else if (type == IS_OBJECT) { +//|| if (opline) { +//| SET_EX_OPLINE opline, r0 +//|| } +//| EXT_CALL zend_objects_store_del, r0 +//|| break; +//|| } +//|| } +//|| if (opline) { +//| SET_EX_OPLINE opline, r0 +//|| } +//| EXT_CALL rc_dtor_func, r0 +//|| } while(0); +//|.endmacro + +//|.macro ZVAL_PTR_DTOR, addr, op_info, gc, cold, opline +//|| if ((op_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { +//|| if ((op_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { +//| // if (Z_REFCOUNTED_P(cv)) { +//|| if (cold) { +//| IF_ZVAL_REFCOUNTED addr, >1 +//|.cold_code +//|1: +//|| } else { +//| IF_NOT_ZVAL_REFCOUNTED addr, >4 +//|| } +//|| } +//| // if (!Z_DELREF_P(cv)) { +//| GET_ZVAL_PTR FCARG1a, addr +//| GC_DELREF FCARG1a +//|| if (((op_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op_info)) { +//|| if (((op_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op_info)) { +//|| if (gc && (((op_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op_info) && ((op_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { +//| jnz >3 +//|| } else { +//| jnz >4 +//|| } +//|| } +//| // zval_dtor_func(r); +//| ZVAL_DTOR_FUNC op_info, opline +//|| if (gc && (((op_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op_info) && ((op_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { +//| jmp >4 +//|| } +//|3: +//|| } +//|| if (gc && (((op_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op_info) && ((op_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { +//|| if ((op_info) & (MAY_BE_REF|MAY_BE_GUARD)) { +//|| zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); +//| IF_NOT_ZVAL_TYPE addr, IS_REFERENCE, >1 +//| IF_NOT_ZVAL_COLLECTABLE ref_addr, >4 +//| GET_ZVAL_PTR FCARG1a, ref_addr +//|1: +//|| } +//| IF_GC_MAY_NOT_LEAK FCARG1a, >4 +//| // gc_possible_root(Z_COUNTED_P(z)) +//| EXT_CALL gc_possible_root, r0 +//|| } +//|| if (cold && ((op_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { +//| jmp >4 +//|.code +//|| } +//|4: +//|| } +//|.endmacro + +//|.macro FREE_OP, op_type, op, op_info, cold, opline +//|| if (op_type & (IS_VAR|IS_TMP_VAR)) { +//| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_FP, op.var), op_info, 0, cold, opline +//|| } +//|.endmacro + +//|.macro SEPARATE_ARRAY, addr, op_info, cold +//|| if (RC_MAY_BE_N(op_info)) { +//|| if (Z_REG(addr) != ZREG_FP) { +//| GET_ZVAL_LVAL ZREG_R0, addr +//|| if (RC_MAY_BE_1(op_info)) { +//| cmp dword [r0], 1 // if (GC_REFCOUNT() > 1) +//| jbe >2 +//|| } +//|| if (Z_REG(addr) != ZREG_FCARG1 || Z_OFFSET(addr) != 0) { +//| LOAD_ZVAL_ADDR FCARG1a, addr +//|| } +//| EXT_CALL zend_jit_zval_array_dup, r0 +//|2: +//| mov FCARG1a, r0 +//|| } else { +//| GET_ZVAL_LVAL ZREG_FCARG1, addr +//|| if (RC_MAY_BE_1(op_info)) { +//| cmp dword [FCARG1a], 1 // if (GC_REFCOUNT() > 1) +//|| if (cold) { +//| ja >1 +//|.cold_code +//|1: +//|| } else { +//| jbe >2 +//|| } +//|| } +//| IF_NOT_ZVAL_REFCOUNTED addr, >1 +//| GC_DELREF FCARG1a +//|1: +//| EXT_CALL zend_array_dup, r0 +//| SET_ZVAL_PTR addr, r0 +//| SET_ZVAL_TYPE_INFO addr, IS_ARRAY_EX +//| mov FCARG1a, r0 +//|| if (RC_MAY_BE_1(op_info)) { +//|| if (cold) { +//| jmp >2 +//|.code +//|| } +//|| } +//|2: +//|| } +//|| } else { +//| GET_ZVAL_LVAL ZREG_FCARG1, addr +//|| } +//|.endmacro + +//|.macro EFREE_REG_REFERENCE +//||#if ZEND_DEBUG +//| xor FCARG2a, FCARG2a // filename +//| .if X64WIN +//| xor CARG3d, CARG3d // lineno +//| xor CARG4, CARG4 +//| mov aword A5, 0 +//| EXT_CALL _efree, r0 +//| .elif X64 +//| xor CARG3d, CARG3d // lineno +//| xor CARG4, CARG4 +//| xor CARG5, CARG5 +//| EXT_CALL _efree, r0 +//| .else +//| sub r4, 4 +//| push 0 +//| push 0 +//| push 0 // lineno +//| EXT_CALL _efree, r0 +//| add r4, 4 +//| .endif +//||#else +//||#ifdef HAVE_BUILTIN_CONSTANT_P +//| EXT_CALL _efree_32, r0 +//||#else +//| EXT_CALL _efree, r0 +//||#endif +//||#endif +//|.endmacro + +//|.macro EFREE_REFERENCE, ptr +//| mov FCARG1a, ptr +//| EFREE_REG_REFERENCE +//|.endmacro + +//|.macro EMALLOC, size, op_array, opline +//||#if ZEND_DEBUG +//|| const char *filename = op_array->filename ? op_array->filename->val : NULL; +//| mov FCARG1a, size +//| LOAD_ADDR FCARG2a, filename +//| .if X64WIN +//| mov CARG3d, opline->lineno +//| xor CARG4, CARG4 +//| mov aword A5, 0 +//| EXT_CALL _emalloc, r0 +//| .elif X64 +//| mov CARG3d, opline->lineno +//| xor CARG4, CARG4 +//| xor CARG5, CARG5 +//| EXT_CALL _emalloc, r0 +//| .else +//| sub r4, 4 +//| push 0 +//| push 0 +//| push opline->lineno +//| EXT_CALL _emalloc, r0 +//| add r4, 4 +//| .endif +//||#else +//||#ifdef HAVE_BUILTIN_CONSTANT_P +//|| if (size > 24 && size <= 32) { +//| EXT_CALL _emalloc_32, r0 +//|| } else { +//| mov FCARG1a, size +//| EXT_CALL _emalloc, r0 +//|| } +//||#else +//| mov FCARG1a, size +//| EXT_CALL _emalloc, r0 +//||#endif +//||#endif +//|.endmacro + +//|.macro OBJ_RELEASE, reg, exit_label +//| GC_DELREF Ra(reg) +//| jne >1 +//| // zend_objects_store_del(obj); +//|| if (reg != ZREG_FCARG1) { +//| mov FCARG1a, Ra(reg) +//|| } +//| EXT_CALL zend_objects_store_del, r0 +//| jmp exit_label +//|1: +//| IF_GC_MAY_NOT_LEAK Ra(reg), >1 +//| // gc_possible_root(obj) +//|| if (reg != ZREG_FCARG1) { +//| mov FCARG1a, Ra(reg) +//|| } +//| EXT_CALL gc_possible_root, r0 +//|1: +//|.endmacro + +//|.macro UNDEFINED_OFFSET, opline +//|| if (opline == last_valid_opline) { +//|| zend_jit_use_last_valid_opline(); +//| call ->undefined_offset_ex +//|| } else { +//| SET_EX_OPLINE opline, r0 +//| call ->undefined_offset +//|| } +//|.endmacro + +//|.macro UNDEFINED_INDEX, opline +//|| if (opline == last_valid_opline) { +//|| zend_jit_use_last_valid_opline(); +//| call ->undefined_index_ex +//|| } else { +//| SET_EX_OPLINE opline, r0 +//| call ->undefined_index +//|| } +//|.endmacro + +//|.macro CANNOT_ADD_ELEMENT, opline +//|| if (opline == last_valid_opline) { +//|| zend_jit_use_last_valid_opline(); +//| call ->cannot_add_element_ex +//|| } else { +//| SET_EX_OPLINE opline, r0 +//| call ->cannot_add_element +//|| } +//|.endmacro + +//|.macro ENDBR +//||#if defined (__CET__) && (__CET__ & 1) != 0 +//| .if X64 +//| endbr64 +//| .else +//| endbr32 +//| .endif +//||#endif +//|.endmacro + +#if defined (__CET__) && (__CET__ & 1) != 0 +# define ENDBR_PADDING 4 +#else +# define ENDBR_PADDING 0 +#endif + +static bool reuse_ip = 0; +static bool delayed_call_chain = 0; +static uint32_t delayed_call_level = 0; +static const zend_op *last_valid_opline = NULL; +static bool use_last_vald_opline = 0; +static bool track_last_valid_opline = 0; +static int jit_return_label = -1; +static uint32_t current_trace_num = 0; +static uint32_t allowed_opt_flags = 0; + +static void zend_jit_track_last_valid_opline(void) +{ + use_last_vald_opline = 0; + track_last_valid_opline = 1; +} + +static void zend_jit_use_last_valid_opline(void) +{ + if (track_last_valid_opline) { + use_last_vald_opline = 1; + track_last_valid_opline = 0; + } +} + +static bool zend_jit_trace_uses_initial_ip(void) +{ + return use_last_vald_opline; +} + +static void zend_jit_set_last_valid_opline(const zend_op *target_opline) +{ + if (!reuse_ip) { + track_last_valid_opline = 0; + last_valid_opline = target_opline; + } +} + +static void zend_jit_reset_last_valid_opline(void) +{ + track_last_valid_opline = 0; + last_valid_opline = NULL; +} + +static void zend_jit_start_reuse_ip(void) +{ + zend_jit_reset_last_valid_opline(); + reuse_ip = 1; +} + +static int zend_jit_reuse_ip(dasm_State **Dst) +{ + if (!reuse_ip) { + zend_jit_start_reuse_ip(); + //| // call = EX(call); + //| mov RX, EX->call + dasm_put(Dst, 0, Dt1(->call)); +#line 1702 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static void zend_jit_stop_reuse_ip(void) +{ + reuse_ip = 0; +} + +static int zend_jit_interrupt_handler_stub(dasm_State **Dst) +{ + //|->interrupt_handler: + //| SAVE_IP + dasm_put(Dst, 5); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 1715 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| //EG(vm_interrupt) = 0; + //| MEM_STORE_ZTS byte, executor_globals, vm_interrupt, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1717 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| //if (EG(timed_out)) { + //| MEM_CMP_ZTS byte, executor_globals, timed_out, 0, r0 + dasm_put(Dst, 38, (executor_globals_offset+offsetof(zend_executor_globals, vm_interrupt))); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1719 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je >1 + //| //zend_timeout(); + //| EXT_CALL zend_timeout, r0 + dasm_put(Dst, 44, (executor_globals_offset+offsetof(zend_executor_globals, timed_out))); + if (MAY_USE_32BIT_ADDR(zend_timeout)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_timeout)); + } else { + if (IS_SIGNED_32BIT(zend_timeout)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_timeout)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_timeout)), (unsigned int)((((ptrdiff_t)zend_timeout))>>32)); + } + dasm_put(Dst, 66); + } +#line 1722 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| //} else if (zend_interrupt_function) { + dasm_put(Dst, 70); +#line 1724 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (zend_interrupt_function) { + //| //zend_interrupt_function(execute_data); + //|.if X64 + //| mov CARG1, FP + //| EXT_CALL zend_interrupt_function, r0 + dasm_put(Dst, 73); + if (MAY_USE_32BIT_ADDR(zend_interrupt_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_interrupt_function)); + } else { + if (IS_SIGNED_32BIT(zend_interrupt_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_interrupt_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_interrupt_function)), (unsigned int)((((ptrdiff_t)zend_interrupt_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 1729 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| mov aword A1, FP + //| EXT_CALL zend_interrupt_function, r0 + //|.endif + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1734 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je >1 + //| EXT_CALL zend_jit_exception_in_interrupt_handler_helper, r0 + dasm_put(Dst, 78, (executor_globals_offset+offsetof(zend_executor_globals, exception))); + if (MAY_USE_32BIT_ADDR(zend_jit_exception_in_interrupt_handler_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_exception_in_interrupt_handler_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_exception_in_interrupt_handler_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_exception_in_interrupt_handler_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_exception_in_interrupt_handler_helper)), (unsigned int)((((ptrdiff_t)zend_jit_exception_in_interrupt_handler_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 1736 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| //ZEND_VM_ENTER(); + //| //execute_data = EG(current_execute_data); + //| MEM_LOAD_ZTS FP, aword, executor_globals, current_execute_data, r0 + dasm_put(Dst, 88); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1740 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_IP + dasm_put(Dst, 92, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 0, Dt1(->opline)); + } +#line 1741 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| //ZEND_VM_CONTINUE() + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 1745 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 1746 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| JMP_IP + dasm_put(Dst, 115); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 1749 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, 1 // ZEND_VM_ENTER + //| ret + dasm_put(Dst, 120); +#line 1755 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_exception_handler_stub(dasm_State **Dst) +{ + //|->exception_handler: + dasm_put(Dst, 143); +#line 1763 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + const void *handler = zend_get_opcode_handler_func(EG(exception_op)); + + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 1767 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL handler, r0 + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 53, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 66); + } +#line 1768 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 1769 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + const void *handler = EG(exception_op)->handler; + + if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| EXT_JMP handler, r0 + dasm_put(Dst, 115); + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 146, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 150); + } +#line 1775 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG1a, FP + //| EXT_CALL handler, r0 + dasm_put(Dst, 73); + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 53, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 66); + } +#line 1778 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| test eax, eax + //| jl >1 + //| mov r0, 1 // ZEND_VM_ENTER + //|1: + //| ret + dasm_put(Dst, 154); +#line 1786 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + return 1; +} + +static int zend_jit_exception_handler_undef_stub(dasm_State **Dst) +{ + //|->exception_handler_undef: + //| MEM_LOAD_ZTS r0, aword, executor_globals, opline_before_exception, r0 + dasm_put(Dst, 185); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1796 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test byte OP:r0->result_type, (IS_TMP_VAR|IS_VAR) + //| jz >1 + //| mov eax, dword OP:r0->result.var + //| SET_Z_TYPE_INFO FP + r0, IS_UNDEF + //|1: + //| jmp ->exception_handler + dasm_put(Dst, 189, (executor_globals_offset+offsetof(zend_executor_globals, opline_before_exception)), Dt2(->result_type), (IS_TMP_VAR|IS_VAR), Dt2(->result.var), offsetof(zval,u1.type_info), IS_UNDEF); +#line 1802 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + + +static int zend_jit_exception_handler_free_op1_op2_stub(dasm_State **Dst) +{ + //|->exception_handler_free_op1_op2: + //| UNDEF_OPLINE_RESULT_IF_USED + //| test byte OP:RX->op1_type, (IS_TMP_VAR|IS_VAR) + //| je >9 + //| mov eax, dword OP:RX->op1.var + //| add r0, FP + //| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0), MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF, 0, 0, NULL + dasm_put(Dst, 219, Dt2(->result_type), (IS_TMP_VAR|IS_VAR), Dt2(->result.var), offsetof(zval,u1.type_info), IS_UNDEF, Dt2(->op1_type), (IS_TMP_VAR|IS_VAR), Dt2(->op1.var)); + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))); + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_1(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) + && has_concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 1816 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| test byte OP:RX->op2_type, (IS_TMP_VAR|IS_VAR) + //| je >9 + //| mov eax, dword OP:RX->op2.var + //| add r0, FP + //| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0), MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF, 0, 0, NULL + dasm_put(Dst, 378, Dt2(->op2_type), (IS_TMP_VAR|IS_VAR), Dt2(->op2.var)); + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))); + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_1(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) + && has_concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 1822 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| jmp ->exception_handler + dasm_put(Dst, 399); +#line 1824 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_exception_handler_free_op2_stub(dasm_State **Dst) +{ + //|->exception_handler_free_op2: + //| MEM_LOAD_ZTS RX, aword, executor_globals, opline_before_exception, r0 + dasm_put(Dst, 406); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1831 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| UNDEF_OPLINE_RESULT_IF_USED + //| test byte OP:RX->op2_type, (IS_TMP_VAR|IS_VAR) + //| je >9 + //| mov eax, dword OP:RX->op2.var + //| add r0, FP + //| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0), MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF, 0, 0, NULL + dasm_put(Dst, 410, (executor_globals_offset+offsetof(zend_executor_globals, opline_before_exception)), Dt2(->result_type), (IS_TMP_VAR|IS_VAR), Dt2(->result.var), offsetof(zval,u1.type_info), IS_UNDEF, Dt2(->op2_type), (IS_TMP_VAR|IS_VAR), Dt2(->op2.var)); + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))); + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_1(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) + && has_concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 1837 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| jmp ->exception_handler + dasm_put(Dst, 399); +#line 1839 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_leave_function_stub(dasm_State **Dst) +{ + //|->leave_function_handler: + //| mov FCARG1d, dword [FP + offsetof(zend_execute_data, This.u1.type_info)] + dasm_put(Dst, 456, offsetof(zend_execute_data, This.u1.type_info)); +#line 1846 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| test FCARG1d, ZEND_CALL_TOP + //| jnz >1 + //| EXT_CALL zend_jit_leave_nested_func_helper, r0 + dasm_put(Dst, 463, ZEND_CALL_TOP); + if (MAY_USE_32BIT_ADDR(zend_jit_leave_nested_func_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_leave_nested_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_leave_nested_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_leave_nested_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_leave_nested_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_leave_nested_func_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 1850 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 1851 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 1852 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| EXT_CALL zend_jit_leave_top_func_helper, r0 + dasm_put(Dst, 70); + if (MAY_USE_32BIT_ADDR(zend_jit_leave_top_func_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_leave_top_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_leave_top_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_leave_top_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_leave_top_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_leave_top_func_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 1854 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 1855 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 1856 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (GCC_GLOBAL_REGS) { + //| add r4, SPAD + dasm_put(Dst, 115); +#line 1859 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG2a, FP + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD + dasm_put(Dst, 472); +#line 1864 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test FCARG1d, ZEND_CALL_TOP + //| jnz >1 + //| EXT_JMP zend_jit_leave_nested_func_helper, r0 + dasm_put(Dst, 463, ZEND_CALL_TOP); + if (MAY_USE_32BIT_ADDR(zend_jit_leave_nested_func_helper)) { + dasm_put(Dst, 146, (ptrdiff_t)(zend_jit_leave_nested_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_leave_nested_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_leave_nested_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_leave_nested_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_leave_nested_func_helper))>>32)); + } + dasm_put(Dst, 150); + } +#line 1868 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| EXT_JMP zend_jit_leave_top_func_helper, r0 + dasm_put(Dst, 70); + if (MAY_USE_32BIT_ADDR(zend_jit_leave_top_func_helper)) { + dasm_put(Dst, 146, (ptrdiff_t)(zend_jit_leave_top_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_leave_top_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_leave_top_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_leave_top_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_leave_top_func_helper))>>32)); + } + dasm_put(Dst, 150); + } +#line 1870 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_leave_throw_stub(dasm_State **Dst) +{ + //|->leave_throw_handler: + //| // if (opline->opcode != ZEND_HANDLE_EXCEPTION) { + dasm_put(Dst, 491); +#line 1879 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (GCC_GLOBAL_REGS) { + //| cmp byte OP:IP->opcode, ZEND_HANDLE_EXCEPTION + //| je >5 + //| // EG(opline_before_exception) = opline; + //| MEM_STORE_ZTS aword, executor_globals, opline_before_exception, IP, r0 + dasm_put(Dst, 494, Dt2(->opcode), ZEND_HANDLE_EXCEPTION); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1884 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|5: + //| // opline = EG(exception_op); + //| LOAD_IP_ADDR_ZTS executor_globals, exception_op + dasm_put(Dst, 505, (executor_globals_offset+offsetof(zend_executor_globals, opline_before_exception))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 512, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 518, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 535, (executor_globals_offset + offsetof(zend_executor_globals, exception_op))); + } else { + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 512, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 518, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 540, (executor_globals_offset + offsetof(zend_executor_globals, exception_op)), Dt1(->opline)); + } +#line 1887 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov aword EX->opline, IP + //| // HANDLE_EXCEPTION() + //| jmp ->exception_handler + dasm_put(Dst, 549, Dt1(->opline)); +#line 1890 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_IP FCARG1a + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 558); + } else { + dasm_put(Dst, 563, Dt1(->opline)); + } +#line 1892 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp byte OP:FCARG1a->opcode, ZEND_HANDLE_EXCEPTION + //| je >5 + //| // EG(opline_before_exception) = opline; + //| MEM_STORE_ZTS aword, executor_globals, opline_before_exception, FCARG1a, r0 + dasm_put(Dst, 495, Dt2(->opcode), ZEND_HANDLE_EXCEPTION); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1896 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|5: + //| // opline = EG(exception_op); + //| LOAD_IP_ADDR_ZTS executor_globals, exception_op + dasm_put(Dst, 568, (executor_globals_offset+offsetof(zend_executor_globals, opline_before_exception))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 512, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 518, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 535, (executor_globals_offset + offsetof(zend_executor_globals, exception_op))); + } else { + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 512, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 518, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 540, (executor_globals_offset + offsetof(zend_executor_globals, exception_op)), Dt1(->opline)); + } +#line 1899 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, 2 // ZEND_VM_LEAVE + //| ret + dasm_put(Dst, 575); +#line 1904 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_icall_throw_stub(dasm_State **Dst) +{ + //|->icall_throw_handler: + //| // zend_rethrow_exception(zend_execute_data *execute_data) + //| mov IP, aword EX->opline + //| // if (EX(opline)->opcode != ZEND_HANDLE_EXCEPTION) { + //| cmp byte OP:IP->opcode, ZEND_HANDLE_EXCEPTION + //| je >1 + //| // EG(opline_before_exception) = opline; + //| MEM_STORE_ZTS aword, executor_globals, opline_before_exception, IP, r0 + dasm_put(Dst, 598, Dt1(->opline), Dt2(->opcode), ZEND_HANDLE_EXCEPTION); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 1919 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // opline = EG(exception_op); + //| LOAD_IP_ADDR_ZTS executor_globals, exception_op + dasm_put(Dst, 615, (executor_globals_offset+offsetof(zend_executor_globals, opline_before_exception))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 512, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 518, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 535, (executor_globals_offset + offsetof(zend_executor_globals, exception_op))); + } else { + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 512, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 518, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 540, (executor_globals_offset + offsetof(zend_executor_globals, exception_op)), Dt1(->opline)); + } +#line 1922 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (GCC_GLOBAL_REGS) { + //| mov aword EX->opline, IP + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 1925 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // HANDLE_EXCEPTION() + //| jmp ->exception_handler + dasm_put(Dst, 214); +#line 1927 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_throw_cannot_pass_by_ref_stub(dasm_State **Dst) +{ + //|->throw_cannot_pass_by_ref: + //| mov r0, EX->opline + //| mov ecx, dword OP:r0->result.var + //| SET_Z_TYPE_INFO RX+r1, IS_UNDEF + //| // last EX(call) frame may be delayed + //| cmp RX, EX->call + //| je >1 + //| mov r1, EX->call + //| mov EX:RX->prev_execute_data, r1 + //| mov EX->call, RX + //|1: + //| mov RX, r0 + //| mov FCARG1d, dword OP:r0->op2.num + //| EXT_CALL zend_cannot_pass_by_reference, r0 + dasm_put(Dst, 622, Dt1(->opline), Dt2(->result.var), offsetof(zval,u1.type_info), IS_UNDEF, Dt1(->call), Dt1(->call), Dt1(->prev_execute_data), Dt1(->call), Dt2(->op2.num)); + if (MAY_USE_32BIT_ADDR(zend_cannot_pass_by_reference)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_cannot_pass_by_reference)); + } else { + if (IS_SIGNED_32BIT(zend_cannot_pass_by_reference)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_cannot_pass_by_reference)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_cannot_pass_by_reference)), (unsigned int)((((ptrdiff_t)zend_cannot_pass_by_reference))>>32)); + } + dasm_put(Dst, 66); + } +#line 1947 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp byte OP:RX->op1_type, IS_TMP_VAR + //| jne >9 + //| mov eax, dword OP:RX->op1.var + //| add r0, FP + //| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0), MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF, 0, 0, NULL + dasm_put(Dst, 667, Dt2(->op1_type), IS_TMP_VAR, Dt2(->op1.var)); + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))); + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_1(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF)) { + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) + && has_concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 1952 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| jmp ->exception_handler + dasm_put(Dst, 399); +#line 1954 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_undefined_offset_ex_stub(dasm_State **Dst) +{ + //|->undefined_offset_ex: + //| SAVE_IP + dasm_put(Dst, 685); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 1962 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->undefined_offset + dasm_put(Dst, 688); +#line 1963 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_undefined_offset_stub(dasm_State **Dst) +{ + //|->undefined_offset: + dasm_put(Dst, 693); + if (!GCC_GLOBAL_REGS) { +#line 1971 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, FP + dasm_put(Dst, 73); + } +#line 1973 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_JMP zend_jit_undefined_long_key, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_long_key)) { + dasm_put(Dst, 146, (ptrdiff_t)(zend_jit_undefined_long_key)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_long_key)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_long_key)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_long_key)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_long_key))>>32)); + } + dasm_put(Dst, 150); + } +#line 1974 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_undefined_index_ex_stub(dasm_State **Dst) +{ + //|->undefined_index_ex: + //| SAVE_IP + dasm_put(Dst, 696); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 1982 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->undefined_index + dasm_put(Dst, 699); +#line 1983 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_undefined_index_stub(dasm_State **Dst) +{ + //|->undefined_index: + dasm_put(Dst, 704); + if (!GCC_GLOBAL_REGS) { +#line 1991 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, FP + dasm_put(Dst, 73); + } +#line 1993 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_JMP zend_jit_undefined_string_key, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_string_key)) { + dasm_put(Dst, 146, (ptrdiff_t)(zend_jit_undefined_string_key)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_string_key)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_string_key)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_string_key)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_string_key))>>32)); + } + dasm_put(Dst, 150); + } +#line 1994 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_cannot_add_element_ex_stub(dasm_State **Dst) +{ + //|->cannot_add_element_ex: + //| SAVE_IP + dasm_put(Dst, 707); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 2002 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->cannot_add_element + dasm_put(Dst, 710); +#line 2003 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_cannot_add_element_stub(dasm_State **Dst) +{ + //|->cannot_add_element: + //|.if X64WIN + //| sub r4, 0x28 + //|.elif X64 + //| sub r4, 8 + //|.else + //| sub r4, 12 + //|.endif + //| mov r0, EX->opline + //| cmp byte OP:r0->result_type, IS_UNUSED + //| jz >1 + //| mov eax, dword OP:r0->result.var + //| SET_Z_TYPE_INFO FP + r0, IS_NULL + //|1: + //|.if X64WIN + //| xor CARG1, CARG1 + //| LOAD_ADDR CARG2, "Cannot add element to the array as the next element is already occupied" + //| EXT_CALL zend_throw_error, r0 + //| add r4, 0x28 + //|.elif X64 + //| xor CARG1, CARG1 + //| LOAD_ADDR CARG2, "Cannot add element to the array as the next element is already occupied" + dasm_put(Dst, 715, Dt1(->opline), Dt2(->result_type), IS_UNUSED, Dt2(->result.var), offsetof(zval,u1.type_info), IS_NULL); + if (IS_SIGNED_32BIT("Cannot add element to the array as the next element is already occupied")) { + dasm_put(Dst, 751, ((ptrdiff_t)"Cannot add element to the array as the next element is already occupied")); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)"Cannot add element to the array as the next element is already occupied")), (unsigned int)((((ptrdiff_t)"Cannot add element to the array as the next element is already occupied"))>>32)); + } +#line 2031 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_throw_error, r0 + if (MAY_USE_32BIT_ADDR(zend_throw_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_throw_error)); + } else { + if (IS_SIGNED_32BIT(zend_throw_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_throw_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_throw_error)), (unsigned int)((((ptrdiff_t)zend_throw_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 2032 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| add r4, 8 + //|.else + //| sub r4, 8 + //| push "Cannot add element to the array as the next element is already occupied" + //| push 0 + //| EXT_CALL zend_throw_error, r0 + //| add r4, 28 + //|.endif + //| ret + dasm_put(Dst, 761); +#line 2041 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_undefined_function_stub(dasm_State **Dst) +{ + //|->undefined_function: + //| mov r0, aword EX->opline + //|.if X64 + //| xor CARG1, CARG1 + //| LOAD_ADDR CARG2, "Call to undefined function %s()" + dasm_put(Dst, 767, Dt1(->opline)); + if (IS_SIGNED_32BIT("Call to undefined function %s()")) { + dasm_put(Dst, 751, ((ptrdiff_t)"Call to undefined function %s()")); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)"Call to undefined function %s()")), (unsigned int)((((ptrdiff_t)"Call to undefined function %s()"))>>32)); + } +#line 2052 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| movsxd CARG3, dword [r0 + offsetof(zend_op, op2.constant)] + //| mov CARG3, aword [r0 + CARG3] + //| add CARG3, offsetof(zend_string, val) + //| EXT_CALL zend_throw_error, r0 + dasm_put(Dst, 778, offsetof(zend_op, op2.constant), offsetof(zend_string, val)); + if (MAY_USE_32BIT_ADDR(zend_throw_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_throw_error)); + } else { + if (IS_SIGNED_32BIT(zend_throw_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_throw_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_throw_error)), (unsigned int)((((ptrdiff_t)zend_throw_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 2056 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| mov r0, aword [r0 + offsetof(zend_op, op2.zv)] + //| mov r0, aword [r0] + //| add r0, offsetof(zend_string, val) + //| mov aword A3, r0 + //| mov aword A2, "Call to undefined function %s()" + //| mov aword A1, 0 + //| EXT_CALL zend_throw_error, r0 + //|.endif + //| jmp ->exception_handler + dasm_put(Dst, 214); +#line 2066 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_negative_shift_stub(dasm_State **Dst) +{ + //|->negative_shift: + //| mov RX, EX->opline + //|.if X64 + //|.if WIN + //| LOAD_ADDR CARG1, &zend_ce_arithmetic_error + //| mov CARG1, aword [CARG1] + //|.else + //| LOAD_ADDR CARG1, zend_ce_arithmetic_error + dasm_put(Dst, 791, Dt1(->opline)); + if (IS_SIGNED_32BIT(zend_ce_arithmetic_error)) { + dasm_put(Dst, 798, ((ptrdiff_t)zend_ce_arithmetic_error)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)zend_ce_arithmetic_error)), (unsigned int)((((ptrdiff_t)zend_ce_arithmetic_error))>>32)); + } +#line 2079 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.endif + //| LOAD_ADDR CARG2, "Bit shift by negative number" + if (IS_SIGNED_32BIT("Bit shift by negative number")) { + dasm_put(Dst, 751, ((ptrdiff_t)"Bit shift by negative number")); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)"Bit shift by negative number")), (unsigned int)((((ptrdiff_t)"Bit shift by negative number"))>>32)); + } +#line 2081 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_throw_error, r0 + if (MAY_USE_32BIT_ADDR(zend_throw_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_throw_error)); + } else { + if (IS_SIGNED_32BIT(zend_throw_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_throw_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_throw_error)), (unsigned int)((((ptrdiff_t)zend_throw_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 2082 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 8 + //| push "Bit shift by negative number" + //|.if WIN + //| LOAD_ADDR r0, &zend_ce_arithmetic_error + //| push aword [r0] + //|.else + //| PUSH_ADDR zend_ce_arithmetic_error, r0 + //|.endif + //| EXT_CALL zend_throw_error, r0 + //| add r4, 16 + //|.endif + //| jmp ->exception_handler_free_op1_op2 + dasm_put(Dst, 808); +#line 2095 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_mod_by_zero_stub(dasm_State **Dst) +{ + //|->mod_by_zero: + //| mov RX, EX->opline + //|.if X64 + //|.if WIN + //| LOAD_ADDR CARG1, &zend_ce_division_by_zero_error + //| mov CARG1, aword [CARG1] + //|.else + //| LOAD_ADDR CARG1, zend_ce_division_by_zero_error + dasm_put(Dst, 813, Dt1(->opline)); + if (IS_SIGNED_32BIT(zend_ce_division_by_zero_error)) { + dasm_put(Dst, 798, ((ptrdiff_t)zend_ce_division_by_zero_error)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)zend_ce_division_by_zero_error)), (unsigned int)((((ptrdiff_t)zend_ce_division_by_zero_error))>>32)); + } +#line 2108 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.endif + //| LOAD_ADDR CARG2, "Modulo by zero" + if (IS_SIGNED_32BIT("Modulo by zero")) { + dasm_put(Dst, 751, ((ptrdiff_t)"Modulo by zero")); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)"Modulo by zero")), (unsigned int)((((ptrdiff_t)"Modulo by zero"))>>32)); + } +#line 2110 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_throw_error, r0 + if (MAY_USE_32BIT_ADDR(zend_throw_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_throw_error)); + } else { + if (IS_SIGNED_32BIT(zend_throw_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_throw_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_throw_error)), (unsigned int)((((ptrdiff_t)zend_throw_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 2111 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 8 + //| push "Modulo by zero" + //|.if WIN + //| LOAD_ADDR r0, &zend_ce_division_by_zero_error + //| push aword [r0] + //|.else + //| PUSH_ADDR zend_ce_division_by_zero_error, r0 + //|.endif + //| EXT_CALL zend_throw_error, r0 + //| add r4, 16 + //|.endif + //| jmp ->exception_handler_free_op1_op2 + dasm_put(Dst, 808); +#line 2124 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_invalid_this_stub(dasm_State **Dst) +{ + //|->invalid_this: + //| UNDEF_OPLINE_RESULT + //|.if X64 + //| xor CARG1, CARG1 + //| LOAD_ADDR CARG2, "Using $this when not in object context" + dasm_put(Dst, 820, Dt1(->opline), Dt2(->result.var), offsetof(zval,u1.type_info), IS_UNDEF); + if (IS_SIGNED_32BIT("Using $this when not in object context")) { + dasm_put(Dst, 751, ((ptrdiff_t)"Using $this when not in object context")); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)"Using $this when not in object context")), (unsigned int)((((ptrdiff_t)"Using $this when not in object context"))>>32)); + } +#line 2134 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_throw_error, r0 + if (MAY_USE_32BIT_ADDR(zend_throw_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_throw_error)); + } else { + if (IS_SIGNED_32BIT(zend_throw_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_throw_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_throw_error)), (unsigned int)((((ptrdiff_t)zend_throw_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 2135 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 8 + //| push "Using $this when not in object context" + //| push 0 + //| EXT_CALL zend_throw_error, r0 + //| add r4, 16 + //|.endif + //| jmp ->exception_handler + dasm_put(Dst, 214); +#line 2143 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_double_one_stub(dasm_State **Dst) +{ + //|->one: + //|.dword 0, 0x3ff00000 + dasm_put(Dst, 841); +#line 2150 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_hybrid_runtime_jit_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID) { + return 1; + } + + //|->hybrid_runtime_jit: + //| EXT_CALL zend_runtime_jit, r0 + dasm_put(Dst, 853); + if (MAY_USE_32BIT_ADDR(zend_runtime_jit)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_runtime_jit)); + } else { + if (IS_SIGNED_32BIT(zend_runtime_jit)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_runtime_jit)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_runtime_jit)), (unsigned int)((((ptrdiff_t)zend_runtime_jit))>>32)); + } + dasm_put(Dst, 66); + } +#line 2161 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 2162 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_hybrid_profile_jit_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID) { + return 1; + } + + //|->hybrid_profile_jit: + //| // ++zend_jit_profile_counter; + //| .if X64 + //| LOAD_ADDR r0, &zend_jit_profile_counter + dasm_put(Dst, 856); + if (IS_SIGNED_32BIT(&zend_jit_profile_counter)) { + dasm_put(Dst, 56, ((ptrdiff_t)&zend_jit_profile_counter)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)&zend_jit_profile_counter)), (unsigned int)((((ptrdiff_t)&zend_jit_profile_counter))>>32)); + } +#line 2175 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| inc aword [r0] + //| .else + //| inc aword [&zend_jit_profile_counter] + //| .endif + //| // op_array = (zend_op_array*)EX(func); + //| mov r0, EX->func + //| // run_time_cache = EX(run_time_cache); + //| mov r2, EX->run_time_cache + //| // jit_extension = (const void*)ZEND_FUNC_INFO(op_array); + //| mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| // ++ZEND_COUNTER_INFO(op_array) + //| inc aword [r2 + zend_jit_profile_counter_rid * sizeof(void*)] + //| // return ((zend_vm_opcode_handler_t)jit_extension->orig_handler)() + //| jmp aword [r0 + offsetof(zend_jit_op_array_extension, orig_handler)] + dasm_put(Dst, 859, Dt1(->func), Dt1(->run_time_cache), offsetof(zend_op_array, reserved[zend_func_info_rid]), zend_jit_profile_counter_rid * sizeof(void*), offsetof(zend_jit_op_array_extension, orig_handler)); +#line 2189 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_hybrid_hot_code_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID) { + return 1; + } + + //|->hybrid_hot_code: + //| mov word [r2], ZEND_JIT_COUNTER_INIT + //| mov FCARG1a, FP + //| GET_IP FCARG2a + dasm_put(Dst, 885, ZEND_JIT_COUNTER_INIT); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 896); + } else { + dasm_put(Dst, 901, Dt1(->opline)); + } +#line 2202 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_hot_func, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_hot_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_hot_func)); + } else { + if (IS_SIGNED_32BIT(zend_jit_hot_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_hot_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_hot_func)), (unsigned int)((((ptrdiff_t)zend_jit_hot_func))>>32)); + } + dasm_put(Dst, 66); + } +#line 2203 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 2204 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +/* + * This code is based Mike Pall's "Hashed profile counters" idea, implemented + * in LuaJIT. The full description may be found in "LuaJIT 2.0 intellectual + * property disclosure and research opportunities" email + * at http://lua-users.org/lists/lua-l/2009-11/msg00089.html + * + * In addition we use a variation of Knuth's multiplicative hash function + * described at https://code.i-harness.com/en/q/a21ce + * + * uint64_t hash(uint64_t x) { + * x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; + * x = (x ^ (x >> 27)) * 0x94d049bb133111eb; + * x = x ^ (x >> 31); + * return x; + * } + * + * uint_32_t hash(uint32_t x) { + * x = ((x >> 16) ^ x) * 0x45d9f3b; + * x = ((x >> 16) ^ x) * 0x45d9f3b; + * x = (x >> 16) ^ x; + * return x; + * } + * + */ +static int zend_jit_hybrid_hot_counter_stub(dasm_State **Dst, uint32_t cost) +{ + //| ENDBR + #if defined (__CET__) && (__CET__ & 1) != 0 + dasm_put(Dst, 906); + #endif +#line 2234 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX->func + //| mov r1, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r2, aword [r1 + offsetof(zend_jit_op_array_hot_extension, counter)] + //| sub word [r2], cost + //| jle ->hybrid_hot_code + //| GET_IP r2 + dasm_put(Dst, 913, Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_hot_extension, counter), cost); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 934); + } else { + dasm_put(Dst, 939, Dt1(->opline)); + } +#line 2240 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| sub r2, aword [r0 + offsetof(zend_op_array, opcodes)] + //| // divide by sizeof(zend_op) + //| .if X64 + dasm_put(Dst, 944, offsetof(zend_op_array, opcodes)); + ZEND_ASSERT(sizeof(zend_op) == 32); +#line 2244 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| sar r2, 2 + //| .else +#line 2247 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| imul r2, 0xb6db6db7 + //| .endif + //| .if X64 + //| jmp aword [r1+r2+offsetof(zend_jit_op_array_hot_extension, orig_handlers)] + //| .else + //| jmp aword [r1+r2+offsetof(zend_jit_op_array_hot_extension, orig_handlers)] + //| .endif + dasm_put(Dst, 949, offsetof(zend_jit_op_array_hot_extension, orig_handlers)); +#line 2254 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_hybrid_func_hot_counter_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID || !JIT_G(hot_func)) { + return 1; + } + + //|->hybrid_func_hot_counter: + dasm_put(Dst, 961); +#line 2264 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return zend_jit_hybrid_hot_counter_stub(Dst, + ((ZEND_JIT_COUNTER_INIT + JIT_G(hot_func) - 1) / JIT_G(hot_func))); +} + +static int zend_jit_hybrid_loop_hot_counter_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID || !JIT_G(hot_loop)) { + return 1; + } + + //|->hybrid_loop_hot_counter: + dasm_put(Dst, 964); +#line 2276 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return zend_jit_hybrid_hot_counter_stub(Dst, + ((ZEND_JIT_COUNTER_INIT + JIT_G(hot_loop) - 1) / JIT_G(hot_loop))); +} + +static int zend_jit_hybrid_hot_trace_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID) { + return 1; + } + + //|->hybrid_hot_trace: + //| mov word [r2], ZEND_JIT_COUNTER_INIT + //| mov FCARG1a, FP + //| GET_IP FCARG2a + dasm_put(Dst, 967, ZEND_JIT_COUNTER_INIT); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 896); + } else { + dasm_put(Dst, 901, Dt1(->opline)); + } +#line 2291 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_trace_hot_root, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_trace_hot_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_trace_hot_root)); + } else { + if (IS_SIGNED_32BIT(zend_jit_trace_hot_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_trace_hot_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_trace_hot_root)), (unsigned int)((((ptrdiff_t)zend_jit_trace_hot_root))>>32)); + } + dasm_put(Dst, 66); + } +#line 2292 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test eax, eax // TODO : remove this check at least for HYBRID VM ??? + //| jl >1 + //| MEM_LOAD_ZTS FP, aword, executor_globals, current_execute_data, r0 + dasm_put(Dst, 978); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 2295 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_IP + dasm_put(Dst, 92, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 0, Dt1(->opline)); + } +#line 2296 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 2297 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| EXT_JMP zend_jit_halt_op->handler, r0 + dasm_put(Dst, 70); + if (MAY_USE_32BIT_ADDR(zend_jit_halt_op->handler)) { + dasm_put(Dst, 146, (ptrdiff_t)(zend_jit_halt_op->handler)); + } else { + if (IS_SIGNED_32BIT(zend_jit_halt_op->handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_halt_op->handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_halt_op->handler)), (unsigned int)((((ptrdiff_t)zend_jit_halt_op->handler))>>32)); + } + dasm_put(Dst, 150); + } +#line 2299 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_hybrid_trace_counter_stub(dasm_State **Dst, uint32_t cost) +{ + //| ENDBR + #if defined (__CET__) && (__CET__ & 1) != 0 + dasm_put(Dst, 906); + #endif +#line 2305 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX->func + //| mov r1, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r1, aword [r1 + offsetof(zend_jit_op_array_trace_extension, offset)] + //| mov r2, aword [IP + r1 + offsetof(zend_op_trace_info, counter)] + //| sub word [r2], cost + //| jle ->hybrid_hot_trace + //| jmp aword [IP + r1] + dasm_put(Dst, 986, Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_trace_extension, offset), offsetof(zend_op_trace_info, counter), cost); +#line 2312 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_hybrid_func_trace_counter_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID || !JIT_G(hot_func)) { + return 1; + } + + //|->hybrid_func_trace_counter: + dasm_put(Dst, 1018); +#line 2322 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return zend_jit_hybrid_trace_counter_stub(Dst, + ((ZEND_JIT_COUNTER_INIT + JIT_G(hot_func) - 1) / JIT_G(hot_func))); +} + +static int zend_jit_hybrid_ret_trace_counter_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID || !JIT_G(hot_return)) { + return 1; + } + + //|->hybrid_ret_trace_counter: + dasm_put(Dst, 1021); +#line 2334 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return zend_jit_hybrid_trace_counter_stub(Dst, + ((ZEND_JIT_COUNTER_INIT + JIT_G(hot_return) - 1) / JIT_G(hot_return))); +} + +static int zend_jit_hybrid_loop_trace_counter_stub(dasm_State **Dst) +{ + if (zend_jit_vm_kind != ZEND_VM_KIND_HYBRID || !JIT_G(hot_loop)) { + return 1; + } + + //|->hybrid_loop_trace_counter: + dasm_put(Dst, 1024); +#line 2346 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return zend_jit_hybrid_trace_counter_stub(Dst, + ((ZEND_JIT_COUNTER_INIT + JIT_G(hot_loop) - 1) / JIT_G(hot_loop))); +} + +static int zend_jit_trace_halt_stub(dasm_State **Dst) +{ + //|->trace_halt: + dasm_put(Dst, 1027); +#line 2354 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 2356 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_JMP zend_jit_halt_op->handler, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_halt_op->handler)) { + dasm_put(Dst, 146, (ptrdiff_t)(zend_jit_halt_op->handler)); + } else { + if (IS_SIGNED_32BIT(zend_jit_halt_op->handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_halt_op->handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_halt_op->handler)), (unsigned int)((((ptrdiff_t)zend_jit_halt_op->handler))>>32)); + } + dasm_put(Dst, 150); + } +#line 2357 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| xor IP, IP // PC must be zero + //| ret + dasm_put(Dst, 1030); +#line 2361 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, -1 // ZEND_VM_RETURN + //| ret + dasm_put(Dst, 1040); +#line 2367 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_trace_exit_stub(dasm_State **Dst) +{ + //|->trace_exit: + //| + //| // Save CPU registers + //|.if X64 + //| sub r4, 16*8+16*8-8 /* CPU regs + SSE regs */ + //| mov aword [r4+15*8], r15 + //| mov aword [r4+11*8], r11 + //| mov aword [r4+10*8], r10 + //| mov aword [r4+9*8], r9 + //| mov aword [r4+8*8], r8 + //| mov aword [r4+7*8], rdi + //| mov aword [r4+6*8], rsi + //| mov aword [r4+2*8], rdx + //| mov aword [r4+1*8], rcx + //| mov aword [r4+0*8], rax + //| mov FCARG1a, aword [r4+16*8+16*8-8] // exit_num = POP + //| mov FCARG2a, r4 + //| movsd qword [r4+16*8+15*8], xmm15 + //| movsd qword [r4+16*8+14*8], xmm14 + //| movsd qword [r4+16*8+13*8], xmm13 + //| movsd qword [r4+16*8+12*8], xmm12 + //| movsd qword [r4+16*8+11*8], xmm11 + //| movsd qword [r4+16*8+10*8], xmm10 + //| movsd qword [r4+16*8+9*8], xmm9 + dasm_put(Dst, 1067, 16*8+16*8-8 /* CPU regs + SSE regs */, 15*8, 11*8, 10*8, 9*8, 8*8, 7*8, 6*8, 2*8, 1*8, 0*8, 16*8+16*8-8, 16*8+15*8, 16*8+14*8, 16*8+13*8, 16*8+12*8, 16*8+11*8, 16*8+10*8); +#line 2397 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| movsd qword [r4+16*8+8*8], xmm8 + //| movsd qword [r4+16*8+7*8], xmm7 + //| movsd qword [r4+16*8+6*8], xmm6 + //| movsd qword [r4+16*8+5*8], xmm5 + //| movsd qword [r4+16*8+4*8], xmm4 + //| movsd qword [r4+16*8+3*8], xmm3 + //| movsd qword [r4+16*8+2*8], xmm2 + //| movsd qword [r4+16*8+1*8], xmm1 + //| movsd qword [r4+16*8+0*8], xmm0 + //|.if X64WIN + //| sub r4, 32 /* shadow space */ + //|.endif + //|.else + //| sub r4, 8*4+8*8-4 /* CPU regs + SSE regs */ + //| mov aword [r4+7*4], edi + //| mov aword [r4+2*4], edx + //| mov aword [r4+1*4], ecx + //| mov aword [r4+0*4], eax + //| mov FCARG1a, aword [r4+8*4+8*8-4] // exit_num = POP + //| mov FCARG2a, r4 + //| movsd qword [r4+8*4+7*8], xmm7 + //| movsd qword [r4+8*4+6*8], xmm6 + //| movsd qword [r4+8*4+5*8], xmm5 + //| movsd qword [r4+8*4+4*8], xmm4 + //| movsd qword [r4+8*4+3*8], xmm3 + //| movsd qword [r4+8*4+2*8], xmm2 + //| movsd qword [r4+8*4+1*8], xmm1 + //| movsd qword [r4+8*4+0*8], xmm0 + //|.endif + //| + //| // EX(opline) = opline + //| SAVE_IP + dasm_put(Dst, 1198, 16*8+9*8, 16*8+8*8, 16*8+7*8, 16*8+6*8, 16*8+5*8, 16*8+4*8, 16*8+3*8, 16*8+2*8, 16*8+1*8, 16*8+0*8); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 2429 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // zend_jit_trace_exit(trace_num, exit_num) + //| EXT_CALL zend_jit_trace_exit, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_trace_exit)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_trace_exit)); + } else { + if (IS_SIGNED_32BIT(zend_jit_trace_exit)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_trace_exit)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_trace_exit)), (unsigned int)((((ptrdiff_t)zend_jit_trace_exit))>>32)); + } + dasm_put(Dst, 66); + } +#line 2431 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64WIN + //| add r4, 16*8+16*8+32 /* CPU regs + SSE regs + shadow space */ + //|.elif X64 + //| add r4, 16*8+16*8 /* CPU regs + SSE regs */ + //|.else + //| add r4, 8*4+8*8 /* CPU regs + SSE regs */ + //|.endif + dasm_put(Dst, 1281, 16*8+16*8 /* CPU regs + SSE regs */); +#line 2438 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| test eax, eax + //| jne >1 + dasm_put(Dst, 1286); +#line 2441 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| // execute_data = EG(current_execute_data) + //| MEM_LOAD_ZTS FP, aword, executor_globals, current_execute_data, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 2444 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // opline = EX(opline) + //| LOAD_IP + dasm_put(Dst, 92, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 0, Dt1(->opline)); + } +#line 2446 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 2449 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 2450 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| JMP_IP + dasm_put(Dst, 115); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 2453 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, 1 // ZEND_VM_ENTER + //| ret + dasm_put(Dst, 120); +#line 2459 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|1: + //| jl ->trace_halt + dasm_put(Dst, 1293); +#line 2463 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| // execute_data = EG(current_execute_data) + //| MEM_LOAD_ZTS FP, aword, executor_globals, current_execute_data, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 2466 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // opline = EX(opline) + //| LOAD_IP + dasm_put(Dst, 92, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 0, Dt1(->opline)); + } +#line 2468 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| // check for interrupt (try to avoid this ???) + //| MEM_CMP_ZTS byte, executor_globals, vm_interrupt, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 2471 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->interrupt_handler + dasm_put(Dst, 1300, (executor_globals_offset+offsetof(zend_executor_globals, vm_interrupt))); +#line 2472 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 2475 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX->func + //| mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)] + //| jmp aword [IP + r0] + dasm_put(Dst, 1309, Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_trace_extension, offset)); +#line 2479 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| mov r0, EX->func + //| mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)] + //| jmp aword [IP + r0] + dasm_put(Dst, 1327, Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_trace_extension, offset)); +#line 2485 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov IP, aword EX->opline + //| mov FCARG1a, FP + //| mov r0, EX->func + //| mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)] + //| call aword [IP + r0] + //| test eax, eax + //| jl ->trace_halt + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, 1 // ZEND_VM_ENTER + //| ret + dasm_put(Dst, 1349, Dt1(->opline), Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_trace_extension, offset)); +#line 2499 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_trace_escape_stub(dasm_State **Dst) +{ + //|->trace_escape: + //| + dasm_put(Dst, 1403); +#line 2508 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 2510 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 2511 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| JMP_IP + dasm_put(Dst, 115); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 2514 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, 1 // ZEND_VM_ENTER + //| ret + dasm_put(Dst, 120); +#line 2520 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +/* Keep 32 exit points in a single code block */ +#define ZEND_JIT_EXIT_POINTS_SPACING 4 // push byte + short jmp = bytes +#define ZEND_JIT_EXIT_POINTS_PER_GROUP 32 // number of continuous exit points + +static int zend_jit_trace_exit_group_stub(dasm_State **Dst, uint32_t n) +{ + uint32_t i; + + for (i = 0; i < ZEND_JIT_EXIT_POINTS_PER_GROUP - 1; i++) { + //| push byte i + //| .byte 0xeb, (4*(ZEND_JIT_EXIT_POINTS_PER_GROUP-i)-6) // jmp >1 + dasm_put(Dst, 1406, i, (4*(ZEND_JIT_EXIT_POINTS_PER_GROUP-i)-6)); +#line 2536 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| push byte i + //|// 1: + //| add aword [r4], n + //| jmp ->trace_exit + dasm_put(Dst, 1412, i, n); +#line 2541 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +#ifdef CONTEXT_THREADED_JIT +static int zend_jit_context_threaded_call_stub(dasm_State **Dst) +{ + //|->context_threaded_call: + //| pop r0 + dasm_put(Dst, 1425); +#line 2550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 2552 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp aword [IP] + dasm_put(Dst, 102); +#line 2553 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| jmp aword [IP] + dasm_put(Dst, 1429); +#line 2556 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + // TODO: context threading can't work without GLOBAL REGS because we have to change + // the value of execute_data in execute_ex() + //| mov FCARG1a, FP + //| mov r0, aword [FP] + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| jmp aword [r0] + dasm_put(Dst, 1438); +#line 2566 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} +#endif + +static int zend_jit_assign_const_stub(dasm_State **Dst) +{ + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); + uint32_t val_info = MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN; + + //|->assign_const: + //|.if X64WIN + //| sub r4, 0x28 + //|.elif X64 + //| sub r4, 8 + //|.else + //| sub r4, 12 + //|.endif + dasm_put(Dst, 1463); +#line 2585 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_assign_to_variable( + Dst, NULL, + var_addr, var_addr, -1, -1, + IS_CONST, val_addr, val_info, + 0, 0)) { + return 0; + } + //|.if X64WIN + //| add r4, 0x28 + //|.elif X64 + //| add r4, 8 + //|.else + //| add r4, 12 + //|.endif + //| ret + dasm_put(Dst, 761); +#line 2600 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_assign_tmp_stub(dasm_State **Dst) +{ + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); + uint32_t val_info = MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN; + + //|->assign_tmp: + //|.if X64WIN + //| sub r4, 0x28 + //|.elif X64 + //| sub r4, 8 + //|.else + //| sub r4, 12 + //|.endif + dasm_put(Dst, 1471); +#line 2617 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_assign_to_variable( + Dst, NULL, + var_addr, var_addr, -1, -1, + IS_TMP_VAR, val_addr, val_info, + 0, 0)) { + return 0; + } + //|.if X64WIN + //| add r4, 0x28 + //|.elif X64 + //| add r4, 8 + //|.else + //| add r4, 12 + //|.endif + //| ret + dasm_put(Dst, 761); +#line 2632 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_assign_var_stub(dasm_State **Dst) +{ + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); + uint32_t val_info = MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF; + + //|->assign_var: + //|.if X64WIN + //| sub r4, 0x28 + //|.elif X64 + //| sub r4, 8 + //|.else + //| sub r4, 12 + //|.endif + dasm_put(Dst, 1479); +#line 2649 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_assign_to_variable( + Dst, NULL, + var_addr, var_addr, -1, -1, + IS_VAR, val_addr, val_info, + 0, 0)) { + return 0; + } + //|.if X64WIN + //| add r4, 0x28 + //|.elif X64 + //| add r4, 8 + //|.else + //| add r4, 12 + //|.endif + //| ret + dasm_put(Dst, 761); +#line 2664 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_assign_cv_noref_stub(dasm_State **Dst) +{ + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); + uint32_t val_info = MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN/*|MAY_BE_UNDEF*/; + + //|->assign_cv_noref: + //|.if X64WIN + //| sub r4, 0x28 + //|.elif X64 + //| sub r4, 8 + //|.else + //| sub r4, 12 + //|.endif + dasm_put(Dst, 1487); +#line 2681 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_assign_to_variable( + Dst, NULL, + var_addr, var_addr, -1, -1, + IS_CV, val_addr, val_info, + 0, 0)) { + return 0; + } + //|.if X64WIN + //| add r4, 0x28 + //|.elif X64 + //| add r4, 8 + //|.else + //| add r4, 12 + //|.endif + //| ret + dasm_put(Dst, 761); +#line 2696 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_assign_cv_stub(dasm_State **Dst) +{ + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); + uint32_t val_info = MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN|MAY_BE_REF/*|MAY_BE_UNDEF*/; + + //|->assign_cv: + //|.if X64WIN + //| sub r4, 0x28 + //|.elif X64 + //| sub r4, 8 + //|.else + //| sub r4, 12 + //|.endif + dasm_put(Dst, 1495); +#line 2713 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_assign_to_variable( + Dst, NULL, + var_addr, var_addr, -1, -1, + IS_CV, val_addr, val_info, + 0, 0)) { + return 0; + } + //|.if X64WIN + //| add r4, 0x28 + //|.elif X64 + //| add r4, 8 + //|.else + //| add r4, 12 + //|.endif + //| ret + dasm_put(Dst, 761); +#line 2728 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static const zend_jit_stub zend_jit_stubs[] = { + JIT_STUB(interrupt_handler, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(exception_handler, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(exception_handler_undef, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(exception_handler_free_op1_op2, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(exception_handler_free_op2, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(leave_function, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(leave_throw, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(icall_throw, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(throw_cannot_pass_by_ref, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(undefined_offset, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(undefined_index, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(cannot_add_element, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(undefined_offset_ex, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(undefined_index_ex, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(cannot_add_element_ex, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(undefined_function, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(negative_shift, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(mod_by_zero, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(invalid_this, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(trace_halt, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(trace_exit, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(trace_escape, SP_ADJ_JIT, SP_ADJ_VM), + JIT_STUB(hybrid_runtime_jit, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_profile_jit, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_hot_code, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_func_hot_counter, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_loop_hot_counter, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_hot_trace, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_func_trace_counter, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_ret_trace_counter, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(hybrid_loop_trace_counter, SP_ADJ_VM, SP_ADJ_NONE), + JIT_STUB(assign_const, SP_ADJ_RET, SP_ADJ_ASSIGN), + JIT_STUB(assign_tmp, SP_ADJ_RET, SP_ADJ_ASSIGN), + JIT_STUB(assign_var, SP_ADJ_RET, SP_ADJ_ASSIGN), + JIT_STUB(assign_cv_noref, SP_ADJ_RET, SP_ADJ_ASSIGN), + JIT_STUB(assign_cv, SP_ADJ_RET, SP_ADJ_ASSIGN), + JIT_STUB(double_one, SP_ADJ_NONE, SP_ADJ_NONE), +#ifdef CONTEXT_THREADED_JIT + JIT_STUB(context_threaded_call, SP_ADJ_RET, SP_ADJ_NONE), +#endif +}; + +#if ZTS && defined(ZEND_WIN32) +extern uint32_t _tls_index; +extern char *_tls_start; +extern char *_tls_end; +#endif + +#ifdef HAVE_GDB +typedef struct _Unwind_Context _Unwind_Context; +typedef int (*_Unwind_Trace_Fn)(_Unwind_Context *, void *); +extern int _Unwind_Backtrace(_Unwind_Trace_Fn, void *); +extern uintptr_t _Unwind_GetCFA(_Unwind_Context *); + +typedef struct _zend_jit_unwind_arg { + int cnt; + uintptr_t cfa[3]; +} zend_jit_unwind_arg; + +static int zend_jit_unwind_cb(_Unwind_Context *ctx, void *a) +{ + zend_jit_unwind_arg *arg = (zend_jit_unwind_arg*)a; + arg->cfa[arg->cnt] = _Unwind_GetCFA(ctx); + arg->cnt++; + if (arg->cnt == 3) { + return 5; // _URC_END_OF_STACK + } + return 0; // _URC_NO_REASON; +} + +static void ZEND_FASTCALL zend_jit_touch_vm_stack_data(void *vm_stack_data) +{ + zend_jit_unwind_arg arg; + + memset(&arg, 0, sizeof(arg)); + _Unwind_Backtrace(zend_jit_unwind_cb, &arg); + if (arg.cnt == 3) { + sp_adj[SP_ADJ_VM] = arg.cfa[2] - arg.cfa[1]; + } +} + +extern void (ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data); + +static zend_never_inline void zend_jit_set_sp_adj_vm(void) +{ + void (ZEND_FASTCALL *orig_zend_touch_vm_stack_data)(void *); + + orig_zend_touch_vm_stack_data = zend_touch_vm_stack_data; + zend_touch_vm_stack_data = zend_jit_touch_vm_stack_data; + execute_ex(NULL); // set sp_adj[SP_ADJ_VM] + zend_touch_vm_stack_data = orig_zend_touch_vm_stack_data; +} +#endif + +static int zend_jit_setup(void) +{ + if (!zend_cpu_supports_sse2()) { + zend_error(E_CORE_ERROR, "CPU doesn't support SSE2"); + return FAILURE; + } + allowed_opt_flags = 0; + if (zend_cpu_supports_avx()) { + allowed_opt_flags |= ZEND_JIT_CPU_AVX; + } + +#if ZTS +# ifdef _WIN64 + tsrm_tls_index = _tls_index * sizeof(void*); + + /* To find offset of "_tsrm_ls_cache" in TLS segment we perform a linear scan of local TLS memory */ + /* Probably, it might be better solution */ + do { + void ***tls_mem = ((void****)__readgsqword(0x58))[_tls_index]; + void *val = _tsrm_ls_cache; + size_t offset = 0; + size_t size = (char*)&_tls_end - (char*)&_tls_start; + + while (offset < size) { + if (*tls_mem == val) { + tsrm_tls_offset = offset; + break; + } + tls_mem++; + offset += sizeof(void*); + } + if (offset >= size) { + // TODO: error message ??? + return FAILURE; + } + } while(0); +# elif ZEND_WIN32 + tsrm_tls_index = _tls_index * sizeof(void*); + + /* To find offset of "_tsrm_ls_cache" in TLS segment we perform a linear scan of local TLS memory */ + /* Probably, it might be better solution */ + do { + void ***tls_mem = ((void****)__readfsdword(0x2c))[_tls_index]; + void *val = _tsrm_ls_cache; + size_t offset = 0; + size_t size = (char*)&_tls_end - (char*)&_tls_start; + + while (offset < size) { + if (*tls_mem == val) { + tsrm_tls_offset = offset; + break; + } + tls_mem++; + offset += sizeof(void*); + } + if (offset >= size) { + // TODO: error message ??? + return FAILURE; + } + } while(0); +# elif defined(__APPLE__) && defined(__x86_64__) + tsrm_ls_cache_tcb_offset = tsrm_get_ls_cache_tcb_offset(); + if (tsrm_ls_cache_tcb_offset == 0) { + size_t *ti; + __asm__( + "leaq __tsrm_ls_cache(%%rip),%0" + : "=r" (ti)); + tsrm_tls_offset = ti[2]; + tsrm_tls_index = ti[1] * 8; + } +# elif defined(__GNUC__) && defined(__x86_64__) + tsrm_ls_cache_tcb_offset = tsrm_get_ls_cache_tcb_offset(); + if (tsrm_ls_cache_tcb_offset == 0) { +#if defined(__has_attribute) && __has_attribute(tls_model) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__MUSL__) + size_t ret; + + asm ("movq _tsrm_ls_cache@gottpoff(%%rip),%0" + : "=r" (ret)); + tsrm_ls_cache_tcb_offset = ret; +#elif defined(__MUSL__) + size_t *ti; + + __asm__( + "leaq _tsrm_ls_cache@tlsgd(%%rip), %0\n" + : "=a" (ti)); + tsrm_tls_offset = ti[1]; + tsrm_tls_index = ti[0] * 8; +#else + size_t *ti; + + __asm__( + "leaq _tsrm_ls_cache@tlsgd(%%rip), %0\n" + : "=a" (ti)); + tsrm_tls_offset = ti[1]; + tsrm_tls_index = ti[0] * 16; +#endif + } +# elif defined(__GNUC__) && defined(__i386__) + tsrm_ls_cache_tcb_offset = tsrm_get_ls_cache_tcb_offset(); + if (tsrm_ls_cache_tcb_offset == 0) { +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__MUSL__) + size_t ret; + + asm ("leal _tsrm_ls_cache@ntpoff,%0\n" + : "=a" (ret)); + tsrm_ls_cache_tcb_offset = ret; +#else + size_t *ti, _ebx, _ecx, _edx; + + __asm__( + "call 1f\n" + ".subsection 1\n" + "1:\tmovl (%%esp), %%ebx\n\t" + "ret\n" + ".previous\n\t" + "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n\t" + "leal _tsrm_ls_cache@tlsldm(%%ebx), %0\n\t" + "call ___tls_get_addr@plt\n\t" + "leal _tsrm_ls_cache@tlsldm(%%ebx), %0\n" + : "=a" (ti), "=&b" (_ebx), "=&c" (_ecx), "=&d" (_edx)); + tsrm_tls_offset = ti[1]; + tsrm_tls_index = ti[0] * 8; +#endif + } +# endif +#endif + + memset(sp_adj, 0, sizeof(sp_adj)); +#ifdef HAVE_GDB + sp_adj[SP_ADJ_RET] = sizeof(void*); + //|.if X64WIN +#line 2958 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.elif X64 + sp_adj[SP_ADJ_ASSIGN] = sp_adj[SP_ADJ_RET] + 8; // sub @q4, 8 + //|.else +#line 2962 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.endif + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + zend_jit_set_sp_adj_vm(); // set sp_adj[SP_ADJ_VM] +#ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + sp_adj[SP_ADJ_JIT] = sp_adj[SP_ADJ_VM] + 16; // sub @q4, 16 +#else + sp_adj[SP_ADJ_JIT] = sp_adj[SP_ADJ_VM]; +#endif + } else if (GCC_GLOBAL_REGS) { + sp_adj[SP_ADJ_JIT] = sp_adj[SP_ADJ_RET] + 0x18; // sub @q4, 0x18 + } else { + sp_adj[SP_ADJ_JIT] = sp_adj[SP_ADJ_RET] + 0x28; // sub @q4, 0x28 + } +#endif + + return SUCCESS; +} + +static ZEND_ATTRIBUTE_UNUSED int zend_jit_trap(dasm_State **Dst) +{ + //| int3 + dasm_put(Dst, 1503); +#line 2983 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_align_func(dasm_State **Dst) +{ + reuse_ip = 0; + delayed_call_chain = 0; + last_valid_opline = NULL; + use_last_vald_opline = 0; + track_last_valid_opline = 0; + jit_return_label = -1; + //|.align 16 + dasm_put(Dst, 1505); +#line 2995 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_align_stub(dasm_State **Dst) +{ + //|.align 16 + dasm_put(Dst, 1505); +#line 3001 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_prologue(dasm_State **Dst) +{ + //| ENDBR + #if defined (__CET__) && (__CET__ & 1) != 0 + dasm_put(Dst, 906); + #endif +#line 3007 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| SUB_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 1508); + #endif +#line 3009 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| sub r4, SPAD // stack alignment + dasm_put(Dst, 1514); +#line 3011 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| sub r4, NR_SPAD // stack alignment + //| mov aword T2, FP // save FP + //| mov aword T3, RX // save IP + //| mov FP, FCARG1a + dasm_put(Dst, 1520); +#line 3016 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_label(dasm_State **Dst, unsigned int label) +{ + //|=>label: + dasm_put(Dst, 306, label); +#line 3023 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_save_call_chain(dasm_State **Dst, uint32_t call_level) +{ + //| // call->prev_execute_data = EX(call); + if (call_level == 1) { + //| mov aword EX:RX->prev_execute_data, 0 + dasm_put(Dst, 1540, Dt1(->prev_execute_data)); +#line 3031 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov r0, EX->call + //| mov EX:RX->prev_execute_data, r0 + dasm_put(Dst, 1549, Dt1(->call), Dt1(->prev_execute_data)); +#line 3034 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // EX(call) = call; + //| mov EX->call, RX + dasm_put(Dst, 8, Dt1(->call)); +#line 3037 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + delayed_call_chain = 0; + + return 1; +} + +static int zend_jit_set_ip(dasm_State **Dst, const zend_op *opline) +{ + if (last_valid_opline == opline) { + zend_jit_use_last_valid_opline(); + } else if (GCC_GLOBAL_REGS && last_valid_opline) { + zend_jit_use_last_valid_opline(); + //| ADD_IP (opline - last_valid_opline) * sizeof(zend_op); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1558, (opline - last_valid_opline) * sizeof(zend_op)); + } else { + dasm_put(Dst, 1563, Dt1(->opline), (opline - last_valid_opline) * sizeof(zend_op)); + } +#line 3050 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_IP_ADDR opline + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 1569, ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + } +#line 3052 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + zend_jit_set_last_valid_opline(opline); + + return 1; +} + +static int zend_jit_set_ip_ex(dasm_State **Dst, const zend_op *opline, bool set_ip_reg) +{ + if (last_valid_opline == opline) { + zend_jit_use_last_valid_opline(); + } else if (GCC_GLOBAL_REGS && last_valid_opline) { + zend_jit_use_last_valid_opline(); + //| ADD_IP (opline - last_valid_opline) * sizeof(zend_op); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1558, (opline - last_valid_opline) * sizeof(zend_op)); + } else { + dasm_put(Dst, 1563, Dt1(->opline), (opline - last_valid_opline) * sizeof(zend_op)); + } +#line 3065 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (!GCC_GLOBAL_REGS && set_ip_reg) { + //| LOAD_ADDR RX, opline + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 1569, ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32)); + } +#line 3067 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov aword EX->opline, RX + dasm_put(Dst, 8, Dt1(->opline)); +#line 3068 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_IP_ADDR opline + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 1569, ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + } +#line 3070 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + zend_jit_set_last_valid_opline(opline); + + return 1; +} + +static int zend_jit_set_valid_ip(dasm_State **Dst, const zend_op *opline) +{ + if (delayed_call_chain) { + if (!zend_jit_save_call_chain(Dst, delayed_call_level)) { + return 0; + } + } + if (!zend_jit_set_ip(Dst, opline)) { + return 0; + } + reuse_ip = 0; + return 1; +} + +static int zend_jit_check_timeout(dasm_State **Dst, const zend_op *opline, const void *exit_addr) +{ +#if 0 + if (!zend_jit_set_valid_ip(Dst, opline)) { + return 0; + } + //| MEM_CMP_ZTS byte, executor_globals, vm_interrupt, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 3097 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->interrupt_handler + dasm_put(Dst, 1300, (executor_globals_offset+offsetof(zend_executor_globals, vm_interrupt))); +#line 3098 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + //| MEM_CMP_ZTS byte, executor_globals, vm_interrupt, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 1588, (executor_globals_offset+offsetof(zend_executor_globals, vm_interrupt))); +#line 3100 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 3102 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (last_valid_opline == opline) { + zend_jit_use_last_valid_opline(); + //| jne ->interrupt_handler + dasm_put(Dst, 1304); +#line 3105 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne >1 + //|.cold_code + dasm_put(Dst, 272); +#line 3108 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| LOAD_IP_ADDR opline + dasm_put(Dst, 70); + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 1569, ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + } +#line 3110 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->interrupt_handler + //|.code + dasm_put(Dst, 1597); +#line 3112 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#endif + return 1; +} + +static int zend_jit_trace_end_loop(dasm_State **Dst, int loop_label, const void *timeout_exit_addr) +{ + if (timeout_exit_addr) { + //| MEM_CMP_ZTS byte, executor_globals, vm_interrupt, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 3121 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je =>loop_label + //| jmp &timeout_exit_addr + dasm_put(Dst, 1603, (executor_globals_offset+offsetof(zend_executor_globals, vm_interrupt)), loop_label, (ptrdiff_t)(timeout_exit_addr)); +#line 3123 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp =>loop_label + dasm_put(Dst, 1614, loop_label); +#line 3125 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_check_exception(dasm_State **Dst) +{ + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 3132 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->exception_handler + dasm_put(Dst, 1618, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 3133 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_check_exception_undef_result(dasm_State **Dst, const zend_op *opline) +{ + if (opline->result_type & (IS_TMP_VAR|IS_VAR)) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 3140 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->exception_handler_undef + dasm_put(Dst, 1628, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 3141 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; + } + return zend_jit_check_exception(Dst); +} + +static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num, zend_jit_trace_info *parent, uint32_t exit_num) +{ + zend_regset regset = ZEND_REGSET_SCRATCH; + +#if ZTS + if (1) { +#else + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(jit_trace_num)))) { +#endif + /* assignment to EG(jit_trace_num) shouldn't clober CPU register used by deoptimizer */ + if (parent) { + int i; + int parent_vars_count = parent->exit_info[exit_num].stack_size; + zend_jit_trace_stack *parent_stack = + parent->stack_map + + parent->exit_info[exit_num].stack_offset; + + for (i = 0; i < parent_vars_count; i++) { + if (STACK_REG(parent_stack, i) != ZREG_NONE) { + if (STACK_REG(parent_stack, i) < ZREG_NUM) { + ZEND_REGSET_EXCL(regset, STACK_REG(parent_stack, i)); + } else if (STACK_REG(parent_stack, i) == ZREG_ZVAL_COPY_GPR0) { + ZEND_REGSET_EXCL(regset, ZREG_R0); + } + } + } + } + } + + if (parent && parent->exit_info[exit_num].flags & ZEND_JIT_EXIT_METHOD_CALL) { + ZEND_REGSET_EXCL(regset, ZREG_R0); + } + + current_trace_num = trace_num; + + //| // EG(jit_trace_num) = trace_num; + if (regset == ZEND_REGSET_EMPTY) { + //| push r0 + //| MEM_STORE_ZTS dword, executor_globals, jit_trace_num, trace_num, r0 + dasm_put(Dst, 1638); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 3185 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| pop r0 + dasm_put(Dst, 1641, (executor_globals_offset+offsetof(zend_executor_globals, jit_trace_num)), trace_num); +#line 3186 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_reg tmp = ZEND_REGSET_FIRST(regset); + + //| MEM_STORE_ZTS dword, executor_globals, jit_trace_num, trace_num, Ra(tmp) + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1647, (tmp), tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1655, (tmp), (tmp), (tmp), tsrm_tls_index, (tmp), (tmp), tsrm_tls_offset); + } + dasm_put(Dst, 1684, (tmp), (executor_globals_offset+offsetof(zend_executor_globals, jit_trace_num)), trace_num); +#line 3190 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + (void)tmp; + } + + return 1; +} + +static int zend_jit_trace_end(dasm_State **Dst, zend_jit_trace_info *t) +{ + //|.cold_code + dasm_put(Dst, 276); +#line 3199 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|=>1: // end of the code + //|.code + dasm_put(Dst, 1693, 1); +#line 3201 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +/* This taken from LuaJIT. Thanks to Mike Pall. */ +static uint32_t _asm_x86_inslen(const uint8_t* p) +{ + static const uint8_t map_op1[256] = { + 0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x20, + 0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51, + 0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51, + 0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51, +#if defined(__x86_64__) || defined(_M_X64) + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14, +#else + 0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51, +#endif + 0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51, + 0x51,0x51,0x92,0x92,0x10,0x10,0x12,0x11,0x45,0x86,0x52,0x93,0x51,0x51,0x51,0x51, + 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, + 0x93,0x86,0x93,0x93,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, + 0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x47,0x51,0x51,0x51,0x51,0x51, +#if defined(__x86_64__) || defined(_M_X64) + 0x59,0x59,0x59,0x59,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51, +#else + 0x55,0x55,0x55,0x55,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51, +#endif + 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, + 0x93,0x93,0x53,0x51,0x70,0x71,0x93,0x86,0x54,0x51,0x53,0x51,0x51,0x52,0x51,0x51, + 0x92,0x92,0x92,0x92,0x52,0x52,0x51,0x51,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, + 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x45,0x45,0x47,0x52,0x51,0x51,0x51,0x51, + 0x10,0x51,0x10,0x10,0x51,0x51,0x63,0x66,0x51,0x51,0x51,0x51,0x51,0x51,0x92,0x92 + }; + static const uint8_t map_op2[256] = { + 0x93,0x93,0x93,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x93,0x52,0x94, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x34,0x51,0x35,0x51,0x51,0x51,0x51,0x51, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x94,0x54,0x54,0x54,0x93,0x93,0x93,0x52,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x52,0x52,0x52,0x93,0x94,0x93,0x51,0x51,0x52,0x52,0x52,0x93,0x94,0x93,0x93,0x93, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x94,0x93,0x93,0x93,0x93,0x93, + 0x93,0x93,0x94,0x93,0x94,0x94,0x94,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x52 + }; + uint32_t result = 0; + uint32_t prefixes = 0; + uint32_t x = map_op1[*p]; + + for (;;) { + switch (x >> 4) { + case 0: + return result + x + (prefixes & 4); + case 1: + prefixes |= x; + x = map_op1[*++p]; + result++; + break; + case 2: + x = map_op2[*++p]; + break; + case 3: + p++; + goto mrm; + case 4: + result -= (prefixes & 2); + /* fallthrough */ + case 5: + return result + (x & 15); + case 6: /* Group 3. */ + if (p[1] & 0x38) { + x = 2; + } else if ((prefixes & 2) && (x == 0x66)) { + x = 4; + } + goto mrm; + case 7: /* VEX c4/c5. */ +#if !defined(__x86_64__) && !defined(_M_X64) + if (p[1] < 0xc0) { + x = 2; + goto mrm; + } +#endif + if (x == 0x70) { + x = *++p & 0x1f; + result++; + if (x >= 2) { + p += 2; + result += 2; + goto mrm; + } + } + p++; + result++; + x = map_op2[*++p]; + break; + case 8: + result -= (prefixes & 2); + /* fallthrough */ + case 9: +mrm: + /* ModR/M and possibly SIB. */ + result += (x & 15); + x = *++p; + switch (x >> 6) { + case 0: + if ((x & 7) == 5) { + return result + 4; + } + break; + case 1: + result++; + break; + case 2: + result += 4; + break; + case 3: + return result; + } + if ((x & 7) == 4) { + result++; + if (x < 0x40 && (p[1] & 7) == 5) { + result += 4; + } + } + return result; + } + } +} + +typedef ZEND_SET_ALIGNED(1, uint16_t unaligned_uint16_t); +typedef ZEND_SET_ALIGNED(1, int32_t unaligned_int32_t); + +static int zend_jit_patch(const void *code, size_t size, uint32_t jmp_table_size, const void *from_addr, const void *to_addr) +{ + int ret = 0; + uint8_t *p, *end; + + if (jmp_table_size) { + const void **jmp_slot = (const void **)((char*)code + ZEND_MM_ALIGNED_SIZE_EX(size, sizeof(void*))); + + do { + if (*jmp_slot == from_addr) { + *jmp_slot = to_addr; + ret++; + } + jmp_slot++; + } while (--jmp_table_size); + } + + p = (uint8_t*)code; + end = p + size - 5; + while (p < end) { + if ((*(unaligned_uint16_t*)p & 0xf0ff) == 0x800f && p + *(unaligned_int32_t*)(p+2) == (uint8_t*)from_addr - 6) { + *(unaligned_int32_t*)(p+2) = ((uint8_t*)to_addr - (p + 6)); + ret++; + } else if (*p == 0xe9 && p + *(unaligned_int32_t*)(p+1) == (uint8_t*)from_addr - 5) { + *(unaligned_int32_t*)(p+1) = ((uint8_t*)to_addr - (p + 5)); + ret++; + } + p += _asm_x86_inslen(p); + } +#ifdef HAVE_VALGRIND + VALGRIND_DISCARD_TRANSLATIONS(code, size); +#endif + return ret; +} + +static int zend_jit_link_side_trace(const void *code, size_t size, uint32_t jmp_table_size, uint32_t exit_num, const void *addr) +{ + return zend_jit_patch(code, size, jmp_table_size, zend_jit_trace_get_exit_addr(exit_num), addr); +} + +static int zend_jit_trace_link_to_root(dasm_State **Dst, zend_jit_trace_info *t, const void *timeout_exit_addr) +{ + const void *link_addr; + size_t prologue_size; + + /* Skip prologue. */ + // TODO: don't hardcode this ??? + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { +#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + prologue_size = 0; +#elif defined(__x86_64__) || defined(_M_X64) + // sub r4, HYBRID_SPAD + prologue_size = 4; +#else + // sub r4, HYBRID_SPAD + prologue_size = 3; +#endif + } else if (GCC_GLOBAL_REGS) { + // sub r4, SPAD // stack alignment +#if defined(__x86_64__) || defined(_M_X64) + prologue_size = 4; +#else + prologue_size = 3; +#endif + } else { + // sub r4, NR_SPAD // stack alignment + // mov aword T2, FP // save FP + // mov aword T3, RX // save IP + // mov FP, FCARG1a +#if defined(__x86_64__) || defined(_M_X64) + prologue_size = 17; +#else + prologue_size = 13; +#endif + } + link_addr = (const void*)((const char*)t->code_start + prologue_size + ENDBR_PADDING); + + if (timeout_exit_addr) { + /* Check timeout for links to LOOP */ + //| MEM_CMP_ZTS byte, executor_globals, vm_interrupt, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 3419 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je &link_addr + //| jmp &timeout_exit_addr + dasm_put(Dst, 1696, (executor_globals_offset+offsetof(zend_executor_globals, vm_interrupt)), (ptrdiff_t)(link_addr), (ptrdiff_t)(timeout_exit_addr)); +#line 3421 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp &link_addr + dasm_put(Dst, 146, (ptrdiff_t)(link_addr)); +#line 3423 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_trace_return(dasm_State **Dst, bool original_handler, const zend_op *opline) +{ +#if 0 + //| jmp ->trace_escape + dasm_put(Dst, 1707); +#line 3431 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 3434 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!original_handler) { + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 3436 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov r0, EX->func + //| mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)] + //| jmp aword [IP + r0] + dasm_put(Dst, 1309, Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_trace_extension, offset)); +#line 3441 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + dasm_put(Dst, 115); +#line 3444 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!original_handler) { + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 3446 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov r0, EX->func + //| mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)] + //| jmp aword [IP + r0] + dasm_put(Dst, 1309, Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_trace_extension, offset)); +#line 3451 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (original_handler) { + //| mov FCARG1a, FP + //| mov r0, EX->func + //| mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] + //| mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)] + //| call aword [IP + r0] + dasm_put(Dst, 1712, Dt1(->func), offsetof(zend_op_array, reserved[zend_func_info_rid]), offsetof(zend_jit_op_array_trace_extension, offset)); +#line 3459 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + dasm_put(Dst, 476); +#line 3463 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!original_handler || !opline || + (opline->opcode != ZEND_RETURN + && opline->opcode != ZEND_RETURN_BY_REF + && opline->opcode != ZEND_GENERATOR_RETURN + && opline->opcode != ZEND_GENERATOR_CREATE + && opline->opcode != ZEND_YIELD + && opline->opcode != ZEND_YIELD_FROM)) { + //| mov r0, 2 // ZEND_VM_LEAVE + dasm_put(Dst, 1734); +#line 3471 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ret + dasm_put(Dst, 141); +#line 3473 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#endif + return 1; +} + +static int zend_jit_type_guard(dasm_State **Dst, const zend_op *opline, uint32_t var, uint8_t type) +{ + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_NOT_Z_TYPE FP + var, type, &exit_addr + dasm_put(Dst, 1742, var+offsetof(zval, u1.v.type), type, (ptrdiff_t)(exit_addr)); +#line 3487 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_scalar_type_guard(dasm_State **Dst, const zend_op *opline, uint32_t var) +{ + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| cmp byte [FP+var+offsetof(zval, u1.v.type)], IS_STRING + //| jae &exit_addr + dasm_put(Dst, 1751, var+offsetof(zval, u1.v.type), IS_STRING, (ptrdiff_t)(exit_addr)); +#line 3501 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_packed_guard(dasm_State **Dst, const zend_op *opline, uint32_t var, uint32_t op_info) +{ + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_PACKED_GUARD); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //| GET_ZVAL_LVAL ZREG_FCARG1, ZEND_ADDR_MEM_ZVAL(ZREG_FP, var) + if (Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var)) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var))) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var))))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var)))), (unsigned int)((Z_LVAL_P(Z_ZV(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var))))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var)))); + } + } + } else if (Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var)) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var))); + } else if (Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var)) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var))) { + dasm_put(Dst, 1782, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var))), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 3515 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op_info & MAY_BE_ARRAY_PACKED) { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jz &exit_addr + dasm_put(Dst, 1790, offsetof(zend_array, u.flags), HASH_FLAG_PACKED, (ptrdiff_t)(exit_addr)); +#line 3518 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jnz &exit_addr + dasm_put(Dst, 1799, offsetof(zend_array, u.flags), HASH_FLAG_PACKED, (ptrdiff_t)(exit_addr)); +#line 3521 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_array, const zend_op *opline, int may_throw, zend_jit_trace_rec *trace) +{ + zend_jit_op_array_trace_extension *jit_extension = + (zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(op_array); + size_t offset = jit_extension->offset; + const void *handler = + (zend_vm_opcode_handler_t)ZEND_OP_TRACE_INFO(opline, offset)->call_handler; + + if (!zend_jit_set_valid_ip(Dst, opline)) { + return 0; + } + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, FP + dasm_put(Dst, 73); +#line 3539 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL handler, r0 + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 53, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 66); + } +#line 3541 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw + && opline->opcode != ZEND_RETURN + && opline->opcode != ZEND_RETURN_BY_REF) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r1 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } +#line 3545 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->exception_handler + dasm_put(Dst, 1831, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 3546 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + while (trace->op != ZEND_JIT_TRACE_VM && trace->op != ZEND_JIT_TRACE_END) { + trace++; + } + + if (!GCC_GLOBAL_REGS + && (trace->op != ZEND_JIT_TRACE_END || trace->stop != ZEND_JIT_TRACE_STOP_RETURN)) { + if (opline->opcode == ZEND_RETURN || + opline->opcode == ZEND_RETURN_BY_REF || + opline->opcode == ZEND_DO_UCALL || + opline->opcode == ZEND_DO_FCALL_BY_NAME || + opline->opcode == ZEND_DO_FCALL || + opline->opcode == ZEND_GENERATOR_CREATE) { + //| MEM_LOAD_ZTS FP, aword, executor_globals, current_execute_data, r1 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 1841, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); +#line 3561 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (zend_jit_trace_may_exit(op_array, opline)) { + if (opline->opcode == ZEND_RETURN || + opline->opcode == ZEND_RETURN_BY_REF || + opline->opcode == ZEND_GENERATOR_CREATE) { + + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + if (trace->op != ZEND_JIT_TRACE_END || + (trace->stop != ZEND_JIT_TRACE_STOP_RETURN && + trace->stop != ZEND_JIT_TRACE_STOP_INTERPRETER)) { + /* this check may be handled by the following OPLINE guard or jmp [IP] */ + //| cmp IP, zend_jit_halt_op + //| je ->trace_halt + dasm_put(Dst, 1846, zend_jit_halt_op); +#line 3576 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (GCC_GLOBAL_REGS) { + //| test IP, IP + //| je ->trace_halt + dasm_put(Dst, 1856); +#line 3580 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test eax, eax + //| jl ->trace_halt + dasm_put(Dst, 1865); +#line 3583 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opline->opcode == ZEND_EXIT || + opline->opcode == ZEND_GENERATOR_RETURN || + opline->opcode == ZEND_YIELD || + opline->opcode == ZEND_YIELD_FROM) { + //| jmp ->trace_halt + dasm_put(Dst, 1872); +#line 3589 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (trace->op != ZEND_JIT_TRACE_END || + (trace->stop != ZEND_JIT_TRACE_STOP_RETURN && + trace->stop != ZEND_JIT_TRACE_STOP_INTERPRETER)) { + + const zend_op *next_opline = trace->opline; + const zend_op *exit_opline = NULL; + uint32_t exit_point; + const void *exit_addr; + uint32_t old_info = 0; + uint32_t old_res_info = 0; + zend_jit_trace_stack *stack = JIT_G(current_frame)->stack; + + if (zend_is_smart_branch(opline)) { + bool exit_if_true = 0; + exit_opline = zend_jit_trace_get_exit_opline(trace, opline + 1, &exit_if_true); + } else { + switch (opline->opcode) { + case ZEND_JMPZ: + case ZEND_JMPNZ: + case ZEND_JMPZ_EX: + case ZEND_JMPNZ_EX: + case ZEND_JMP_SET: + case ZEND_COALESCE: + case ZEND_JMP_NULL: + case ZEND_FE_RESET_R: + case ZEND_FE_RESET_RW: + exit_opline = (trace->opline == opline + 1) ? + OP_JMP_ADDR(opline, opline->op2) : + opline + 1; + break; + case ZEND_FE_FETCH_R: + case ZEND_FE_FETCH_RW: + exit_opline = (trace->opline == opline + 1) ? + ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) : + opline + 1; + break; + + } + } + + switch (opline->opcode) { + case ZEND_FE_FETCH_R: + case ZEND_FE_FETCH_RW: + if (opline->op2_type != IS_UNUSED) { + old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var)); + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1); + } + break; + case ZEND_BIND_INIT_STATIC_OR_JMP: + if (opline->op1_type == IS_CV) { + old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var)); + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_UNKNOWN, 1); + } + break; + } + + if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) { + old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1); + } + exit_point = zend_jit_trace_get_exit_point(exit_opline, 0); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) { + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_res_info); + } + switch (opline->opcode) { + case ZEND_FE_FETCH_R: + case ZEND_FE_FETCH_RW: + if (opline->op2_type != IS_UNUSED) { + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info); + } + break; + case ZEND_BIND_INIT_STATIC_OR_JMP: + if (opline->op1_type == IS_CV) { + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_info); + } + break; + } + + if (!exit_addr) { + return 0; + } + //| CMP_IP next_opline + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1877, next_opline); + } else { + dasm_put(Dst, 1883, Dt1(->opline), next_opline); + } +#line 3674 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 3675 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + zend_jit_set_last_valid_opline(trace->opline); + + return 1; +} + +static int zend_jit_handler(dasm_State **Dst, const zend_op *opline, int may_throw) +{ + const void *handler; + + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + handler = zend_get_opcode_handler_func(opline); + } else { + handler = opline->handler; + } + + if (!zend_jit_set_valid_ip(Dst, opline)) { + return 0; + } + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, FP + dasm_put(Dst, 73); +#line 3698 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL handler, r0 + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 53, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 66); + } +#line 3700 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception(Dst); + } + + /* Skip the following OP_DATA */ + switch (opline->opcode) { + case ZEND_ASSIGN_DIM: + case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_DIM_OP: + case ZEND_ASSIGN_OBJ_OP: + case ZEND_ASSIGN_STATIC_PROP_OP: + case ZEND_ASSIGN_STATIC_PROP_REF: + case ZEND_ASSIGN_OBJ_REF: + zend_jit_set_last_valid_opline(opline + 2); + break; + default: + zend_jit_set_last_valid_opline(opline + 1); + break; + } + + return 1; +} + +static int zend_jit_tail_handler(dasm_State **Dst, const zend_op *opline) +{ + if (!zend_jit_set_valid_ip(Dst, opline)) { + return 0; + } + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + if (opline->opcode == ZEND_DO_UCALL || + opline->opcode == ZEND_DO_FCALL_BY_NAME || + opline->opcode == ZEND_DO_FCALL || + opline->opcode == ZEND_RETURN) { + + /* Use inlined HYBRID VM handler */ + const void *handler = opline->handler; + + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 3739 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_JMP handler, r0 + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 146, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 150); + } +#line 3740 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + const void *handler = zend_get_opcode_handler_func(opline); + + //| EXT_CALL handler, r0 + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 53, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 66); + } +#line 3744 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 3745 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 3746 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + const void *handler = opline->handler; + + if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + dasm_put(Dst, 115); +#line 3752 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG1a, FP + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + dasm_put(Dst, 1889); +#line 3757 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_JMP handler, r0 + if (MAY_USE_32BIT_ADDR(handler)) { + dasm_put(Dst, 146, (ptrdiff_t)(handler)); + } else { + if (IS_SIGNED_32BIT(handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)handler)), (unsigned int)((((ptrdiff_t)handler))>>32)); + } + dasm_put(Dst, 150); + } +#line 3759 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + zend_jit_reset_last_valid_opline(); + return 1; +} + +static int zend_jit_trace_opline_guard(dasm_State **Dst, const zend_op *opline) +{ + uint32_t exit_point = zend_jit_trace_get_exit_point(NULL, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| CMP_IP opline + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1877, opline); + } else { + dasm_put(Dst, 1883, Dt1(->opline), opline); + } +#line 3773 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 3774 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + zend_jit_set_last_valid_opline(opline); + + return 1; +} + +static int zend_jit_jmp(dasm_State **Dst, unsigned int target_label) +{ + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 3783 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_cond_jmp(dasm_State **Dst, const zend_op *next_opline, unsigned int target_label) +{ + //| CMP_IP next_opline + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1877, next_opline); + } else { + dasm_put(Dst, 1883, Dt1(->opline), next_opline); + } +#line 3789 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne =>target_label + dasm_put(Dst, 1908, target_label); +#line 3790 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + zend_jit_set_last_valid_opline(next_opline); + + return 1; +} + +#ifdef CONTEXT_THREADED_JIT +static int zend_jit_context_threaded_call(dasm_State **Dst, const zend_op *opline, unsigned int next_block) +{ + if (!zend_jit_handler(Dst, opline, 1)) return 0; + if (opline->opcode == ZEND_DO_UCALL) { + //| call ->context_threaded_call + dasm_put(Dst, 1912); +#line 3802 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + const zend_op *next_opline = opline + 1; + + //| CMP_IP next_opline + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1877, next_opline); + } else { + dasm_put(Dst, 1883, Dt1(->opline), next_opline); + } +#line 3806 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je =>next_block + //| call ->context_threaded_call + dasm_put(Dst, 1916, next_block); +#line 3808 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} +#endif + +static int zend_jit_call(dasm_State **Dst, const zend_op *opline, unsigned int next_block) +{ +#ifdef CONTEXT_THREADED_JIT + return zend_jit_context_threaded_call(Dst, opline, next_block); +#else + return zend_jit_tail_handler(Dst, opline); +#endif +} + +static int zend_jit_spill_store(dasm_State **Dst, zend_jit_addr src, zend_jit_addr dst, uint32_t info, bool set_type) +{ + ZEND_ASSERT(Z_MODE(src) == IS_REG); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + + if ((info & MAY_BE_ANY) == MAY_BE_LONG) { + //| SET_ZVAL_LVAL dst, Ra(Z_REG(src)) + if (Z_MODE(dst) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(src)), (Z_REG(dst))); + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(src)), (Z_REG(dst)), Z_OFFSET(dst)); + } +#line 3829 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (set_type && + (Z_REG(dst) != ZREG_FP || + !JIT_G(current_frame) || + STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(Z_OFFSET(dst))) != IS_LONG)) { + //| SET_ZVAL_TYPE_INFO dst, IS_LONG + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_LONG); +#line 3834 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if ((info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + //| DOUBLE_SET_ZVAL_DVAL dst, Z_REG(src) + if (Z_MODE(dst) == IS_REG) { + if (Z_REG(src) != Z_REG(dst)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(src)-ZREG_XMM0), (Z_REG(dst)), Z_OFFSET(dst)); + } else { + dasm_put(Dst, 1965, (Z_REG(src)-ZREG_XMM0), (Z_REG(dst)), Z_OFFSET(dst)); + } + } +#line 3837 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (set_type && + (Z_REG(dst) != ZREG_FP || + !JIT_G(current_frame) || + STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(Z_OFFSET(dst))) != IS_DOUBLE)) { + //| SET_ZVAL_TYPE_INFO dst, IS_DOUBLE + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 3842 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + ZEND_UNREACHABLE(); + } + return 1; +} + +static int zend_jit_load_reg(dasm_State **Dst, zend_jit_addr src, zend_jit_addr dst, uint32_t info) +{ + ZEND_ASSERT(Z_MODE(src) == IS_MEM_ZVAL); + ZEND_ASSERT(Z_MODE(dst) == IS_REG); + + if ((info & MAY_BE_ANY) == MAY_BE_LONG) { + //| GET_ZVAL_LVAL Z_REG(dst), src + if (Z_MODE(src) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(src)) == 0) { + dasm_put(Dst, 1760, (Z_REG(dst)), (Z_REG(dst))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(src)))) { + dasm_put(Dst, 1768, (Z_REG(dst)), (unsigned int)(Z_LVAL_P(Z_ZV(src))), (unsigned int)((Z_LVAL_P(Z_ZV(src)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(dst)), Z_LVAL_P(Z_ZV(src))); + } + } + } else if (Z_MODE(src) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(dst)), (Z_REG(src)), Z_OFFSET(src)); + } else if (Z_MODE(src) == IS_REG) { + if (Z_REG(dst) != Z_REG(src)) { + dasm_put(Dst, 1782, (Z_REG(src)), (Z_REG(dst))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 3856 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + //| DOUBLE_GET_ZVAL_DVAL Z_REG(dst), src + if (Z_MODE(src) != IS_REG || Z_REG(dst) != Z_REG(src)) { + if (Z_MODE(src) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(src))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(dst)-ZREG_XMM0), Z_ZV(src)); + } else { + dasm_put(Dst, 1988, (Z_REG(dst)-ZREG_XMM0), Z_ZV(src)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(src))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(src))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(src))), (unsigned int)((((ptrdiff_t)Z_ZV(src)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(dst)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(dst)-ZREG_XMM0)); + } + } + } else if (Z_MODE(src) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)), Z_OFFSET(src)); + } else { + dasm_put(Dst, 2028, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)), Z_OFFSET(src)); + } + } else if (Z_MODE(src) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 3858 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + return 1; +} + +static int zend_jit_store_var(dasm_State **Dst, uint32_t info, int var, zend_reg reg, bool set_type) +{ + zend_jit_addr src = ZEND_ADDR_REG(reg); + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, EX_NUM_TO_VAR(var)); + + return zend_jit_spill_store(Dst, src, dst, info, set_type); +} + +static int zend_jit_store_var_type(dasm_State **Dst, int var, uint32_t type) +{ + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, EX_NUM_TO_VAR(var)); + + //| SET_ZVAL_TYPE_INFO dst, type + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), type); +#line 3877 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_store_var_if_necessary(dasm_State **Dst, int var, zend_jit_addr src, uint32_t info) +{ + if (Z_MODE(src) == IS_REG && Z_STORE(src)) { + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var); + return zend_jit_spill_store(Dst, src, dst, info, 1); + } + return 1; +} + +static int zend_jit_store_var_if_necessary_ex(dasm_State **Dst, int var, zend_jit_addr src, uint32_t info, zend_jit_addr old, uint32_t old_info) +{ + if (Z_MODE(src) == IS_REG && Z_STORE(src)) { + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var); + bool set_type = 1; + + if ((info & (MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)) == + (old_info & (MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF))) { + if (Z_MODE(old) != IS_REG || Z_LOAD(old) || Z_STORE(old)) { + set_type = 0; + } + } + return zend_jit_spill_store(Dst, src, dst, info, set_type); + } + return 1; +} + +static int zend_jit_load_var(dasm_State **Dst, uint32_t info, int var, zend_reg reg) +{ + zend_jit_addr src = ZEND_ADDR_MEM_ZVAL(ZREG_FP, EX_NUM_TO_VAR(var)); + zend_jit_addr dst = ZEND_ADDR_REG(reg); + + return zend_jit_load_reg(Dst, src, dst, info); +} + +static int zend_jit_invalidate_var_if_necessary(dasm_State **Dst, uint8_t op_type, zend_jit_addr addr, znode_op op) +{ + if ((op_type & (IS_TMP_VAR|IS_VAR)) && Z_MODE(addr) == IS_REG && !Z_LOAD(addr) && !Z_STORE(addr)) { + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op.var); + //| SET_ZVAL_TYPE_INFO dst, IS_UNDEF + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_UNDEF); +#line 3919 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_update_regs(dasm_State **Dst, uint32_t var, zend_jit_addr src, zend_jit_addr dst, uint32_t info) +{ + if (!zend_jit_same_addr(src, dst)) { + if (Z_MODE(src) == IS_REG) { + if (Z_MODE(dst) == IS_REG) { + if ((info & MAY_BE_ANY) == MAY_BE_LONG) { + //| mov Ra(Z_REG(dst)), Ra(Z_REG(src)) + dasm_put(Dst, 1782, (Z_REG(src)), (Z_REG(dst))); +#line 3930 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + //| SSE_AVX_INS movaps, vmovaps, xmm(Z_REG(dst)-ZREG_XMM0), xmm(Z_REG(src)-ZREG_XMM0) + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(dst)-ZREG_XMM0), (Z_REG(src)-ZREG_XMM0)); + } +#line 3932 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + if (!Z_LOAD(src) && !Z_STORE(src) && Z_STORE(dst)) { + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var); + + if (!zend_jit_spill_store(Dst, dst, var_addr, info, + JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + JIT_G(current_frame) == NULL || + STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(var)) == IS_UNKNOWN || + (1 << STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(var))) != (info & MAY_BE_ANY) + )) { + return 0; + } + } + } else if (Z_MODE(dst) == IS_MEM_ZVAL) { + if (!Z_LOAD(src) && !Z_STORE(src)) { + if (!zend_jit_spill_store(Dst, src, dst, info, + JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + JIT_G(current_frame) == NULL || + STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(var)) == IS_UNKNOWN || + (1 << STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(var))) != (info & MAY_BE_ANY) + )) { + return 0; + } + } + } else { + ZEND_UNREACHABLE(); + } + } else if (Z_MODE(src) == IS_MEM_ZVAL) { + if (Z_MODE(dst) == IS_REG) { + if (!zend_jit_load_reg(Dst, src, dst, info)) { + return 0; + } + } else { + ZEND_UNREACHABLE(); + } + } else { + ZEND_UNREACHABLE(); + } + } else if (Z_MODE(dst) == IS_REG && Z_STORE(dst)) { + dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var); + if (!zend_jit_spill_store(Dst, src, dst, info, + JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + JIT_G(current_frame) == NULL || + STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(var)) == IS_UNKNOWN || + (1 << STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(var))) != (info & MAY_BE_ANY) + )) { + return 0; + } + } + return 1; +} + +static int zend_jit_escape_if_undef_r0(dasm_State **Dst, int var, uint32_t flags, const zend_op *opline) +{ + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + + //| IF_NOT_ZVAL_TYPE val_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 3991 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (flags & ZEND_JIT_EXIT_RESTORE_CALL) { + if (!zend_jit_save_call_chain(Dst, -1)) { + return 0; + } + } + + ZEND_ASSERT(opline); + + if ((opline-1)->opcode != ZEND_FETCH_CONSTANT + && (opline-1)->opcode != ZEND_FETCH_LIST_R + && ((opline-1)->op1_type & (IS_VAR|IS_TMP_VAR)) + && !(flags & ZEND_JIT_EXIT_FREE_OP1)) { + val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline-1)->op1.var); + + //| IF_NOT_ZVAL_REFCOUNTED val_addr, >2 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 4007 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR r0, val_addr + dasm_put(Dst, 2041, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 4008 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_ADDREF r0 + //|2: + dasm_put(Dst, 2055, (Z_REG(val_addr)), Z_OFFSET(val_addr)); +#line 4010 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //| LOAD_IP_ADDR (opline - 1) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((opline - 1))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(opline - 1))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(opline - 1))), (unsigned int)((((ptrdiff_t)(opline - 1)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((opline - 1))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(opline - 1))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(opline - 1))), (unsigned int)((((ptrdiff_t)(opline - 1)))>>32), Dt1(->opline)); + } + } +#line 4013 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->trace_escape + //|1: + dasm_put(Dst, 2068); +#line 4015 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_store_const(dasm_State **Dst, int var, zend_reg reg) +{ + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, EX_NUM_TO_VAR(var)); + + if (reg == ZREG_LONG_MIN_MINUS_1) { + //|.if X64 + //| SET_ZVAL_LVAL dst, 0x00000000 + if (Z_MODE(dst) == IS_REG) { + dasm_put(Dst, 2075, (Z_REG(dst))); + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 2085, (Z_REG(dst)), Z_OFFSET(dst)); + } +#line 4026 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_W2 dst, 0xc3e00000 + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); +#line 4027 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| SET_ZVAL_LVAL dst, 0x00200000 + //| SET_ZVAL_W2 dst, 0xc1e00000 + //|.endif + //| SET_ZVAL_TYPE_INFO dst, IS_DOUBLE + dasm_put(Dst, 2097, (Z_REG(dst)), Z_OFFSET(dst)+4); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 4032 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (reg == ZREG_LONG_MIN) { + //|.if X64 + //| SET_ZVAL_LVAL dst, 0x00000000 + if (Z_MODE(dst) == IS_REG) { + dasm_put(Dst, 2075, (Z_REG(dst))); + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 2085, (Z_REG(dst)), Z_OFFSET(dst)); + } +#line 4035 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_W2 dst, 0x80000000 + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); +#line 4036 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| SET_ZVAL_LVAL dst, ZEND_LONG_MIN + //|.endif + //| SET_ZVAL_TYPE_INFO dst, IS_LONG + dasm_put(Dst, 2109, (Z_REG(dst)), Z_OFFSET(dst)+4); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_LONG); +#line 4040 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (reg == ZREG_LONG_MAX) { + //|.if X64 + //| SET_ZVAL_LVAL dst, 0xffffffff + if (Z_MODE(dst) == IS_REG) { + dasm_put(Dst, 2121, (Z_REG(dst))); + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 2135, (Z_REG(dst)), Z_OFFSET(dst)); + } +#line 4043 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_W2 dst, 0x7fffffff + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); +#line 4044 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| SET_ZVAL_LVAL dst, ZEND_LONG_MAX + //|.endif + //| SET_ZVAL_TYPE_INFO dst, IS_LONG + dasm_put(Dst, 2151, (Z_REG(dst)), Z_OFFSET(dst)+4); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_LONG); +#line 4048 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (reg == ZREG_LONG_MAX_PLUS_1) { + //|.if X64 + //| SET_ZVAL_LVAL dst, 0 + if (Z_MODE(dst) == IS_REG) { + dasm_put(Dst, 2075, (Z_REG(dst))); + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 2085, (Z_REG(dst)), Z_OFFSET(dst)); + } +#line 4051 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_W2 dst, 0x43e00000 + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); +#line 4052 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| SET_ZVAL_LVAL dst, 0 + //| SET_ZVAL_W2 dst, 0x41e00000 + //|.endif + //| SET_ZVAL_TYPE_INFO dst, IS_DOUBLE + dasm_put(Dst, 2166, (Z_REG(dst)), Z_OFFSET(dst)+4); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 4057 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (reg == ZREG_NULL) { + //| SET_ZVAL_TYPE_INFO dst, IS_NULL + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), IS_NULL); +#line 4059 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (reg == ZREG_ZVAL_TRY_ADDREF) { + //| IF_NOT_ZVAL_REFCOUNTED dst, >1 + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); +#line 4061 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR r1, dst + dasm_put(Dst, 2178, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); +#line 4062 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_ADDREF r1 + //|1: + dasm_put(Dst, 2192, (Z_REG(dst)), Z_OFFSET(dst)); +#line 4064 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (reg == ZREG_ZVAL_COPY_GPR0) { + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + + //| ZVAL_COPY_VALUE dst, -1, val_addr, -1, ZREG_R1, ZREG_R2 + if (-1 & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((-1 & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(dst) != IS_REG || Z_REG(dst) != Z_REG(val_addr)) { + if (Z_MODE(dst) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(dst))); + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(dst)), Z_OFFSET(dst)); + } + } + } else if (Z_MODE(dst) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(dst)), (Z_REG(dst))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(dst)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(dst)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(dst)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(dst) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(dst))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(dst) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(dst))); + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(dst)), Z_OFFSET(dst)); + } + } + } else if ((-1 & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(dst) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(dst)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(dst)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(dst)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(dst)), Z_OFFSET(dst)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(dst)), Z_OFFSET(dst)); + } + } + } else if (Z_MODE(dst) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(dst) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(dst)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(dst)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(dst)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(dst)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(dst)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(dst)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(dst)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(dst)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(dst) == IS_REG) { + if (ZREG_XMM0 != Z_REG(dst)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(dst)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(dst)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(dst)), Z_OFFSET(dst)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(dst)), Z_OFFSET(dst)); + } + } + } + } else if (!(-1 & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(dst)), Z_OFFSET(dst)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(dst)), Z_OFFSET(dst)); + } + } + if ((-1 & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(-1 & MAY_BE_GUARD) && + has_concrete_type(-1 & MAY_BE_ANY)) { + if (Z_MODE(dst) == IS_MEM_ZVAL) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(-1); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R1), (Z_REG(dst)), Z_OFFSET(dst)+offsetof(zval,u1.type_info)); + } +#line 4068 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF -1, ch, r2 + if (-1 & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (-1 & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2225); + } + dasm_put(Dst, 2233); + } +#line 4069 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + return 1; +} + +static int zend_jit_free_trampoline(dasm_State **Dst) +{ + //| /// if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) + //| test dword [r0 + offsetof(zend_function, common.fn_flags)], ZEND_ACC_CALL_VIA_TRAMPOLINE + //| jz >1 + //| mov FCARG1a, r0 + //| EXT_CALL zend_jit_free_trampoline_helper, r0 + dasm_put(Dst, 2239, offsetof(zend_function, common.fn_flags), ZEND_ACC_CALL_VIA_TRAMPOLINE); + if (MAY_USE_32BIT_ADDR(zend_jit_free_trampoline_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_free_trampoline_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_free_trampoline_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_free_trampoline_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_free_trampoline_helper)), (unsigned int)((((ptrdiff_t)zend_jit_free_trampoline_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 4082 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 4083 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op1_def_info, zend_jit_addr op1_def_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, int may_overflow, int may_throw) +{ + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)-MAY_BE_LONG)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >2 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2252, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4090 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_POST_INC || opline->opcode == ZEND_POST_DEC) { + //| ZVAL_COPY_VALUE res_addr, res_use_info, op1_addr, MAY_BE_LONG, ZREG_R0, ZREG_R1 + if (MAY_BE_LONG & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_LONG & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_LONG & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_LONG & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_LONG & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_LONG); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4093 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_update_regs(Dst, opline->op1.var, op1_addr, op1_def_addr, MAY_BE_LONG)) { + return 0; + } + if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) { + //| LONG_OP_WITH_32BIT_CONST add, op1_def_addr, Z_L(1) + if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2265, (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr), Z_L(1)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + dasm_put(Dst, 2274, (Z_REG(op1_def_addr)), Z_L(1)); + } else { + ZEND_UNREACHABLE(); + } +#line 4099 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LONG_OP_WITH_32BIT_CONST sub, op1_def_addr, Z_L(1) + if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2281, (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr), Z_L(1)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + dasm_put(Dst, 2290, (Z_REG(op1_def_addr)), Z_L(1)); + } else { + ZEND_UNREACHABLE(); + } +#line 4101 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (may_overflow && + (((op1_def_info & MAY_BE_GUARD) && (op1_def_info & MAY_BE_LONG)) || + ((opline->result_type != IS_UNUSED && (res_info & MAY_BE_GUARD) && (res_info & MAY_BE_LONG))))) { + int32_t exit_point; + const void *exit_addr; + zend_jit_trace_stack *stack; + uint32_t old_op1_info, old_res_info = 0; + + stack = JIT_G(current_frame)->stack; + old_op1_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var)); + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_DOUBLE, 0); + if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) { + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->op1.var), ZREG_LONG_MAX_PLUS_1); + } else { + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->op1.var), ZREG_LONG_MIN_MINUS_1); + } + if (opline->result_type != IS_UNUSED) { + old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + if (opline->opcode == ZEND_PRE_INC) { + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_DOUBLE, 0); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_LONG_MAX_PLUS_1); + } else if (opline->opcode == ZEND_PRE_DEC) { + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_DOUBLE, 0); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_LONG_MIN_MINUS_1); + } else if (opline->opcode == ZEND_POST_INC) { + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_LONG, 0); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_LONG_MAX); + } else if (opline->opcode == ZEND_POST_DEC) { + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_LONG, 0); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_LONG_MIN); + } + } + + exit_point = zend_jit_trace_get_exit_point(opline + 1, 0); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| jo &exit_addr + dasm_put(Dst, 2297, (ptrdiff_t)(exit_addr)); +#line 4142 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if ((opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_PRE_DEC) && + opline->result_type != IS_UNUSED) { + //| ZVAL_COPY_VALUE res_addr, res_use_info, op1_def_addr, MAY_BE_LONG, ZREG_R0, ZREG_R1 + if (MAY_BE_LONG & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_def_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_def_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_def_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_LONG & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_LONG & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_LONG & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_LONG & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_LONG); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4146 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_op1_info); + if (opline->result_type != IS_UNUSED) { + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_res_info); + } + } else if (may_overflow) { + //| jo >1 + dasm_put(Dst, 2301); +#line 4154 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_PRE_DEC) && + opline->result_type != IS_UNUSED) { + //| ZVAL_COPY_VALUE res_addr, res_use_info, op1_def_addr, MAY_BE_LONG, ZREG_R0, ZREG_R1 + if (MAY_BE_LONG & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_def_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_def_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_def_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_LONG & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_LONG & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_LONG & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_LONG & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_LONG); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4157 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.cold_code + dasm_put(Dst, 276); +#line 4159 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 4160 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) { + //|.if X64 + //| mov64 rax, 0x43e0000000000000 + //| SET_ZVAL_LVAL op1_def_addr, rax + dasm_put(Dst, 61, (unsigned int)(0x43e0000000000000), (unsigned int)((0x43e0000000000000)>>32)); + if (Z_MODE(op1_def_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(op1_def_addr))); + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } +#line 4164 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| SET_ZVAL_LVAL op1_def_addr, 0 + //| SET_ZVAL_W2 op1_def_addr, 0x41e00000 + //|.endif + } else { + //|.if X64 + //| mov64 rax, 0xc3e0000000000000 + //| SET_ZVAL_LVAL op1_def_addr, rax + dasm_put(Dst, 61, (unsigned int)(0xc3e0000000000000), (unsigned int)((0xc3e0000000000000)>>32)); + if (Z_MODE(op1_def_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(op1_def_addr))); + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } +#line 4172 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| SET_ZVAL_LVAL op1_def_addr, 0x00200000 + //| SET_ZVAL_W2 op1_def_addr, 0xc1e00000 + //|.endif + } + if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + //| SET_ZVAL_TYPE_INFO op1_def_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 4179 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_PRE_DEC) && + opline->result_type != IS_UNUSED) { + //| ZVAL_COPY_VALUE res_addr, res_use_info, op1_def_addr, MAY_BE_DOUBLE, ZREG_R0, ZREG_R1 + if (MAY_BE_DOUBLE & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_DOUBLE & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_def_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_DOUBLE & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_def_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_def_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_DOUBLE & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_DOUBLE & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_DOUBLE & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_DOUBLE & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_DOUBLE & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_DOUBLE); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4183 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >3 + //|.code + dasm_put(Dst, 2320); +#line 4186 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if ((opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_PRE_DEC) && + opline->result_type != IS_UNUSED) { + //| ZVAL_COPY_VALUE res_addr, res_use_info, op1_def_addr, MAY_BE_LONG, ZREG_R0, ZREG_R1 + if (MAY_BE_LONG & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_def_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_def_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_def_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_def_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_def_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(op1_def_addr))); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(op1_def_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_def_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_def_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_def_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_def_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_def_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_def_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_def_addr)) { + if (Z_MODE(op1_def_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_def_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_def_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_def_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_def_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_def_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_def_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } else if (Z_MODE(op1_def_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_def_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_LONG & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_LONG & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_LONG & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_LONG & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_LONG); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4190 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) { + //|.cold_code + dasm_put(Dst, 276); +#line 4194 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 4195 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 4197 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_UNDEF) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >2 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 4199 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2326, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 4202 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 4203 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_info |= MAY_BE_NULL; + } + //|2: + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + dasm_put(Dst, 2065); + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4207 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| // ZVAL_DEREF(var_ptr); + if (op1_info & MAY_BE_REF) { + //| IF_NOT_Z_TYPE, FCARG1a, IS_REFERENCE, >2 + //| GET_Z_PTR FCARG1a, FCARG1a + //| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0 + //| jz >1 + dasm_put(Dst, 2355, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, sources.ptr)); +#line 4214 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RETURN_VALUE_USED(opline)) { + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4216 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| xor FCARG2a, FCARG2a + dasm_put(Dst, 2390); +#line 4218 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_PRE_INC) { + //| EXT_CALL zend_jit_pre_inc_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_inc_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_inc_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_inc_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_inc_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_inc_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_pre_inc_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 4221 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->opcode == ZEND_PRE_DEC) { + //| EXT_CALL zend_jit_pre_dec_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_dec_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_dec_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_dec_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_dec_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_dec_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_pre_dec_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 4223 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->opcode == ZEND_POST_INC) { + //| EXT_CALL zend_jit_post_inc_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_inc_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_inc_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_inc_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_inc_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_inc_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_post_inc_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 4225 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->opcode == ZEND_POST_DEC) { + //| EXT_CALL zend_jit_post_dec_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_dec_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_dec_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_dec_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_dec_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_dec_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_post_dec_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 4227 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + zend_jit_check_exception(Dst); + //| jmp >3 + //|1: + //| lea FCARG1a, [FCARG1a + offsetof(zend_reference, val)] + //|2: + dasm_put(Dst, 2395, offsetof(zend_reference, val)); +#line 4235 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (opline->opcode == ZEND_POST_INC || opline->opcode == ZEND_POST_DEC) { + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + + //| ZVAL_COPY_VALUE res_addr, res_use_info, val_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4241 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF op1_info, ah, r2 + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2233); + } +#line 4242 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) { + if (opline->opcode == ZEND_PRE_INC && opline->result_type != IS_UNUSED) { + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4246 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_pre_inc, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_inc)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_inc)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_inc)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_inc)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_inc)), (unsigned int)((((ptrdiff_t)zend_jit_pre_inc))>>32)); + } + dasm_put(Dst, 66); + } +#line 4247 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL increment_function, r0 + if (MAY_USE_32BIT_ADDR(increment_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(increment_function)); + } else { + if (IS_SIGNED_32BIT(increment_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)increment_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)increment_function)), (unsigned int)((((ptrdiff_t)increment_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 4249 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (opline->opcode == ZEND_PRE_DEC && opline->result_type != IS_UNUSED) { + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4253 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_pre_dec, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_dec)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_dec)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_dec)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_dec)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_dec)), (unsigned int)((((ptrdiff_t)zend_jit_pre_dec))>>32)); + } + dasm_put(Dst, 66); + } +#line 4254 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL decrement_function, r0 + if (MAY_USE_32BIT_ADDR(decrement_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(decrement_function)); + } else { + if (IS_SIGNED_32BIT(decrement_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)decrement_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)decrement_function)), (unsigned int)((((ptrdiff_t)decrement_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 4256 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (may_throw) { + zend_jit_check_exception(Dst); + } + } else { + zend_reg tmp_reg; + + if (opline->opcode == ZEND_POST_INC || opline->opcode == ZEND_POST_DEC) { + //| ZVAL_COPY_VALUE res_addr, res_use_info, op1_addr, MAY_BE_DOUBLE, ZREG_R0, ZREG_R2 + if (MAY_BE_DOUBLE & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_DOUBLE & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_DOUBLE & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_DOUBLE & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_DOUBLE & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_DOUBLE & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_DOUBLE & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_DOUBLE & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_DOUBLE); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4266 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(op1_def_addr) == IS_REG) { + tmp_reg = Z_REG(op1_def_addr); + } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) { + tmp_reg = Z_REG(op1_addr); + } else { + tmp_reg = ZREG_XMM0; + } + //| DOUBLE_GET_ZVAL_DVAL tmp_reg, op1_addr + if (Z_MODE(op1_addr) != IS_REG || tmp_reg != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (tmp_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (tmp_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (tmp_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 4275 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) { + if (CAN_USE_AVX()) { + //| vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one] + dasm_put(Dst, 2415, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); +#line 4278 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| addsd xmm(tmp_reg-ZREG_XMM0), qword [->one] + dasm_put(Dst, 2427, (tmp_reg-ZREG_XMM0)); +#line 4280 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (CAN_USE_AVX()) { + //| vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one] + dasm_put(Dst, 2438, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); +#line 4284 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| subsd xmm(tmp_reg-ZREG_XMM0), qword [->one] + dasm_put(Dst, 2450, (tmp_reg-ZREG_XMM0)); +#line 4286 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| DOUBLE_SET_ZVAL_DVAL op1_def_addr, tmp_reg + if (Z_MODE(op1_def_addr) == IS_REG) { + if (tmp_reg != Z_REG(op1_def_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(op1_def_addr)-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(op1_def_addr)-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_def_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (tmp_reg-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } else { + dasm_put(Dst, 1965, (tmp_reg-ZREG_XMM0), (Z_REG(op1_def_addr)), Z_OFFSET(op1_def_addr)); + } + } +#line 4289 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_PRE_DEC) && + opline->result_type != IS_UNUSED) { + //| ZVAL_COPY_VALUE res_addr, res_use_info, op1_addr, op1_def_info, ZREG_R0, ZREG_R1 + if (op1_def_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_def_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((op1_def_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(op1_def_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((op1_def_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_def_info & MAY_BE_GUARD) && + has_concrete_type(op1_def_info & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_def_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_def_info); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 4292 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF op1_def_info, ah, r1 + if (op1_def_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (op1_def_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2199); + } +#line 4293 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| jmp >3 + //|.code + dasm_put(Dst, 2320); +#line 4297 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 4299 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_store_var_if_necessary_ex(Dst, opline->op1.var, op1_def_addr, op1_def_info, op1_addr, op1_info)) { + return 0; + } + if (opline->result_type != IS_UNUSED) { + if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) { + return 0; + } + } + return 1; +} + +static int zend_jit_opline_uses_reg(const zend_op *opline, int8_t reg) +{ + if ((opline+1)->opcode == ZEND_OP_DATA + && ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR|IS_CV)) + && JIT_G(current_frame)->stack[EX_VAR_TO_NUM((opline+1)->op1.var)].reg == reg) { + return 1; + } + return + ((opline->result_type & (IS_VAR|IS_TMP_VAR|IS_CV)) && + JIT_G(current_frame)->stack[EX_VAR_TO_NUM(opline->result.var)].reg == reg) || + ((opline->op1_type & (IS_VAR|IS_TMP_VAR|IS_CV)) && + JIT_G(current_frame)->stack[EX_VAR_TO_NUM(opline->op1.var)].reg == reg) || + ((opline->op2_type & (IS_VAR|IS_TMP_VAR|IS_CV)) && + JIT_G(current_frame)->stack[EX_VAR_TO_NUM(opline->op2.var)].reg == reg); +} + +static int zend_jit_math_long_long(dasm_State **Dst, + const zend_op *opline, + uint8_t opcode, + zend_jit_addr op1_addr, + zend_jit_addr op2_addr, + zend_jit_addr res_addr, + uint32_t res_info, + uint32_t res_use_info, + int may_overflow) +{ + bool must_set_cflags = 0; + bool same_ops = zend_jit_same_addr(op1_addr, op2_addr); + zend_reg result_reg; + zend_reg tmp_reg = ZREG_R0; + + if (Z_MODE(res_addr) == IS_REG && (res_info & MAY_BE_LONG)) { + if (may_overflow && (res_info & MAY_BE_GUARD) + && JIT_G(current_frame) + && zend_jit_opline_uses_reg(opline, Z_REG(res_addr))) { + result_reg = ZREG_R0; + } else { + result_reg = Z_REG(res_addr); + } + } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr) && !may_overflow) { + result_reg = Z_REG(op1_addr); + } else if (Z_REG(res_addr) != ZREG_R0) { + result_reg = ZREG_R0; + } else { + /* ASSIGN_DIM_OP */ + result_reg = ZREG_FCARG1; + tmp_reg = ZREG_FCARG1; + } + + if (may_overflow) { + must_set_cflags = 1; + } else { + const zend_op *next_opline = opline + 1; + + if (next_opline->opcode == ZEND_IS_EQUAL || + next_opline->opcode == ZEND_IS_NOT_EQUAL || + next_opline->opcode == ZEND_IS_SMALLER || + next_opline->opcode == ZEND_IS_SMALLER_OR_EQUAL || + next_opline->opcode == ZEND_CASE || + next_opline->opcode == ZEND_IS_IDENTICAL || + next_opline->opcode == ZEND_IS_NOT_IDENTICAL || + next_opline->opcode == ZEND_CASE_STRICT) { + if (next_opline->op1_type == IS_CONST + && Z_TYPE_P(RT_CONSTANT(next_opline, next_opline->op1)) == IS_LONG + && Z_LVAL_P(RT_CONSTANT(next_opline, next_opline->op1)) == 0 + && next_opline->op2_type == opline->result_type + && next_opline->op2.var == opline->result.var) { + must_set_cflags = 1; + } else if (next_opline->op2_type == IS_CONST + && Z_TYPE_P(RT_CONSTANT(next_opline, next_opline->op2)) == IS_LONG + && Z_LVAL_P(RT_CONSTANT(next_opline, next_opline->op2)) == 0 + && next_opline->op2_type == opline->result_type + && next_opline->op2.var == opline->result.var) { + must_set_cflags = 1; + } + } + } + + if (opcode == ZEND_MUL && + Z_MODE(op2_addr) == IS_CONST_ZVAL && + Z_LVAL_P(Z_ZV(op2_addr)) == 2) { + if (Z_MODE(op1_addr) == IS_REG && !must_set_cflags) { + //| lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Ra(Z_REG(op1_addr))] + dasm_put(Dst, 2461, (result_reg), (Z_REG(op1_addr)), (Z_REG(op1_addr)), 0); +#line 4393 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4395 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| add Ra(result_reg), Ra(result_reg) + dasm_put(Dst, 2474, (result_reg), (result_reg)); +#line 4396 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opcode == ZEND_MUL && + Z_MODE(op2_addr) == IS_CONST_ZVAL && + !must_set_cflags && + Z_LVAL_P(Z_ZV(op2_addr)) > 0 && + zend_long_is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr)))) { + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4403 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| shl Ra(result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op2_addr))) + dasm_put(Dst, 2482, (result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))); +#line 4404 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_MUL && + Z_MODE(op1_addr) == IS_CONST_ZVAL && + Z_LVAL_P(Z_ZV(op1_addr)) == 2) { + if (Z_MODE(op2_addr) == IS_REG && !must_set_cflags) { + //| lea Ra(result_reg), [Ra(Z_REG(op2_addr))+Ra(Z_REG(op2_addr))] + dasm_put(Dst, 2461, (result_reg), (Z_REG(op2_addr)), (Z_REG(op2_addr)), 0); +#line 4409 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_LVAL result_reg, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (result_reg != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4411 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| add Ra(result_reg), Ra(result_reg) + dasm_put(Dst, 2474, (result_reg), (result_reg)); +#line 4412 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opcode == ZEND_MUL && + Z_MODE(op1_addr) == IS_CONST_ZVAL && + !must_set_cflags && + Z_LVAL_P(Z_ZV(op1_addr)) > 0 && + zend_long_is_power_of_two(Z_LVAL_P(Z_ZV(op1_addr)))) { + //| GET_ZVAL_LVAL result_reg, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (result_reg != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4419 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| shl Ra(result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op1_addr))) + dasm_put(Dst, 2482, (result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))); +#line 4420 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_DIV && + (Z_MODE(op2_addr) == IS_CONST_ZVAL && + zend_long_is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr))))) { + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4424 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| shr Ra(result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op2_addr))) + dasm_put(Dst, 2489, (result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))); +#line 4425 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_ADD && + !must_set_cflags && + Z_MODE(op1_addr) == IS_REG && + Z_MODE(op2_addr) == IS_CONST_ZVAL && + IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + //| lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Z_LVAL_P(Z_ZV(op2_addr))] + dasm_put(Dst, 2496, (result_reg), (Z_REG(op1_addr)), Z_LVAL_P(Z_ZV(op2_addr))); +#line 4431 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_ADD && + !must_set_cflags && + Z_MODE(op2_addr) == IS_REG && + Z_MODE(op1_addr) == IS_CONST_ZVAL && + IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + //| lea Ra(result_reg), [Ra(Z_REG(op2_addr))+Z_LVAL_P(Z_ZV(op1_addr))] + dasm_put(Dst, 2496, (result_reg), (Z_REG(op2_addr)), Z_LVAL_P(Z_ZV(op1_addr))); +#line 4437 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_SUB && + !must_set_cflags && + Z_MODE(op1_addr) == IS_REG && + Z_MODE(op2_addr) == IS_CONST_ZVAL && + IS_SIGNED_32BIT(-Z_LVAL_P(Z_ZV(op2_addr)))) { + //| lea Ra(result_reg), [Ra(Z_REG(op1_addr))-Z_LVAL_P(Z_ZV(op2_addr))] + dasm_put(Dst, 2496, (result_reg), (Z_REG(op1_addr)), -Z_LVAL_P(Z_ZV(op2_addr))); +#line 4443 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4445 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opcode == ZEND_ADD || opcode == ZEND_SUB) + && Z_MODE(op2_addr) == IS_CONST_ZVAL + && Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + /* +/- 0 */ + may_overflow = 0; + } else if (same_ops && opcode != ZEND_DIV) { + //| LONG_MATH_REG opcode, Ra(result_reg), Ra(result_reg) + switch (opcode) { + case ZEND_ADD: + dasm_put(Dst, 2474, (result_reg), (result_reg)); + break; + case ZEND_SUB: + dasm_put(Dst, 2506, (result_reg), (result_reg)); + break; + case ZEND_MUL: + dasm_put(Dst, 2514, (result_reg), (result_reg)); + break; + case ZEND_BW_OR: + dasm_put(Dst, 2523, (result_reg), (result_reg)); + break; + case ZEND_BW_AND: + dasm_put(Dst, 2531, (result_reg), (result_reg)); + break; + case ZEND_BW_XOR: + dasm_put(Dst, 1760, (result_reg), (result_reg)); + break; + default: + ZEND_UNREACHABLE(); + } +#line 4452 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_reg tmp_reg; + + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_REG(res_addr) != ZREG_R0 && result_reg != ZREG_R0) { + tmp_reg = ZREG_R0; + } else if (Z_REG(res_addr) != ZREG_R1 && result_reg != ZREG_R1) { + tmp_reg = ZREG_R1; + } else { + tmp_reg = ZREG_R2; + } + } else if (result_reg != ZREG_R0) { + tmp_reg = ZREG_R0; + } else { + tmp_reg = ZREG_R1; + } + //| LONG_MATH opcode, result_reg, op2_addr, tmp_reg + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2539, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2274, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2553, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2474, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2563, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2290, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2577, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2506, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2587, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (result_reg), (tmp_reg)); + } else { + dasm_put(Dst, 2602, (result_reg), (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2611, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2514, (result_reg), (Z_REG(op2_addr))); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_OR: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2622, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2636, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2643, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2523, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_AND: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2653, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2667, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2674, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2531, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_XOR: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2684, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2698, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2706, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + default: + ZEND_UNREACHABLE(); + } +#line 4469 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + (void)tmp_reg; + } + } + if (may_overflow) { + if (res_info & MAY_BE_GUARD) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + if ((res_info & MAY_BE_ANY) == MAY_BE_LONG) { + //| jo &exit_addr + dasm_put(Dst, 2297, (ptrdiff_t)(exit_addr)); +#line 4481 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_REG && result_reg != Z_REG(res_addr)) { + //| mov Ra(Z_REG(res_addr)), Ra(result_reg) + dasm_put(Dst, 1782, (result_reg), (Z_REG(res_addr))); +#line 4483 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if ((res_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + //| jno &exit_addr + dasm_put(Dst, 2716, (ptrdiff_t)(exit_addr)); +#line 4486 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + if (res_info & MAY_BE_LONG) { + //| jo >1 + dasm_put(Dst, 2301); +#line 4492 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jno >1 + dasm_put(Dst, 2720); +#line 4494 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if (Z_MODE(res_addr) == IS_MEM_ZVAL && (res_info & MAY_BE_LONG)) { + //| SET_ZVAL_LVAL res_addr, Ra(result_reg) + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (result_reg), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (result_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 4500 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_LONG) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 4503 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if (may_overflow && (!(res_info & MAY_BE_GUARD) || (res_info & MAY_BE_ANY) == MAY_BE_DOUBLE)) { + zend_reg tmp_reg1 = ZREG_XMM0; + zend_reg tmp_reg2 = ZREG_XMM1; + + if (res_info & MAY_BE_LONG) { + //|.cold_code + dasm_put(Dst, 276); +#line 4513 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 4514 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + do { + if ((sizeof(void*) == 8 || Z_MODE(res_addr) != IS_REG) && + ((Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 1) || + (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1))) { + if (opcode == ZEND_ADD) { + //|.if X64 + //| mov64 Ra(tmp_reg), 0x43e0000000000000 + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(0x43e0000000000000), (unsigned int)((0x43e0000000000000)>>32)); +#line 4523 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_REG) { + //| movd xmm(Z_REG(res_addr)-ZREG_XMM0), Ra(tmp_reg) + dasm_put(Dst, 2725, (Z_REG(res_addr)-ZREG_XMM0), (tmp_reg)); +#line 4525 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_LVAL res_addr, Ra(tmp_reg) + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 4527 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| SET_ZVAL_LVAL res_addr, 0 + //| SET_ZVAL_W2 res_addr, 0x41e00000 + //|.endif + break; + } else if (opcode == ZEND_SUB) { + //|.if X64 + //| mov64 Ra(tmp_reg), 0xc3e0000000000000 + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(0xc3e0000000000000), (unsigned int)((0xc3e0000000000000)>>32)); +#line 4536 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_REG) { + //| movd xmm(Z_REG(res_addr)-ZREG_XMM0), Ra(tmp_reg) + dasm_put(Dst, 2725, (Z_REG(res_addr)-ZREG_XMM0), (tmp_reg)); +#line 4538 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_LVAL res_addr, Ra(tmp_reg) + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 4540 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| SET_ZVAL_LVAL res_addr, 0x00200000 + //| SET_ZVAL_W2 res_addr, 0xc1e00000 + //|.endif + break; + } + } + + //| DOUBLE_GET_ZVAL_LVAL tmp_reg1, op1_addr, tmp_reg + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg)); + } else { + dasm_put(Dst, 2780, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2825, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (Z_REG(op1_addr))); + } else { + dasm_put(Dst, 2780, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| DOUBLE_GET_ZVAL_LVAL tmp_reg2, op2_addr, tmp_reg + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg)); + } else { + dasm_put(Dst, 2780, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2825, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (Z_REG(op2_addr))); + } else { + dasm_put(Dst, 2780, (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (tmp_reg2-ZREG_XMM0), (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4551 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (CAN_USE_AVX()) { + //| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2 + switch (opcode) { + case ZEND_ADD: + dasm_put(Dst, 2846, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + case ZEND_SUB: + dasm_put(Dst, 2858, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + case ZEND_MUL: + dasm_put(Dst, 2870, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + case ZEND_DIV: + dasm_put(Dst, 2882, (tmp_reg1-ZREG_XMM0), (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + } +#line 4553 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SSE_MATH_REG opcode, tmp_reg1, tmp_reg2 + switch (opcode) { + case ZEND_ADD: + dasm_put(Dst, 2894, (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + case ZEND_SUB: + dasm_put(Dst, 2905, (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + case ZEND_MUL: + dasm_put(Dst, 2916, (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + case ZEND_DIV: + dasm_put(Dst, 2927, (tmp_reg1-ZREG_XMM0), (tmp_reg2-ZREG_XMM0)); + break; + } +#line 4555 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| DOUBLE_SET_ZVAL_DVAL res_addr, tmp_reg1 + if (Z_MODE(res_addr) == IS_REG) { + if (tmp_reg1 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (tmp_reg1-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (tmp_reg1-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (tmp_reg1-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (tmp_reg1-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } +#line 4557 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } while (0); + + if (Z_MODE(res_addr) == IS_MEM_ZVAL + && (res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 4562 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (res_info & MAY_BE_LONG) { + //| jmp >2 + //|.code + dasm_put(Dst, 2938); +#line 4566 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + dasm_put(Dst, 2065); +#line 4568 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_math_long_double(dasm_State **Dst, + uint8_t opcode, + zend_jit_addr op1_addr, + zend_jit_addr op2_addr, + zend_jit_addr res_addr, + uint32_t res_use_info) +{ + zend_reg result_reg = + (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + zend_reg tmp_reg; + + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + tmp_reg = ZREG_R1; + } else { + tmp_reg = ZREG_R0; + } + + //| DOUBLE_GET_ZVAL_LVAL result_reg, op1_addr, tmp_reg + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg)); + } else { + dasm_put(Dst, 2780, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2825, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr))); + } else { + dasm_put(Dst, 2780, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4592 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + if (CAN_USE_AVX()) { + //| AVX_MATH opcode, result_reg, result_reg, op2_addr, r1 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 2944, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 2956, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2970, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2846, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 2984, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 2996, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3010, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2858, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3024, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3036, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3050, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2870, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3064, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3076, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3090, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2882, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4597 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SSE_MATH opcode, result_reg, op2_addr, r1 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3104, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3115, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3128, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3141, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3152, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3165, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3178, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3189, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3202, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3215, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3226, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3239, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4599 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (CAN_USE_AVX()) { + //| AVX_MATH opcode, result_reg, result_reg, op2_addr, r0 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 2944, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3252, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2970, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2846, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 2984, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3266, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3010, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2858, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3024, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3280, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3050, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2870, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3064, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3294, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3090, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2882, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4603 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SSE_MATH opcode, result_reg, op2_addr, r0 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3104, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3308, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3128, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3141, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3321, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3165, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3178, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3334, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3202, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3215, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 3347, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3239, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4605 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| DOUBLE_SET_ZVAL_DVAL res_addr, result_reg + if (Z_MODE(res_addr) == IS_REG) { + if (result_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (result_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (result_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } +#line 4608 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 4612 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + return 1; +} + +static int zend_jit_math_double_long(dasm_State **Dst, + uint8_t opcode, + zend_jit_addr op1_addr, + zend_jit_addr op2_addr, + zend_jit_addr res_addr, + uint32_t res_use_info) +{ + zend_reg result_reg, tmp_reg_gp; + + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + tmp_reg_gp = ZREG_R1; + } else { + tmp_reg_gp = ZREG_R0; + } + + if (zend_is_commutative(opcode) + && (Z_MODE(res_addr) != IS_REG || Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr))) { + if (Z_MODE(res_addr) == IS_REG) { + result_reg = Z_REG(res_addr); + } else { + result_reg = ZREG_XMM0; + } + //| DOUBLE_GET_ZVAL_LVAL result_reg, op2_addr, tmp_reg_gp + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (tmp_reg_gp), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg_gp), Z_LVAL_P(Z_ZV(op2_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg_gp)); + } else { + dasm_put(Dst, 2780, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg_gp)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2825, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } else { + dasm_put(Dst, 2780, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4642 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + if (CAN_USE_AVX()) { + //| AVX_MATH opcode, result_reg, result_reg, op1_addr, r1 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 2944, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 2956, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2970, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2846, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 2984, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 2996, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3010, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2858, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3024, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3036, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3050, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2870, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3064, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3076, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3090, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2882, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4646 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SSE_MATH opcode, result_reg, op1_addr, r1 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3104, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3115, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3128, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3141, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3152, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3165, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3178, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3189, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3202, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3215, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3226, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3239, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4648 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (CAN_USE_AVX()) { + //| AVX_MATH opcode, result_reg, result_reg, op1_addr, r0 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 2944, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3252, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2970, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2846, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 2984, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3266, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3010, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2858, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3024, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3280, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3050, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2870, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3064, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3294, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3090, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2882, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4652 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SSE_MATH opcode, result_reg, op1_addr, r0 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3104, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3308, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3128, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3141, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3321, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3165, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3178, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3334, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3202, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 3215, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 3347, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3239, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4654 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + zend_reg tmp_reg; + + if (Z_MODE(res_addr) == IS_REG) { + result_reg = Z_REG(res_addr); + tmp_reg = (result_reg == ZREG_XMM0) ? ZREG_XMM1 : ZREG_XMM0; + } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) { + result_reg = Z_REG(op1_addr); + tmp_reg = ZREG_XMM0; + } else { + result_reg = ZREG_XMM0; + tmp_reg = ZREG_XMM1; + } + if (CAN_USE_AVX()) { + zend_reg op1_reg; + + if (Z_MODE(op1_addr) == IS_REG) { + op1_reg = Z_REG(op1_addr); + } else { + //| DOUBLE_GET_ZVAL_DVAL result_reg, op1_addr + if (Z_MODE(op1_addr) != IS_REG || result_reg != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (result_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 4676 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_reg = result_reg; + } + if ((opcode == ZEND_ADD || opcode == ZEND_SUB) + && Z_MODE(op2_addr) == IS_CONST_ZVAL + && Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + /* +/- 0 */ + } else { + //| DOUBLE_GET_ZVAL_LVAL tmp_reg, op2_addr, tmp_reg_gp + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (tmp_reg_gp), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg_gp), Z_LVAL_P(Z_ZV(op2_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg_gp)); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg_gp)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2825, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4684 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg + switch (opcode) { + case ZEND_ADD: + dasm_put(Dst, 2846, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + case ZEND_SUB: + dasm_put(Dst, 2858, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + case ZEND_MUL: + dasm_put(Dst, 2870, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + case ZEND_DIV: + dasm_put(Dst, 2882, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + } +#line 4685 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| DOUBLE_GET_ZVAL_DVAL result_reg, op1_addr + if (Z_MODE(op1_addr) != IS_REG || result_reg != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (result_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 4688 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opcode == ZEND_ADD || opcode == ZEND_SUB) + && Z_MODE(op2_addr) == IS_CONST_ZVAL + && Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + /* +/- 0 */ + } else { + //| DOUBLE_GET_ZVAL_LVAL tmp_reg, op2_addr, tmp_reg_gp + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (tmp_reg_gp), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg_gp), Z_LVAL_P(Z_ZV(op2_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg_gp)); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg_gp)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2825, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4694 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SSE_MATH_REG opcode, result_reg, tmp_reg + switch (opcode) { + case ZEND_ADD: + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + case ZEND_SUB: + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + case ZEND_MUL: + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + case ZEND_DIV: + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + break; + } +#line 4695 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + //| DOUBLE_SET_ZVAL_DVAL res_addr, result_reg + if (Z_MODE(res_addr) == IS_REG) { + if (result_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (result_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (result_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } +#line 4699 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 4704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + return 1; +} + +static int zend_jit_math_double_double(dasm_State **Dst, + uint8_t opcode, + zend_jit_addr op1_addr, + zend_jit_addr op2_addr, + zend_jit_addr res_addr, + uint32_t res_use_info) +{ + bool same_ops = zend_jit_same_addr(op1_addr, op2_addr); + zend_reg result_reg; + + if (Z_MODE(res_addr) == IS_REG) { + result_reg = Z_REG(res_addr); + } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) { + result_reg = Z_REG(op1_addr); + } else if (zend_is_commutative(opcode) && Z_MODE(op2_addr) == IS_REG && Z_LAST_USE(op2_addr)) { + result_reg = Z_REG(op2_addr); + } else { + result_reg = ZREG_XMM0; + } + + if (CAN_USE_AVX()) { + zend_reg op1_reg; + zend_jit_addr val_addr; + + if (Z_MODE(op1_addr) == IS_REG) { + op1_reg = Z_REG(op1_addr); + val_addr = op2_addr; + } else if (Z_MODE(op2_addr) == IS_REG && zend_is_commutative(opcode)) { + op1_reg = Z_REG(op2_addr); + val_addr = op1_addr; + } else { + //| DOUBLE_GET_ZVAL_DVAL result_reg, op1_addr + if (Z_MODE(op1_addr) != IS_REG || result_reg != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (result_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 4743 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_reg = result_reg; + val_addr = op2_addr; + } + if ((opcode == ZEND_MUL) && + Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) { + //| AVX_MATH_REG ZEND_ADD, result_reg, op1_reg, op1_reg + switch (ZEND_ADD) { + case ZEND_ADD: + dasm_put(Dst, 2846, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (op1_reg-ZREG_XMM0)); + break; + case ZEND_SUB: + dasm_put(Dst, 2858, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (op1_reg-ZREG_XMM0)); + break; + case ZEND_MUL: + dasm_put(Dst, 2870, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (op1_reg-ZREG_XMM0)); + break; + case ZEND_DIV: + dasm_put(Dst, 2882, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (op1_reg-ZREG_XMM0)); + break; + } +#line 4749 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + //| AVX_MATH opcode, result_reg, op1_reg, val_addr, r1 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 2944, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 2956, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2970, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2846, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 2984, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 2996, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3010, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2858, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3024, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3036, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3050, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2870, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3064, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3076, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3090, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2882, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4752 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| AVX_MATH opcode, result_reg, op1_reg, val_addr, r0 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 2944, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3252, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2970, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2846, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 2984, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3266, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3010, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2858, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3024, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3280, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3050, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2870, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3064, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3294, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3090, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2882, (op1_reg-ZREG_XMM0), (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4754 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + zend_jit_addr val_addr; + + if (Z_MODE(op1_addr) != IS_REG && Z_MODE(op2_addr) == IS_REG && zend_is_commutative(opcode)) { + //| DOUBLE_GET_ZVAL_DVAL result_reg, op2_addr + if (Z_MODE(op2_addr) != IS_REG || result_reg != Z_REG(op2_addr)) { + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 1988, (result_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (result_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2028, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (result_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 4760 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + val_addr = op1_addr; + } else { + //| DOUBLE_GET_ZVAL_DVAL result_reg, op1_addr + if (Z_MODE(op1_addr) != IS_REG || result_reg != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (result_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (result_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (result_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 4763 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + val_addr = op2_addr; + } + if (same_ops) { + //| SSE_MATH_REG opcode, result_reg, result_reg + switch (opcode) { + case ZEND_ADD: + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + case ZEND_SUB: + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + case ZEND_MUL: + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + case ZEND_DIV: + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + } +#line 4767 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((opcode == ZEND_MUL) && + Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) { + //| SSE_MATH_REG ZEND_ADD, result_reg, result_reg + switch (ZEND_ADD) { + case ZEND_ADD: + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + case ZEND_SUB: + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + case ZEND_MUL: + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + case ZEND_DIV: + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (result_reg-ZREG_XMM0)); + break; + } +#line 4770 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + //| SSE_MATH opcode, result_reg, val_addr, r1 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3104, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3115, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3128, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3141, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3152, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3165, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3178, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3189, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3202, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3215, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3226, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3239, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4773 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SSE_MATH opcode, result_reg, val_addr, r0 + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3104, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3308, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3128, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2894, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3141, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3321, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3165, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2905, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3178, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3334, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3202, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2916, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_DIV: + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3215, (result_reg-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 3347, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32), (result_reg-ZREG_XMM0)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 3239, (result_reg-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + dasm_put(Dst, 2927, (result_reg-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + ZEND_UNREACHABLE(); + } + break; + } +#line 4775 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| DOUBLE_SET_ZVAL_DVAL res_addr, result_reg + if (Z_MODE(res_addr) == IS_REG) { + if (result_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (result_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (result_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (result_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } +#line 4778 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 4783 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + return 1; +} + +static int zend_jit_math_helper(dasm_State **Dst, + const zend_op *opline, + uint8_t opcode, + uint8_t op1_type, + znode_op op1, + zend_jit_addr op1_addr, + uint32_t op1_info, + uint8_t op2_type, + znode_op op2, + zend_jit_addr op2_addr, + uint32_t op2_info, + uint32_t res_var, + zend_jit_addr res_addr, + uint32_t res_info, + uint32_t res_use_info, + int may_overflow, + int may_throw) +/* Labels: 1,2,3,4,5,6 */ +{ + bool same_ops = zend_jit_same_addr(op1_addr, op2_addr); + + if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG) && (res_info & (MAY_BE_LONG|MAY_BE_DOUBLE))) { + if (op1_info & (MAY_BE_ANY-MAY_BE_LONG)) { + if (op1_info & MAY_BE_DOUBLE) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4815 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4817 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!same_ops && (op2_info & (MAY_BE_ANY-MAY_BE_LONG))) { + if (op2_info & MAY_BE_DOUBLE) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >1 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); +#line 4822 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3386, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4823 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 4824 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & (MAY_BE_ANY-(MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4826 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_math_long_double(Dst, opcode, op1_addr, op2_addr, res_addr, res_use_info)) { + return 0; + } + //| jmp >5 + //|.code + dasm_put(Dst, 3400); +#line 4832 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4834 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_math_long_long(Dst, opline, opcode, op1_addr, op2_addr, res_addr, res_info, res_use_info, may_overflow)) { + return 0; + } + if (op1_info & MAY_BE_DOUBLE) { + //|.cold_code + dasm_put(Dst, 276); +#line 4841 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|3: + dasm_put(Dst, 333); +#line 4842 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_ANY-(MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4844 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op2_info & MAY_BE_DOUBLE) { + if (!same_ops && (op2_info & (MAY_BE_ANY-MAY_BE_DOUBLE))) { + if (!same_ops) { + //| IF_NOT_ZVAL_TYPE, op2_addr, IS_DOUBLE, >1 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4849 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE, op2_addr, IS_DOUBLE, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4851 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_math_double_double(Dst, opcode, op1_addr, op2_addr, res_addr, res_use_info)) { + return 0; + } + //| jmp >5 + dasm_put(Dst, 3406); +#line 4857 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!same_ops) { + //|1: + dasm_put(Dst, 70); +#line 4860 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & (MAY_BE_ANY-(MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4862 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_math_double_long(Dst, opcode, op1_addr, op2_addr, res_addr, res_use_info)) { + return 0; + } + //| jmp >5 + dasm_put(Dst, 3406); +#line 4867 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 4869 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if ((op1_info & MAY_BE_DOUBLE) && + !(op1_info & MAY_BE_LONG) && + (op2_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (res_info & MAY_BE_DOUBLE)) { + if (op1_info & (MAY_BE_ANY-MAY_BE_DOUBLE)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4876 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op2_info & MAY_BE_DOUBLE) { + if (!same_ops && (op2_info & (MAY_BE_ANY-MAY_BE_DOUBLE))) { + if (!same_ops && (op2_info & MAY_BE_LONG)) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >1 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4881 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4883 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_math_double_double(Dst, opcode, op1_addr, op2_addr, res_addr, res_use_info)) { + return 0; + } + } + if (!same_ops && (op2_info & MAY_BE_LONG)) { + if (op2_info & MAY_BE_DOUBLE) { + //|.cold_code + dasm_put(Dst, 276); +#line 4892 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + dasm_put(Dst, 70); +#line 4894 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & (MAY_BE_ANY-(MAY_BE_DOUBLE|MAY_BE_LONG))) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4896 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_math_double_long(Dst, opcode, op1_addr, op2_addr, res_addr, res_use_info)) { + return 0; + } + if (op2_info & MAY_BE_DOUBLE) { + //| jmp >5 + //|.code + dasm_put(Dst, 3400); +#line 4903 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if ((op2_info & MAY_BE_DOUBLE) && + !(op2_info & MAY_BE_LONG) && + (op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (res_info & MAY_BE_DOUBLE)) { + if (op2_info & (MAY_BE_ANY-MAY_BE_DOUBLE)) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4911 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_DOUBLE) { + if (!same_ops && (op1_info & (MAY_BE_ANY-MAY_BE_DOUBLE))) { + if (!same_ops && (op1_info & MAY_BE_LONG)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4916 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 4918 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_math_double_double(Dst, opcode, op1_addr, op2_addr, res_addr, res_use_info)) { + return 0; + } + } + if (!same_ops && (op1_info & MAY_BE_LONG)) { + if (op1_info & MAY_BE_DOUBLE) { + //|.cold_code + dasm_put(Dst, 276); +#line 4927 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + dasm_put(Dst, 70); +#line 4929 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_ANY-(MAY_BE_DOUBLE|MAY_BE_LONG))) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 4931 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_math_long_double(Dst, opcode, op1_addr, op2_addr, res_addr, res_use_info)) { + return 0; + } + if (op1_info & MAY_BE_DOUBLE) { + //| jmp >5 + //|.code + dasm_put(Dst, 3400); +#line 4938 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + //|5: + dasm_put(Dst, 509); +#line 4943 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if ((op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) || + (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE)))) { + if ((op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (op2_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (res_info & (MAY_BE_LONG|MAY_BE_DOUBLE))) { + //|.cold_code + dasm_put(Dst, 276); +#line 4950 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|6: + dasm_put(Dst, 3411); +#line 4952 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != ZREG_FCARG1) { + if (Z_MODE(res_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var); + //| LOAD_ZVAL_ADDR FCARG1a, real_addr + if (Z_MODE(real_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(real_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(real_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(real_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(real_addr)))>>32)); + } + } else if (Z_MODE(real_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(real_addr)) { + dasm_put(Dst, 2341, (Z_REG(real_addr)), Z_OFFSET(real_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(real_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4956 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4958 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(op1_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var); + if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) { + return 0; + } + op1_addr = real_addr; + } + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4967 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (Z_MODE(op1_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var); + if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) { + return 0; + } + op1_addr = real_addr; + } + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4976 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var); + //| LOAD_ZVAL_ADDR FCARG1a, real_addr + if (Z_MODE(real_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(real_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(real_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(real_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(real_addr)))>>32)); + } + } else if (Z_MODE(real_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(real_addr)) { + dasm_put(Dst, 2341, (Z_REG(real_addr)), Z_OFFSET(real_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(real_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4979 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4981 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (Z_MODE(op2_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var); + if (!zend_jit_spill_store(Dst, op2_addr, real_addr, op2_info, 1)) { + return 0; + } + op2_addr = real_addr; + } + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 3424, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 4993 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR op2_addr, r0 + //|.endif + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 4998 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opcode == ZEND_ADD) { + //| EXT_CALL add_function, r0 + if (MAY_USE_32BIT_ADDR(add_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(add_function)); + } else { + if (IS_SIGNED_32BIT(add_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)add_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)add_function)), (unsigned int)((((ptrdiff_t)add_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5000 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_SUB) { + //| EXT_CALL sub_function, r0 + if (MAY_USE_32BIT_ADDR(sub_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(sub_function)); + } else { + if (IS_SIGNED_32BIT(sub_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)sub_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)sub_function)), (unsigned int)((((ptrdiff_t)sub_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5002 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_MUL) { + //| EXT_CALL mul_function, r0 + if (MAY_USE_32BIT_ADDR(mul_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(mul_function)); + } else { + if (IS_SIGNED_32BIT(mul_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)mul_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)mul_function)), (unsigned int)((((ptrdiff_t)mul_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5004 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_DIV) { + //| EXT_CALL div_function, r0 + if (MAY_USE_32BIT_ADDR(div_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(div_function)); + } else { + if (IS_SIGNED_32BIT(div_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)div_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)div_function)), (unsigned int)((((ptrdiff_t)div_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5006 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + //|.if not(X64) + //| add r4, 12 + //|.endif + //| FREE_OP op1_type, op1, op1_info, 0, NULL + if (op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5013 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP op2_type, op2, op2_info, 0, NULL + if (op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5014 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + if (opline->opcode == ZEND_ASSIGN_DIM_OP && (opline->op2_type & (IS_VAR|IS_TMP_VAR))) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 5017 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->exception_handler_free_op2 + dasm_put(Dst, 3438, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 5018 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RX) { + zend_jit_check_exception_undef_result(Dst, opline); + } else { + zend_jit_check_exception(Dst); + } + } + if (Z_MODE(res_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var); + if (!zend_jit_load_reg(Dst, real_addr, res_addr, res_info)) { + return 0; + } + } + if ((op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (op2_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (res_info & (MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| jmp <5 + //|.code + dasm_put(Dst, 3448); +#line 5035 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + return 1; +} + +static int zend_jit_math(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, int may_overflow, int may_throw) +{ + ZEND_ASSERT(!(op1_info & MAY_BE_UNDEF) && !(op2_info & MAY_BE_UNDEF)); + ZEND_ASSERT((op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (op2_info & (MAY_BE_LONG|MAY_BE_DOUBLE))); + + if (!zend_jit_math_helper(Dst, opline, opline->opcode, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, opline->result.var, res_addr, res_info, res_use_info, may_overflow, may_throw)) { + return 0; + } + if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) { + return 0; + } + return 1; +} + +static int zend_jit_add_arrays(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr res_addr) +{ + if (Z_MODE(op2_addr) != IS_MEM_ZVAL || Z_REG(op2_addr) != ZREG_FCARG1) { + //| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5060 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5061 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != ZREG_FCARG2) { + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5063 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5064 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_LVAL ZREG_R0, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R0), (ZREG_R0)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_R0 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_R0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5066 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5067 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG2a, r0 + dasm_put(Dst, 3454); +#line 5068 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_add_arrays_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_add_arrays_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_add_arrays_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_add_arrays_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_add_arrays_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_add_arrays_helper)), (unsigned int)((((ptrdiff_t)zend_jit_add_arrays_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 5070 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_PTR res_addr, r0 + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 5071 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_ARRAY_EX + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 5072 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5073 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5074 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_long_math_helper(dasm_State **Dst, + const zend_op *opline, + uint8_t opcode, + uint8_t op1_type, + znode_op op1, + zend_jit_addr op1_addr, + uint32_t op1_info, + zend_ssa_range *op1_range, + uint8_t op2_type, + znode_op op2, + zend_jit_addr op2_addr, + uint32_t op2_info, + zend_ssa_range *op2_range, + uint32_t res_var, + zend_jit_addr res_addr, + uint32_t res_info, + uint32_t res_use_info, + int may_throw) +/* Labels: 6 */ +{ + bool same_ops = zend_jit_same_addr(op1_addr, op2_addr); + zend_reg result_reg; + + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 5102 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!same_ops && (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG))) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 5105 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (opcode == ZEND_MOD) { + result_reg = ZREG_RAX; + } else if (Z_MODE(res_addr) == IS_REG) { + if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR) + && opline->op2_type != IS_CONST) { + result_reg = ZREG_R0; + } else { + result_reg = Z_REG(res_addr); + } + } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) { + result_reg = Z_REG(op1_addr); + } else if (Z_REG(res_addr) != ZREG_R0) { + result_reg = ZREG_R0; + } else { + /* ASSIGN_DIM_OP */ + if (ZREG_FCARG1 == ZREG_RCX + && (opcode == ZEND_SL || opcode == ZEND_SR) + && Z_MODE(op2_addr) != IS_CONST_ZVAL) { + result_reg = ZREG_R2; + } else { + result_reg = ZREG_FCARG1; + } + } + + if (opcode == ZEND_SL) { + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + zend_long op2_lval = Z_LVAL_P(Z_ZV(op2_addr)); + + if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) { + if (EXPECTED(op2_lval > 0)) { + //| xor Ra(result_reg), Ra(result_reg) + dasm_put(Dst, 1760, (result_reg), (result_reg)); +#line 5138 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5142 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->negative_shift + dasm_put(Dst, 3458); +#line 5143 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (Z_MODE(op1_addr) == IS_REG && op2_lval == 1) { + //| lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Ra(Z_REG(op1_addr))] + dasm_put(Dst, 2461, (result_reg), (Z_REG(op1_addr)), (Z_REG(op1_addr)), 0); +#line 5146 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5148 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| shl Ra(result_reg), op2_lval + dasm_put(Dst, 2482, (result_reg), op2_lval); +#line 5149 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (Z_MODE(op2_addr) != IS_REG || Z_REG(op2_addr) != ZREG_RCX) { + //| GET_ZVAL_LVAL ZREG_RCX, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_RCX), (ZREG_RCX)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_RCX), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_RCX), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_RCX), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_RCX != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_RCX)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5153 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!op2_range || + op2_range->min < 0 || + op2_range->max >= SIZEOF_ZEND_LONG * 8) { + //| cmp r1, (SIZEOF_ZEND_LONG*8) + //| jae >1 + //|.cold_code + dasm_put(Dst, 3463, (SIZEOF_ZEND_LONG*8)); +#line 5160 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| cmp r1, 0 + //| mov Ra(result_reg), 0 + //| jg >1 + dasm_put(Dst, 3474, (result_reg)); +#line 5164 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5167 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->negative_shift + //|.code + dasm_put(Dst, 3495); +#line 5169 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5171 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| shl Ra(result_reg), cl + //|1: + dasm_put(Dst, 3501, (result_reg)); +#line 5173 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opcode == ZEND_SR) { + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5176 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + zend_long op2_lval = Z_LVAL_P(Z_ZV(op2_addr)); + + if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) { + if (EXPECTED(op2_lval > 0)) { + //| sar Ra(result_reg), (SIZEOF_ZEND_LONG * 8) - 1 + dasm_put(Dst, 3509, (result_reg), (SIZEOF_ZEND_LONG * 8) - 1); +#line 5182 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5186 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->negative_shift + dasm_put(Dst, 3458); +#line 5187 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| sar Ra(result_reg), op2_lval + dasm_put(Dst, 3509, (result_reg), op2_lval); +#line 5190 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (Z_MODE(op2_addr) != IS_REG || Z_REG(op2_addr) != ZREG_RCX) { + //| GET_ZVAL_LVAL ZREG_RCX, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_RCX), (ZREG_RCX)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_RCX), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_RCX), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_RCX), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_RCX != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_RCX)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5194 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!op2_range || + op2_range->min < 0 || + op2_range->max >= SIZEOF_ZEND_LONG * 8) { + //| cmp r1, (SIZEOF_ZEND_LONG*8) + //| jae >1 + //|.cold_code + dasm_put(Dst, 3463, (SIZEOF_ZEND_LONG*8)); +#line 5201 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| cmp r1, 0 + //| mov r1, (SIZEOF_ZEND_LONG * 8) - 1 + //| jg >1 + dasm_put(Dst, 3517, (SIZEOF_ZEND_LONG * 8) - 1); +#line 5205 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5208 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->negative_shift + //|.code + dasm_put(Dst, 3495); +#line 5210 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + //| sar Ra(result_reg), cl + dasm_put(Dst, 3533, (result_reg)); +#line 5213 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opcode == ZEND_MOD) { + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + zend_long op2_lval = Z_LVAL_P(Z_ZV(op2_addr)); + + if (op2_lval == 0) { + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->mod_by_zero + dasm_put(Dst, 3542); +#line 5223 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (zend_long_is_power_of_two(op2_lval) && op1_range && op1_range->min >= 0) { + zval tmp; + zend_jit_addr tmp_addr; + zend_reg tmp_reg; + + /* Optimisation for mod of power of 2 */ + ZVAL_LONG(&tmp, op2_lval - 1); + tmp_addr = ZEND_ADDR_CONST_ZVAL(&tmp); + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + tmp_reg = ZREG_R1; + } else if (result_reg != ZREG_R0) { + tmp_reg = ZREG_R0; + } else { + tmp_reg = ZREG_R1; + } + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5239 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LONG_MATH ZEND_BW_AND, result_reg, tmp_addr, tmp_reg + switch (ZEND_BW_AND) { + case ZEND_ADD: + if (Z_MODE(tmp_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(tmp_addr)))) { + dasm_put(Dst, 2539, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(tmp_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(tmp_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2274, (result_reg), Z_LVAL_P(Z_ZV(tmp_addr))); + } + } else if (Z_MODE(tmp_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2553, (result_reg), (Z_REG(tmp_addr)), Z_OFFSET(tmp_addr)); + } else if (Z_MODE(tmp_addr) == IS_REG) { + dasm_put(Dst, 2474, (Z_REG(tmp_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(tmp_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(tmp_addr)))) { + dasm_put(Dst, 2563, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(tmp_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(tmp_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2290, (result_reg), Z_LVAL_P(Z_ZV(tmp_addr))); + } + } else if (Z_MODE(tmp_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2577, (result_reg), (Z_REG(tmp_addr)), Z_OFFSET(tmp_addr)); + } else if (Z_MODE(tmp_addr) == IS_REG) { + dasm_put(Dst, 2506, (Z_REG(tmp_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(tmp_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(tmp_addr)))) { + dasm_put(Dst, 2587, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(tmp_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(tmp_addr)))>>32), (result_reg), (tmp_reg)); + } else { + dasm_put(Dst, 2602, (result_reg), (result_reg), Z_LVAL_P(Z_ZV(tmp_addr))); + } + } else if (Z_MODE(tmp_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2611, (result_reg), (Z_REG(tmp_addr)), Z_OFFSET(tmp_addr)); + } else if (Z_MODE(tmp_addr) == IS_REG) { + dasm_put(Dst, 2514, (result_reg), (Z_REG(tmp_addr))); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_OR: + if (Z_MODE(tmp_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(tmp_addr)))) { + dasm_put(Dst, 2622, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(tmp_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(tmp_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2636, (result_reg), Z_LVAL_P(Z_ZV(tmp_addr))); + } + } else if (Z_MODE(tmp_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2643, (result_reg), (Z_REG(tmp_addr)), Z_OFFSET(tmp_addr)); + } else if (Z_MODE(tmp_addr) == IS_REG) { + dasm_put(Dst, 2523, (Z_REG(tmp_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_AND: + if (Z_MODE(tmp_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(tmp_addr)))) { + dasm_put(Dst, 2653, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(tmp_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(tmp_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2667, (result_reg), Z_LVAL_P(Z_ZV(tmp_addr))); + } + } else if (Z_MODE(tmp_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2674, (result_reg), (Z_REG(tmp_addr)), Z_OFFSET(tmp_addr)); + } else if (Z_MODE(tmp_addr) == IS_REG) { + dasm_put(Dst, 2531, (Z_REG(tmp_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_XOR: + if (Z_MODE(tmp_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(tmp_addr)))) { + dasm_put(Dst, 2684, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(tmp_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(tmp_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2698, (result_reg), Z_LVAL_P(Z_ZV(tmp_addr))); + } + } else if (Z_MODE(tmp_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2706, (result_reg), (Z_REG(tmp_addr)), Z_OFFSET(tmp_addr)); + } else if (Z_MODE(tmp_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(tmp_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + default: + ZEND_UNREACHABLE(); + } +#line 5240 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + (void)tmp_reg; + } else { + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) { + //| mov aword T1, r0 // save + dasm_put(Dst, 3547); +#line 5244 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RCX) { + //| mov aword T1, Ra(ZREG_RCX) // save + dasm_put(Dst, 3552, (ZREG_RCX)); +#line 5246 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + result_reg = ZREG_RDX; + if (op2_lval == -1) { + //| xor Ra(result_reg), Ra(result_reg) + dasm_put(Dst, 1760, (result_reg), (result_reg)); +#line 5250 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_LVAL ZREG_RAX, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_RAX), (ZREG_RAX)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_RAX), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_RAX), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_RAX), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_RAX != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_RAX)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5252 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_LVAL ZREG_RCX, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_RCX), (ZREG_RCX)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_RCX), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_RCX), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_RCX), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_RCX != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_RCX)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5253 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| cqo + //|.else + //| cdq + //|.endif + //| idiv Ra(ZREG_RCX) + dasm_put(Dst, 3559, (ZREG_RCX)); +#line 5259 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) { + //| mov r0, aword T1 // restore + dasm_put(Dst, 3569); +#line 5262 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RCX) { + //| mov Ra(ZREG_RCX), aword T1 // restore + dasm_put(Dst, 3574, (ZREG_RCX)); +#line 5264 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if ((op2_type & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) || !op2_range || (op2_range->min <= 0 && op2_range->max >= 0)) { + if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + //| cmp aword [Ra(Z_REG(op2_addr))+Z_OFFSET(op2_addr)], 0 + dasm_put(Dst, 3581, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); +#line 5270 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(op2_addr) == IS_REG) { + //| test Ra(Z_REG(op2_addr)), Ra(Z_REG(op2_addr)) + dasm_put(Dst, 3590, (Z_REG(op2_addr)), (Z_REG(op2_addr))); +#line 5272 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jz >1 + //|.cold_code + dasm_put(Dst, 3598); +#line 5275 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 5276 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5279 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->mod_by_zero + //|.code + dasm_put(Dst, 3604); +#line 5281 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + /* Prevent overflow error/crash if op1 == LONG_MIN and op2 == -1 */ + if (!op2_range || (op2_range->min <= -1 && op2_range->max >= -1)) { + if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + //| cmp aword [Ra(Z_REG(op2_addr))+Z_OFFSET(op2_addr)], -1 + dasm_put(Dst, 3610, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); +#line 5287 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(op2_addr) == IS_REG) { + //| cmp Ra(Z_REG(op2_addr)), -1 + dasm_put(Dst, 3620, (Z_REG(op2_addr))); +#line 5289 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jz >1 + //|.cold_code + dasm_put(Dst, 3598); +#line 5292 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| SET_ZVAL_LVAL res_addr, 0 + dasm_put(Dst, 70); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 2075, (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2085, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 5294 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_LONG) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 5298 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + //| jmp >5 + //|.code + dasm_put(Dst, 3400); +#line 5303 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) { + //| mov aword T1, r0 // save + dasm_put(Dst, 3547); +#line 5307 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + result_reg = ZREG_RDX; + //| GET_ZVAL_LVAL ZREG_RAX, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_RAX), (ZREG_RAX)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_RAX), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_RAX), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_RAX), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_RAX != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_RAX)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5310 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| cqo + //|.else + //| cdq + //|.endif + dasm_put(Dst, 3629); +#line 5315 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + //| idiv aword [Ra(Z_REG(op2_addr))+Z_OFFSET(op2_addr)] + dasm_put(Dst, 3632, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); +#line 5317 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(op2_addr) == IS_REG) { + //| idiv Ra(Z_REG(op2_addr)) + dasm_put(Dst, 3561, (Z_REG(op2_addr))); +#line 5319 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) { + //| mov r0, aword T1 // restore + dasm_put(Dst, 3569); +#line 5322 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (same_ops) { + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5326 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LONG_MATH_REG opcode, Ra(result_reg), Ra(result_reg) + switch (opcode) { + case ZEND_ADD: + dasm_put(Dst, 2474, (result_reg), (result_reg)); + break; + case ZEND_SUB: + dasm_put(Dst, 2506, (result_reg), (result_reg)); + break; + case ZEND_MUL: + dasm_put(Dst, 2514, (result_reg), (result_reg)); + break; + case ZEND_BW_OR: + dasm_put(Dst, 2523, (result_reg), (result_reg)); + break; + case ZEND_BW_AND: + dasm_put(Dst, 2531, (result_reg), (result_reg)); + break; + case ZEND_BW_XOR: + dasm_put(Dst, 1760, (result_reg), (result_reg)); + break; + default: + ZEND_UNREACHABLE(); + } +#line 5327 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_reg tmp_reg; + + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_REG(res_addr) != ZREG_R0 && result_reg != ZREG_R0) { + tmp_reg = ZREG_R0; + } else if (Z_REG(res_addr) != ZREG_R1 && result_reg != ZREG_R1) { + tmp_reg = ZREG_R1; + } else { + tmp_reg = ZREG_R2; + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R1) { + tmp_reg = ZREG_R0; + } else if (result_reg != ZREG_R0) { + tmp_reg = ZREG_R0; + } else { + tmp_reg = ZREG_R1; + } + //| GET_ZVAL_LVAL result_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (result_reg), (result_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (result_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (result_reg), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (result_reg), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (result_reg != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (result_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5346 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LONG_MATH opcode, result_reg, op2_addr, tmp_reg + switch (opcode) { + case ZEND_ADD: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2539, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2274, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2553, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2474, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_SUB: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2563, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2290, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2577, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2506, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_MUL: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2587, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (result_reg), (tmp_reg)); + } else { + dasm_put(Dst, 2602, (result_reg), (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2611, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2514, (result_reg), (Z_REG(op2_addr))); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_OR: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2622, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2636, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2643, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2523, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_AND: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2653, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2667, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2674, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 2531, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + case ZEND_BW_XOR: + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 2684, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (tmp_reg), (result_reg)); + } else { + dasm_put(Dst, 2698, (result_reg), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2706, (result_reg), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(op2_addr)), (result_reg)); + } else { + ZEND_UNREACHABLE(); + } + break; + default: + ZEND_UNREACHABLE(); + } +#line 5347 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + (void)tmp_reg; + } + + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != result_reg) { + //| SET_ZVAL_LVAL res_addr, Ra(result_reg) + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (result_reg), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (result_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 5352 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) { + if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_LONG) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 5357 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if ((op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) || + (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG))) { + if ((op1_info & MAY_BE_LONG) && + (op2_info & MAY_BE_LONG)) { + //|.cold_code + dasm_put(Dst, 276); +#line 5366 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|6: + dasm_put(Dst, 3411); +#line 5368 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != ZREG_FCARG1) { + if (Z_MODE(res_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var); + //| LOAD_ZVAL_ADDR FCARG1a, real_addr + if (Z_MODE(real_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(real_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(real_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(real_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(real_addr)))>>32)); + } + } else if (Z_MODE(real_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(real_addr)) { + dasm_put(Dst, 2341, (Z_REG(real_addr)), Z_OFFSET(real_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(real_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5372 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5374 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(op1_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var); + if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) { + return 0; + } + op1_addr = real_addr; + } + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5383 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (Z_MODE(op1_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var); + if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) { + return 0; + } + op1_addr = real_addr; + } + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5392 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var); + //| LOAD_ZVAL_ADDR FCARG1a, real_addr + if (Z_MODE(real_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(real_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(real_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(real_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(real_addr)))>>32)); + } + } else if (Z_MODE(real_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(real_addr)) { + dasm_put(Dst, 2341, (Z_REG(real_addr)), Z_OFFSET(real_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(real_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5395 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5397 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (Z_MODE(op2_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var); + if (!zend_jit_spill_store(Dst, op2_addr, real_addr, op2_info, 1)) { + return 0; + } + op2_addr = real_addr; + } + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 3424, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5408 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR op2_addr, r0 + //|.endif + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5413 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opcode == ZEND_BW_OR) { + //| EXT_CALL bitwise_or_function, r0 + if (MAY_USE_32BIT_ADDR(bitwise_or_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(bitwise_or_function)); + } else { + if (IS_SIGNED_32BIT(bitwise_or_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)bitwise_or_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)bitwise_or_function)), (unsigned int)((((ptrdiff_t)bitwise_or_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5415 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_BW_AND) { + //| EXT_CALL bitwise_and_function, r0 + if (MAY_USE_32BIT_ADDR(bitwise_and_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(bitwise_and_function)); + } else { + if (IS_SIGNED_32BIT(bitwise_and_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)bitwise_and_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)bitwise_and_function)), (unsigned int)((((ptrdiff_t)bitwise_and_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5417 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_BW_XOR) { + //| EXT_CALL bitwise_xor_function, r0 + if (MAY_USE_32BIT_ADDR(bitwise_xor_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(bitwise_xor_function)); + } else { + if (IS_SIGNED_32BIT(bitwise_xor_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)bitwise_xor_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)bitwise_xor_function)), (unsigned int)((((ptrdiff_t)bitwise_xor_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5419 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_SL) { + //| EXT_CALL shift_left_function, r0 + if (MAY_USE_32BIT_ADDR(shift_left_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(shift_left_function)); + } else { + if (IS_SIGNED_32BIT(shift_left_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)shift_left_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)shift_left_function)), (unsigned int)((((ptrdiff_t)shift_left_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5421 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_SR) { + //| EXT_CALL shift_right_function, r0 + if (MAY_USE_32BIT_ADDR(shift_right_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(shift_right_function)); + } else { + if (IS_SIGNED_32BIT(shift_right_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)shift_right_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)shift_right_function)), (unsigned int)((((ptrdiff_t)shift_right_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5423 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opcode == ZEND_MOD) { + //| EXT_CALL mod_function, r0 + if (MAY_USE_32BIT_ADDR(mod_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(mod_function)); + } else { + if (IS_SIGNED_32BIT(mod_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)mod_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)mod_function)), (unsigned int)((((ptrdiff_t)mod_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5425 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + //|.if not(X64) + //| add r4, 12 + //|.endif + if (op1_addr == res_addr && (op2_info & MAY_BE_RCN)) { + /* compound assignment may decrement "op2" refcount */ + op2_info |= MAY_BE_RC1; + } + //| FREE_OP op1_type, op1, op1_info, 0, NULL + if (op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5436 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP op2_type, op2, op2_info, 0, NULL + if (op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5437 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + if (opline->opcode == ZEND_ASSIGN_DIM_OP && (opline->op2_type & (IS_VAR|IS_TMP_VAR))) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 5440 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->exception_handler_free_op2 + dasm_put(Dst, 3438, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 5441 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RX) { + zend_jit_check_exception_undef_result(Dst, opline); + } else { + zend_jit_check_exception(Dst); + } + } + if (Z_MODE(res_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var); + if (!zend_jit_load_reg(Dst, real_addr, res_addr, res_info)) { + return 0; + } + } + if ((op1_info & MAY_BE_LONG) && + (op2_info & MAY_BE_LONG)) { + //| jmp >5 + //|.code + dasm_put(Dst, 3400); +#line 5457 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|5: + dasm_put(Dst, 509); +#line 5460 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_long_math(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_ssa_range *op1_range, zend_jit_addr op1_addr, uint32_t op2_info, zend_ssa_range *op2_range, zend_jit_addr op2_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, int may_throw) +{ + ZEND_ASSERT(!(op1_info & MAY_BE_UNDEF) && !(op2_info & MAY_BE_UNDEF)); + ZEND_ASSERT((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG)); + + if (!zend_jit_long_math_helper(Dst, opline, opline->opcode, + opline->op1_type, opline->op1, op1_addr, op1_info, op1_range, + opline->op2_type, opline->op2, op2_addr, op2_info, op2_range, + opline->result.var, res_addr, res_info, res_use_info, may_throw)) { + return 0; + } + if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) { + return 0; + } + return 1; +} + +static int zend_jit_concat_helper(dasm_State **Dst, + const zend_op *opline, + uint8_t op1_type, + znode_op op1, + zend_jit_addr op1_addr, + uint32_t op1_info, + uint8_t op2_type, + znode_op op2, + zend_jit_addr op2_addr, + uint32_t op2_info, + zend_jit_addr res_addr, + int may_throw) +{ +#if 1 + if ((op1_info & MAY_BE_STRING) && (op2_info & MAY_BE_STRING)) { + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF) - MAY_BE_STRING)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING); +#line 5498 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op2_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF) - MAY_BE_STRING)) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_STRING, >6 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_STRING); +#line 5501 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(op1_addr) == IS_MEM_ZVAL && Z_REG(op1_addr) == Z_REG(res_addr) && Z_OFFSET(op1_addr) == Z_OFFSET(res_addr)) { + if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5505 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5507 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_fast_assign_concat_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fast_assign_concat_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fast_assign_concat_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fast_assign_concat_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fast_assign_concat_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fast_assign_concat_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fast_assign_concat_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 5508 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + /* concatenation with itself may reduce refcount */ + op2_info |= MAY_BE_RC1; + } else { + if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5513 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5515 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 3424, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5517 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR op2_addr, r0 + //|.endif + if (op1_type == IS_CV || op1_type == IS_CONST) { + //| EXT_CALL zend_jit_fast_concat_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fast_concat_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fast_concat_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fast_concat_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fast_concat_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fast_concat_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fast_concat_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 5523 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_fast_concat_tmp_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fast_concat_tmp_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fast_concat_tmp_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fast_concat_tmp_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fast_concat_tmp_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fast_concat_tmp_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fast_concat_tmp_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 5525 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + } + /* concatenation with empty string may increase refcount */ + op2_info |= MAY_BE_RCN; + //| FREE_OP op2_type, op2, op2_info, 0, opline + if (op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5533 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|5: + dasm_put(Dst, 509); +#line 5534 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF) - MAY_BE_STRING)) || + (op2_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF) - MAY_BE_STRING))) { + if ((op1_info & MAY_BE_STRING) && (op2_info & MAY_BE_STRING)) { + //|.cold_code + dasm_put(Dst, 276); +#line 5539 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|6: + dasm_put(Dst, 3411); +#line 5540 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#endif + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != ZREG_FCARG1) { + if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5545 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5547 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5549 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5551 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 3424, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5555 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR op2_addr, r0 + //|.endif + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 5560 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL concat_function, r0 + if (MAY_USE_32BIT_ADDR(concat_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(concat_function)); + } else { + if (IS_SIGNED_32BIT(concat_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)concat_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)concat_function)), (unsigned int)((((ptrdiff_t)concat_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 5561 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 12 + //|.endif + /* concatenation with empty string may increase refcount */ + op1_info |= MAY_BE_RCN; + op2_info |= MAY_BE_RCN; + //| FREE_OP op1_type, op1, op1_info, 0, NULL + if (op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5568 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP op2_type, op2, op2_info, 0, NULL + if (op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 5569 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RX) { + zend_jit_check_exception_undef_result(Dst, opline); + } else { + zend_jit_check_exception(Dst); + } + } +#if 1 + if ((op1_info & MAY_BE_STRING) && (op2_info & MAY_BE_STRING)) { + //| jmp <5 + //|.code + dasm_put(Dst, 3448); +#line 5580 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } +#endif + + return 1; +} + +static int zend_jit_concat(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op2_info, zend_jit_addr res_addr, int may_throw) +{ + zend_jit_addr op1_addr, op2_addr; + + ZEND_ASSERT(!(op1_info & MAY_BE_UNDEF) && !(op2_info & MAY_BE_UNDEF)); + ZEND_ASSERT((op1_info & MAY_BE_STRING) && (op2_info & MAY_BE_STRING)); + + op1_addr = OP1_ADDR(); + op2_addr = OP2_ADDR(); + + return zend_jit_concat_helper(Dst, opline, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr, may_throw); +} + +static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_op *opline, uint32_t type, uint32_t op1_info, uint32_t op2_info, uint8_t dim_type, const void *found_exit_addr, const void *not_found_exit_addr, const void *exit_addr) +/* Labels: 1,2,3,4,5 */ +{ + zend_jit_addr op2_addr = OP2_ADDR(); + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && type == BP_VAR_R + && !exit_addr) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + } + + if (op2_info & MAY_BE_LONG) { + bool op2_loaded = 0; + bool packed_loaded = 0; + bool bad_packed_key = 0; + + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_LONG)) { + //| // if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >3 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 5624 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_PACKED_GUARD) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_PACKED_GUARD); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + if (op1_info & MAY_BE_ARRAY_PACKED) { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jz &exit_addr + dasm_put(Dst, 1790, offsetof(zend_array, u.flags), HASH_FLAG_PACKED, (ptrdiff_t)(exit_addr)); +#line 5635 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jnz &exit_addr + dasm_put(Dst, 1799, offsetof(zend_array, u.flags), HASH_FLAG_PACKED, (ptrdiff_t)(exit_addr)); +#line 5638 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (type == BP_VAR_W) { + //| // hval = Z_LVAL_P(dim); + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5643 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op2_loaded = 1; + } + if (op1_info & MAY_BE_ARRAY_PACKED) { + zend_long val = -1; + + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + val = Z_LVAL_P(Z_ZV(op2_addr)); + if (val >= 0 && val < HT_MAX_SIZE) { + packed_loaded = 1; + } else { + bad_packed_key = 1; + } + } else { + if (!op2_loaded) { + //| // hval = Z_LVAL_P(dim); + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5659 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op2_loaded = 1; + } + packed_loaded = 1; + } + + if (dim_type == IS_UNDEF && type == BP_VAR_W && packed_loaded) { + /* don't generate "fast" code for packed array */ + packed_loaded = 0; + } + + if (packed_loaded) { + //| // ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef); + if (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jz >4 // HASH_FIND + dasm_put(Dst, 3641, offsetof(zend_array, u.flags), HASH_FLAG_PACKED); +#line 5674 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) + //|.if X64 + //| mov eax, dword [FCARG1a + offsetof(zend_array, nNumUsed)] + dasm_put(Dst, 3651, offsetof(zend_array, nNumUsed)); +#line 5678 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (val == 0) { + //| test r0, r0 + dasm_put(Dst, 3655); +#line 5680 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val > 0 && !op2_loaded) { + //| cmp r0, val + dasm_put(Dst, 3659, val); +#line 5682 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| cmp r0, FCARG2a + dasm_put(Dst, 3665); +#line 5684 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + if (val >= 0 && !op2_loaded) { + //| cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], val + } else { + //| cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], FCARG2a + } + //|.endif + if (type == BP_JIT_IS) { + if (not_found_exit_addr) { + //| jbe ¬_found_exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(not_found_exit_addr)); +#line 5695 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jbe >9 // NOT_FOUND + dasm_put(Dst, 3674); +#line 5697 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) { + //| jbe &exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(exit_addr)); +#line 5700 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && not_found_exit_addr) { + //| jbe ¬_found_exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(not_found_exit_addr)); +#line 5702 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_RW && not_found_exit_addr) { + //| jbe ¬_found_exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(not_found_exit_addr)); +#line 5704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && found_exit_addr) { + //| jbe >7 // NOT_FOUND + dasm_put(Dst, 3679); +#line 5706 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jbe >2 // NOT_FOUND + dasm_put(Dst, 3684); +#line 5708 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // _ret = &_ht->arPacked[h]; + if (val >= 0) { + //| mov r0, aword [FCARG1a + offsetof(zend_array, arPacked)] + dasm_put(Dst, 3689, offsetof(zend_array, arPacked)); +#line 5712 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (val != 0) { + //| add r0, val * sizeof(zval) + dasm_put(Dst, 3694, val * sizeof(zval)); +#line 5714 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //|.if X64 + //| mov r0, FCARG2a + //| shl r0, 4 + //|.else + //| imul r0, FCARG2a, sizeof(zval) + //|.endif + //| add r0, aword [FCARG1a + offsetof(zend_array, arPacked)] + dasm_put(Dst, 3699, offsetof(zend_array, arPacked)); +#line 5723 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + switch (type) { + case BP_JIT_IS: + if (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) { + if (packed_loaded) { + //| jmp >5 + dasm_put(Dst, 3406); +#line 5731 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|4: + dasm_put(Dst, 375); +#line 5733 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!op2_loaded) { + //| // hval = Z_LVAL_P(dim); + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5736 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (packed_loaded) { + //| EXT_CALL _zend_hash_index_find, r0 + if (MAY_USE_32BIT_ADDR(_zend_hash_index_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(_zend_hash_index_find)); + } else { + if (IS_SIGNED_32BIT(_zend_hash_index_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)_zend_hash_index_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_zend_hash_index_find)), (unsigned int)((((ptrdiff_t)_zend_hash_index_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5739 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_hash_index_find, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_index_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_index_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_index_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_index_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_index_find)), (unsigned int)((((ptrdiff_t)zend_hash_index_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5741 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test r0, r0 + dasm_put(Dst, 3655); +#line 5743 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (not_found_exit_addr) { + //| jz ¬_found_exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(not_found_exit_addr)); +#line 5745 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >9 // NOT_FOUND + dasm_put(Dst, 3712); +#line 5747 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op2_info & MAY_BE_STRING) { + //| jmp >5 + dasm_put(Dst, 3406); +#line 5750 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (packed_loaded) { + if (op2_info & MAY_BE_STRING) { + //| jmp >5 + dasm_put(Dst, 3406); +#line 5754 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (not_found_exit_addr) { + //| jmp ¬_found_exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(not_found_exit_addr)); +#line 5757 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 // NOT_FOUND + dasm_put(Dst, 3717); +#line 5759 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case BP_VAR_R: + case BP_VAR_IS: + case BP_VAR_UNSET: + if (packed_loaded) { + if (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) { + //| IF_NOT_Z_TYPE r0, IS_UNDEF, >8 + dasm_put(Dst, 3722, offsetof(zval, u1.v.type), IS_UNDEF); +#line 5767 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) { + /* perform IS_UNDEF check only after result type guard (during deoptimization) */ + if (!found_exit_addr || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH)) { + //| IF_Z_TYPE r0, IS_UNDEF, &exit_addr + dasm_put(Dst, 3731, offsetof(zval, u1.v.type), IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 5771 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (type == BP_VAR_IS && not_found_exit_addr) { + //| IF_Z_TYPE r0, IS_UNDEF, ¬_found_exit_addr + dasm_put(Dst, 3731, offsetof(zval, u1.v.type), IS_UNDEF, (ptrdiff_t)(not_found_exit_addr)); +#line 5774 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && found_exit_addr) { + //| IF_Z_TYPE r0, IS_UNDEF, >7 // NOT_FOUND + dasm_put(Dst, 3739, offsetof(zval, u1.v.type), IS_UNDEF); +#line 5776 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_Z_TYPE r0, IS_UNDEF, >2 // NOT_FOUND + dasm_put(Dst, 3748, offsetof(zval, u1.v.type), IS_UNDEF); +#line 5778 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (packed_loaded && (op1_info & MAY_BE_ARRAY_NUMERIC_HASH))) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 5783 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && not_found_exit_addr) { + //| jmp ¬_found_exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(not_found_exit_addr)); +#line 5785 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && found_exit_addr) { + //| jmp >7 // NOT_FOUND + dasm_put(Dst, 3757); +#line 5787 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >2 // NOT_FOUND + dasm_put(Dst, 3762); +#line 5789 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!packed_loaded || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH)) { + //|4: + dasm_put(Dst, 375); +#line 5793 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!op2_loaded) { + //| // hval = Z_LVAL_P(dim); + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5796 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (packed_loaded) { + //| EXT_CALL _zend_hash_index_find, r0 + if (MAY_USE_32BIT_ADDR(_zend_hash_index_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(_zend_hash_index_find)); + } else { + if (IS_SIGNED_32BIT(_zend_hash_index_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)_zend_hash_index_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_zend_hash_index_find)), (unsigned int)((((ptrdiff_t)_zend_hash_index_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5799 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_hash_index_find, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_index_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_index_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_index_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_index_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_index_find)), (unsigned int)((((ptrdiff_t)zend_hash_index_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5801 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test r0, r0 + dasm_put(Dst, 3655); +#line 5803 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) { + //| jz &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 5805 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && not_found_exit_addr) { + //| jz ¬_found_exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(not_found_exit_addr)); +#line 5807 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && found_exit_addr) { + //| jz >7 // NOT_FOUND + dasm_put(Dst, 3743); +#line 5809 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >2 // NOT_FOUND + dasm_put(Dst, 2050); +#line 5811 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|.cold_code + dasm_put(Dst, 276); +#line 5814 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 5815 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + switch (type) { + case BP_VAR_R: + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { + //| // zend_error(E_WARNING,"Undefined array key " ZEND_LONG_FMT, hval); + //| // retval = &EG(uninitialized_zval); + //| UNDEFINED_OFFSET opline + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + dasm_put(Dst, 3767); + } else { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + dasm_put(Dst, 3771); + } +#line 5821 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + dasm_put(Dst, 3717); +#line 5822 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case BP_VAR_IS: + case BP_VAR_UNSET: + if (!not_found_exit_addr && !found_exit_addr) { + //| // retval = &EG(uninitialized_zval); + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 5829 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + dasm_put(Dst, 3775, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 5830 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + //|.code + dasm_put(Dst, 373); +#line 5836 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case BP_VAR_RW: + if (packed_loaded && !not_found_exit_addr) { + //| IF_NOT_Z_TYPE r0, IS_UNDEF, >8 + dasm_put(Dst, 3722, offsetof(zval, u1.v.type), IS_UNDEF); +#line 5840 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!packed_loaded || + !not_found_exit_addr || + (op1_info & MAY_BE_ARRAY_NUMERIC_HASH)) { + if (packed_loaded && not_found_exit_addr) { + //|.cold_code + dasm_put(Dst, 276); +#line 5846 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + //|4: + dasm_put(Dst, 3788); +#line 5849 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!op2_loaded) { + //| // hval = Z_LVAL_P(dim); + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5852 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (packed_loaded) { + //| EXT_CALL zend_jit_hash_index_lookup_rw_no_packed, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_hash_index_lookup_rw_no_packed)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_hash_index_lookup_rw_no_packed)); + } else { + if (IS_SIGNED_32BIT(zend_jit_hash_index_lookup_rw_no_packed)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_hash_index_lookup_rw_no_packed)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_hash_index_lookup_rw_no_packed)), (unsigned int)((((ptrdiff_t)zend_jit_hash_index_lookup_rw_no_packed))>>32)); + } + dasm_put(Dst, 66); + } +#line 5855 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_hash_index_lookup_rw, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_hash_index_lookup_rw)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_hash_index_lookup_rw)); + } else { + if (IS_SIGNED_32BIT(zend_jit_hash_index_lookup_rw)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_hash_index_lookup_rw)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_hash_index_lookup_rw)), (unsigned int)((((ptrdiff_t)zend_jit_hash_index_lookup_rw))>>32)); + } + dasm_put(Dst, 66); + } +#line 5857 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test r0, r0 + dasm_put(Dst, 3655); +#line 5859 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (not_found_exit_addr) { + if (packed_loaded) { + //| jnz >8 + //| jmp ¬_found_exit_addr + //|.code + dasm_put(Dst, 3793, (ptrdiff_t)(not_found_exit_addr)); +#line 5864 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz ¬_found_exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(not_found_exit_addr)); +#line 5866 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jz >9 + dasm_put(Dst, 3712); +#line 5869 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + break; + case BP_VAR_W: + if (packed_loaded) { + //| IF_NOT_Z_TYPE r0, IS_UNDEF, >8 + dasm_put(Dst, 3722, offsetof(zval, u1.v.type), IS_UNDEF); +#line 5875 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) || packed_loaded || bad_packed_key || dim_type == IS_UNDEF) { + //|2: + //|4: + dasm_put(Dst, 3788); +#line 5879 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!op2_loaded) { + //| // hval = Z_LVAL_P(dim); + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5882 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_hash_index_lookup, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_index_lookup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_index_lookup)); + } else { + if (IS_SIGNED_32BIT(zend_hash_index_lookup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_index_lookup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_index_lookup)), (unsigned int)((((ptrdiff_t)zend_hash_index_lookup))>>32)); + } + dasm_put(Dst, 66); + } +#line 5884 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + + if (type != BP_JIT_IS && (op2_info & MAY_BE_STRING)) { + //| jmp >8 + dasm_put(Dst, 3802); +#line 5892 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op2_info & MAY_BE_STRING) { + //|3: + dasm_put(Dst, 333); +#line 5897 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_STRING))) { + //| // if (EXPECTED(Z_TYPE_P(dim) == IS_STRING)) + //| IF_NOT_ZVAL_TYPE op2_addr, IS_STRING, >3 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_STRING); +#line 5900 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // offset_key = Z_STR_P(dim); + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 5903 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // retval = zend_hash_find(ht, offset_key); + switch (type) { + case BP_JIT_IS: + if (opline->op2_type != IS_CONST) { + //| cmp byte [FCARG2a + offsetof(zend_string, val)], '9' + //| jle >1 + //|.cold_code + dasm_put(Dst, 3807, offsetof(zend_string, val), '9'); +#line 5910 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| EXT_CALL zend_jit_symtable_find, r0 + dasm_put(Dst, 70); + if (MAY_USE_32BIT_ADDR(zend_jit_symtable_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_symtable_find)); + } else { + if (IS_SIGNED_32BIT(zend_jit_symtable_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_symtable_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_symtable_find)), (unsigned int)((((ptrdiff_t)zend_jit_symtable_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5912 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >1 + //|.code + dasm_put(Dst, 3817); +#line 5914 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_find, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find)), (unsigned int)((((ptrdiff_t)zend_hash_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5915 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 5916 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_hash_find_known_hash, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_find_known_hash)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find_known_hash)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find_known_hash)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find_known_hash)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find_known_hash)), (unsigned int)((((ptrdiff_t)zend_hash_find_known_hash))>>32)); + } + dasm_put(Dst, 66); + } +#line 5918 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test r0, r0 + dasm_put(Dst, 3655); +#line 5920 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (not_found_exit_addr) { + //| jz ¬_found_exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(not_found_exit_addr)); +#line 5922 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >9 // NOT_FOUND + dasm_put(Dst, 3712); +#line 5924 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case BP_VAR_R: + case BP_VAR_IS: + case BP_VAR_UNSET: + if (opline->op2_type != IS_CONST) { + //| cmp byte [FCARG2a + offsetof(zend_string, val)], '9' + //| jle >1 + //|.cold_code + dasm_put(Dst, 3807, offsetof(zend_string, val), '9'); +#line 5933 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| EXT_CALL zend_jit_symtable_find, r0 + dasm_put(Dst, 70); + if (MAY_USE_32BIT_ADDR(zend_jit_symtable_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_symtable_find)); + } else { + if (IS_SIGNED_32BIT(zend_jit_symtable_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_symtable_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_symtable_find)), (unsigned int)((((ptrdiff_t)zend_jit_symtable_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5935 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >1 + //|.code + dasm_put(Dst, 3817); +#line 5937 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_find, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find)), (unsigned int)((((ptrdiff_t)zend_hash_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 5938 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 5939 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_hash_find_known_hash, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_find_known_hash)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find_known_hash)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find_known_hash)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find_known_hash)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find_known_hash)), (unsigned int)((((ptrdiff_t)zend_hash_find_known_hash))>>32)); + } + dasm_put(Dst, 66); + } +#line 5941 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test r0, r0 + dasm_put(Dst, 3655); +#line 5943 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) { + //| jz &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 5945 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && not_found_exit_addr) { + //| jz ¬_found_exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(not_found_exit_addr)); +#line 5947 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (type == BP_VAR_IS && found_exit_addr) { + //| jz >7 // NOT_FOUND + dasm_put(Dst, 3743); +#line 5949 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >2 // NOT_FOUND + //|.cold_code + dasm_put(Dst, 3823); +#line 5952 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 5953 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + switch (type) { + case BP_VAR_R: + // zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key)); + //| UNDEFINED_INDEX opline + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + dasm_put(Dst, 3829); + } else { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + dasm_put(Dst, 3833); + } +#line 5957 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + dasm_put(Dst, 3717); +#line 5958 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case BP_VAR_IS: + case BP_VAR_UNSET: + //| // retval = &EG(uninitialized_zval); + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 5963 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + dasm_put(Dst, 3775, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 5964 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + //|.code + dasm_put(Dst, 373); +#line 5969 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case BP_VAR_RW: + if (opline->op2_type != IS_CONST) { + //| EXT_CALL zend_jit_symtable_lookup_rw, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_symtable_lookup_rw)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_symtable_lookup_rw)); + } else { + if (IS_SIGNED_32BIT(zend_jit_symtable_lookup_rw)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_symtable_lookup_rw)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_symtable_lookup_rw)), (unsigned int)((((ptrdiff_t)zend_jit_symtable_lookup_rw))>>32)); + } + dasm_put(Dst, 66); + } +#line 5974 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_hash_lookup_rw, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_hash_lookup_rw)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_hash_lookup_rw)); + } else { + if (IS_SIGNED_32BIT(zend_jit_hash_lookup_rw)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_hash_lookup_rw)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_hash_lookup_rw)), (unsigned int)((((ptrdiff_t)zend_jit_hash_lookup_rw))>>32)); + } + dasm_put(Dst, 66); + } +#line 5976 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test r0, r0 + dasm_put(Dst, 3655); +#line 5978 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (not_found_exit_addr) { + //| jz ¬_found_exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(not_found_exit_addr)); +#line 5980 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >9 + dasm_put(Dst, 3712); +#line 5982 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case BP_VAR_W: + if (opline->op2_type != IS_CONST) { + //| EXT_CALL zend_jit_symtable_lookup_w, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_symtable_lookup_w)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_symtable_lookup_w)); + } else { + if (IS_SIGNED_32BIT(zend_jit_symtable_lookup_w)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_symtable_lookup_w)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_symtable_lookup_w)), (unsigned int)((((ptrdiff_t)zend_jit_symtable_lookup_w))>>32)); + } + dasm_put(Dst, 66); + } +#line 5987 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_hash_lookup, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_lookup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_lookup)); + } else { + if (IS_SIGNED_32BIT(zend_hash_lookup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_lookup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_lookup)), (unsigned int)((((ptrdiff_t)zend_hash_lookup))>>32)); + } + dasm_put(Dst, 66); + } +#line 5989 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + } + + if (type == BP_JIT_IS && (op2_info & (MAY_BE_LONG|MAY_BE_STRING))) { + //|5: + dasm_put(Dst, 509); +#line 5998 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_ARRAY_OF_REF) { + //| ZVAL_DEREF r0, MAY_BE_REF + if (MAY_BE_REF & MAY_BE_REF) { + dasm_put(Dst, 3837, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 6000 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| cmp byte [r0 + 8], IS_NULL + dasm_put(Dst, 3855, 8, IS_NULL); +#line 6002 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (not_found_exit_addr) { + //| jle ¬_found_exit_addr + dasm_put(Dst, 3860, (ptrdiff_t)(not_found_exit_addr)); +#line 6004 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (found_exit_addr) { + //| jg &found_exit_addr + dasm_put(Dst, 3864, (ptrdiff_t)(found_exit_addr)); +#line 6006 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jle >9 // NOT FOUND + dasm_put(Dst, 3868); +#line 6008 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_STRING))) { + if (op2_info & (MAY_BE_LONG|MAY_BE_STRING)) { + //|.cold_code + dasm_put(Dst, 276); +#line 6014 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|3: + dasm_put(Dst, 333); +#line 6015 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (type != BP_VAR_RW) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6018 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6020 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + switch (type) { + case BP_VAR_R: + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6024 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + //| EXT_CALL zend_jit_fetch_dim_r_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_r_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_r_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_r_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_r_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_r_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_r_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6029 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 12 + //|.endif + //| jmp >9 + dasm_put(Dst, 3717); +#line 6033 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case BP_JIT_IS: + //| EXT_CALL zend_jit_fetch_dim_isset_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_isset_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_isset_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_isset_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_isset_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_isset_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_isset_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6036 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + dasm_put(Dst, 3655); +#line 6037 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (not_found_exit_addr) { + //| je ¬_found_exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(not_found_exit_addr)); +#line 6039 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & (MAY_BE_LONG|MAY_BE_STRING)) { + //| jmp >8 + dasm_put(Dst, 3802); +#line 6041 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (found_exit_addr) { + //| jne &found_exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(found_exit_addr)); +#line 6044 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & (MAY_BE_LONG|MAY_BE_STRING)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 6046 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jne >8 + //| jmp >9 + dasm_put(Dst, 3873); +#line 6050 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case BP_VAR_IS: + case BP_VAR_UNSET: + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6056 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + //| EXT_CALL zend_jit_fetch_dim_is_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_is_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_is_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_is_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_is_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_is_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_is_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6061 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 12 + //|.endif + //| jmp >9 + dasm_put(Dst, 3717); +#line 6065 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case BP_VAR_RW: + //| EXT_CALL zend_jit_fetch_dim_rw_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_rw_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_rw_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_rw_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_rw_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_rw_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_rw_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6068 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| jne >8 + //| jmp >9 + dasm_put(Dst, 3882); +#line 6071 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case BP_VAR_W: + //| EXT_CALL zend_jit_fetch_dim_w_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_w_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_w_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_w_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_w_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_w_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_w_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6074 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| jne >8 + //| jmp >9 + dasm_put(Dst, 3882); +#line 6077 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + if (op2_info & (MAY_BE_LONG|MAY_BE_STRING)) { + //|.code + dasm_put(Dst, 373); +#line 6083 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + return 1; +} + +static int zend_jit_simple_assign(dasm_State **Dst, + const zend_op *opline, + zend_jit_addr var_addr, + uint32_t var_info, + uint32_t var_def_info, + uint8_t val_type, + zend_jit_addr val_addr, + uint32_t val_info, + zend_jit_addr res_addr, + int in_cold, + int save_r1, + bool check_exception) +/* Labels: 1,2,3 */ +{ + zend_reg tmp_reg; + + if (Z_MODE(var_addr) == IS_REG || Z_REG(var_addr) != ZREG_R0) { + tmp_reg = ZREG_R0; + } else { + /* ASSIGN_DIM */ + tmp_reg = ZREG_FCARG1; + } + + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + zval *zv = Z_ZV(val_addr); + + if (!res_addr) { + //| ZVAL_COPY_CONST var_addr, var_info, var_def_info, zv, tmp_reg + if (Z_TYPE_P(zv) > IS_TRUE) { + if (Z_TYPE_P(zv) == IS_DOUBLE) { + zend_reg dst_reg = (Z_MODE(var_addr) == IS_REG) ? Z_REG(var_addr) : ZREG_XMM0; + if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else if (!IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(((uintptr_t)zv)), (unsigned int)((((uintptr_t)zv))>>32)); + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (dst_reg-ZREG_XMM0), (tmp_reg), 0); + } else { + dasm_put(Dst, 2028, (dst_reg-ZREG_XMM0), (tmp_reg), 0); + } + } else { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } else { + dasm_put(Dst, 1988, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (dst_reg != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_TYPE_P(zv) == IS_LONG && var_def_info == MAY_BE_DOUBLE) { + zend_reg dst_reg = (Z_MODE(var_addr) == IS_REG) ? Z_REG(var_addr) : ZREG_XMM0; + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (dst_reg != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_LVAL_P(zv) == 0 && Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(var_addr)), (Z_REG(var_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(var_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + } else { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(var_addr)), Z_OFFSET(var_addr), Z_LVAL_P(zv)); + } + } + } + } + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (var_def_info == MAY_BE_DOUBLE) { + if ((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); + } + } else if (((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1< IS_TRUE) { + if (Z_TYPE_P(zv) == IS_DOUBLE) { + zend_reg dst_reg = (Z_MODE(var_addr) == IS_REG) ? + Z_REG(var_addr) : ((Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0); + if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else if (!IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(((uintptr_t)zv)), (unsigned int)((((uintptr_t)zv))>>32)); + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (dst_reg-ZREG_XMM0), (tmp_reg), 0); + } else { + dasm_put(Dst, 2028, (dst_reg-ZREG_XMM0), (tmp_reg), 0); + } + } else { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } else { + dasm_put(Dst, 1988, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_TYPE_P(zv) == IS_LONG && var_def_info == MAY_BE_DOUBLE) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else { + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (Z_LVAL_P(zv) == 0 && (Z_MODE(var_addr) == IS_REG || Z_MODE(res_addr) == IS_REG)) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(var_addr)), (Z_REG(var_addr))); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } else { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(res_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(var_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } else if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(res_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(var_addr)), Z_OFFSET(var_addr), Z_LVAL_P(zv)); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(res_addr)), Z_OFFSET(res_addr), Z_LVAL_P(zv)); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(res_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(var_addr)), Z_OFFSET(var_addr), Z_LVAL_P(zv)); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(res_addr)), Z_OFFSET(res_addr), Z_LVAL_P(zv)); + } + } + } + } + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (var_def_info == MAY_BE_DOUBLE) { + if ((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); + } + } else if (((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1<>32), (tmp_reg), 0); + } else { + dasm_put(Dst, 3918, Z_LVAL_P(zv)); + } +#line 6123 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ADDREF_CONST_2 zv, Ra(tmp_reg) + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 3924, (tmp_reg), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32), (tmp_reg), 0); + } else { + dasm_put(Dst, 3939, Z_LVAL_P(zv)); + } +#line 6125 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if (val_info & MAY_BE_UNDEF) { + if (in_cold) { + //| IF_NOT_ZVAL_TYPE val_addr, IS_UNDEF, >2 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2252, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 6131 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_ZVAL_TYPE val_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 6133 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 6134 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6135 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + if (save_r1) { + //| mov aword T1, FCARG1a // save + dasm_put(Dst, 3959); +#line 6139 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_TYPE_INFO var_addr, IS_NULL + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 6141 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (res_addr) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 6143 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline) { + //| SET_EX_OPLINE opline, Ra(tmp_reg) + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 3964, (tmp_reg), (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), (tmp_reg), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6146 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL && Z_REG(val_addr) == ZREG_FP); + //| mov FCARG1d, Z_OFFSET(val_addr) + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, Z_OFFSET(val_addr)); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6150 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (check_exception) { + //| test r0, r0 + //| jz ->exception_handler_undef + dasm_put(Dst, 3978); +#line 6153 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (save_r1) { + //| mov FCARG1a, aword T1 // restore + dasm_put(Dst, 3986); +#line 6156 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >3 + dasm_put(Dst, 3991); +#line 6158 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (in_cold) { + //|2: + dasm_put(Dst, 2065); +#line 6160 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //|.code + dasm_put(Dst, 373); +#line 6162 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (val_info & MAY_BE_REF) { + if (val_type == IS_CV) { + ZEND_ASSERT(Z_REG(var_addr) != ZREG_R2); + if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_R2 || Z_OFFSET(val_addr) != 0) { + //| LOAD_ZVAL_ADDR r2, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 3424, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6169 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DEREF r2, val_info + if (val_info & MAY_BE_REF) { + dasm_put(Dst, 3996, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 6171 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 0); + } else { + zend_jit_addr ref_addr; + zend_reg type_reg = tmp_reg; + + if (in_cold) { + //| IF_NOT_ZVAL_TYPE val_addr, IS_REFERENCE, >1 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); +#line 6178 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_ZVAL_TYPE val_addr, IS_REFERENCE, >1 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 6180 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); +#line 6181 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6182 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr); + //| GET_ZVAL_PTR r2, val_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 6185 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF r2 + //| // ZVAL_COPY_VALUE(return_value, &ref->value); + dasm_put(Dst, 4014, (Z_REG(val_addr)), Z_OFFSET(val_addr)); +#line 6187 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 8); + if (!res_addr) { + //| ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, type_reg, tmp_reg + if (val_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((val_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(var_addr) != Z_REG(ref_addr)) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(ref_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(var_addr)), (Z_REG(var_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (Z_REG(var_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(var_addr)), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (tmp_reg), (tmp_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (tmp_reg != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (tmp_reg)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if ((val_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(ref_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(ref_addr) != IS_REG || Z_REG(var_addr) != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(ref_addr) != IS_REG || ZREG_XMM0 != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } + } else if (!(val_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if ((val_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(val_info & MAY_BE_GUARD) && + has_concrete_type(val_info & MAY_BE_ANY)) { + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if ((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (val_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(val_info); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (type_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (type_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + } +#line 6190 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, type_reg, tmp_reg + if (val_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((val_info & MAY_BE_ANY) == MAY_BE_LONG) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(var_addr) != Z_REG(ref_addr)) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(ref_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(ref_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(ref_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(var_addr)), (Z_REG(var_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (Z_REG(var_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(var_addr)), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(res_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (tmp_reg), (tmp_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (tmp_reg != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (tmp_reg)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((val_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(ref_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(ref_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(ref_addr) != IS_REG || Z_REG(var_addr) != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(ref_addr) != IS_REG || Z_REG(res_addr) != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else { + if (Z_MODE(ref_addr) != IS_REG || ZREG_XMM0 != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(val_info & MAY_BE_DOUBLE)) { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((val_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + has_concrete_type(val_info & MAY_BE_ANY)) { + uint8_t type = concrete_type(val_info); + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if ((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (val_info & (MAY_BE_ANY|MAY_BE_UNDEF))) { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), type); + } + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (type_reg), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (type_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (type_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 6192 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| je >2 + dasm_put(Dst, 2050); +#line 6194 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (tmp_reg == ZREG_R0) { + //| IF_NOT_REFCOUNTED ah, >3 + dasm_put(Dst, 4025); +#line 6196 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_FLAGS Rd(tmp_reg), (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT), >3 + dasm_put(Dst, 4032, (tmp_reg), (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)); +#line 6198 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_PTR Ra(tmp_reg), var_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); +#line 6200 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (!res_addr) { + //| GC_ADDREF Ra(tmp_reg) + dasm_put(Dst, 3909, (tmp_reg), 0); +#line 6203 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| add dword [Ra(tmp_reg)], 2 + dasm_put(Dst, 3930, (tmp_reg), 0); +#line 6205 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >3 + //|2: + dasm_put(Dst, 4044); +#line 6208 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (res_addr) { + if (tmp_reg == ZREG_R0) { + //| IF_NOT_REFCOUNTED ah, >2 + dasm_put(Dst, 4051); +#line 6211 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_FLAGS Rd(tmp_reg), (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT), >2 + dasm_put(Dst, 4058, (tmp_reg), (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)); +#line 6213 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_PTR Ra(tmp_reg), var_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 6215 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_ADDREF Ra(tmp_reg) + //|2: + dasm_put(Dst, 4070, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr), (tmp_reg), 0); +#line 6217 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (save_r1) { + //| mov aword T1, FCARG1a // save + dasm_put(Dst, 3959); +#line 6220 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EFREE_REFERENCE r2 + dasm_put(Dst, 4090); + #if ZEND_DEBUG + dasm_put(Dst, 4094); + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + #else + #ifdef HAVE_BUILTIN_CONSTANT_P + if (MAY_USE_32BIT_ADDR(_efree_32)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree_32)); + } else { + if (IS_SIGNED_32BIT(_efree_32)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree_32)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree_32)), (unsigned int)((((ptrdiff_t)_efree_32))>>32)); + } + dasm_put(Dst, 66); + } + #else + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + #endif + #endif +#line 6222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (save_r1) { + //| mov FCARG1a, aword T1 // restore + dasm_put(Dst, 3986); +#line 6224 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >3 + dasm_put(Dst, 3991); +#line 6226 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (in_cold) { + //|1: + dasm_put(Dst, 70); +#line 6228 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //|.code + dasm_put(Dst, 373); +#line 6230 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if (!res_addr) { + //| ZVAL_COPY_VALUE var_addr, var_info, val_addr, val_info, ZREG_R2, tmp_reg + if (val_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((val_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(var_addr) != Z_REG(val_addr)) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(var_addr)), (Z_REG(var_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(var_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(var_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (tmp_reg), (tmp_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (tmp_reg != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (tmp_reg)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if ((val_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(var_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } + } else if (!(val_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if ((val_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(val_info & MAY_BE_GUARD) && + has_concrete_type(val_info & MAY_BE_ANY)) { + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if ((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (val_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(val_info); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + } +#line 6236 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, val_addr, val_info, ZREG_R2, tmp_reg + if (val_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((val_info & MAY_BE_ANY) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(var_addr) != Z_REG(val_addr)) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(var_addr)), (Z_REG(var_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(var_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(var_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(res_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (tmp_reg), (tmp_reg)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (tmp_reg), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (tmp_reg != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (tmp_reg)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (tmp_reg), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((val_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(var_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(val_info & MAY_BE_DOUBLE)) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((val_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + has_concrete_type(val_info & MAY_BE_ANY)) { + uint8_t type = concrete_type(val_info); + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if ((var_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (val_info & (MAY_BE_ANY|MAY_BE_UNDEF))) { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), type); + } + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 6238 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (val_type == IS_CV) { + if (!res_addr) { + //| TRY_ADDREF val_info, dh, Ra(tmp_reg) + if (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (val_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 4107); + } + dasm_put(Dst, 4115, (tmp_reg), 0); + } +#line 6243 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| TRY_ADDREF_2 val_info, dh, Ra(tmp_reg) + if (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (val_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 4107); + } + dasm_put(Dst, 4126, (tmp_reg), 0); + } +#line 6245 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (res_addr) { + //| TRY_ADDREF val_info, dh, Ra(tmp_reg) + if (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (val_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 4107); + } + dasm_put(Dst, 4115, (tmp_reg), 0); + } +#line 6249 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|3: + dasm_put(Dst, 333); +#line 6252 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_assign_to_typed_ref(dasm_State **Dst, + const zend_op *opline, + uint8_t val_type, + zend_jit_addr val_addr, + zend_jit_addr res_addr, + bool check_exception) +{ + //| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { + //| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0 + //| jnz >2 + //|.cold_code + dasm_put(Dst, 4137, offsetof(zend_reference, sources.ptr)); +#line 6267 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 6268 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2 || Z_OFFSET(val_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG2a, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 2376, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6270 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6273 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!res_addr) { + if (val_type == IS_CONST) { + //| EXT_CALL zend_jit_assign_const_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_const_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_const_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_const_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_const_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_const_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_const_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 6277 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_TMP_VAR) { + //| EXT_CALL zend_jit_assign_tmp_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_tmp_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_tmp_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_tmp_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_tmp_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_tmp_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_tmp_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 6279 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_VAR) { + //| EXT_CALL zend_jit_assign_var_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_var_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_var_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_var_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_var_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_var_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_var_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 6281 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_CV) { + //| EXT_CALL zend_jit_assign_cv_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_cv_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_cv_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_cv_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_cv_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_cv_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_cv_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 6283 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6289 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + if (val_type == IS_CONST) { + //| EXT_CALL zend_jit_assign_const_to_typed_ref2, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_const_to_typed_ref2)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_const_to_typed_ref2)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_const_to_typed_ref2)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_const_to_typed_ref2)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_const_to_typed_ref2)), (unsigned int)((((ptrdiff_t)zend_jit_assign_const_to_typed_ref2))>>32)); + } + dasm_put(Dst, 66); + } +#line 6295 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_TMP_VAR) { + //| EXT_CALL zend_jit_assign_tmp_to_typed_ref2, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_tmp_to_typed_ref2)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_tmp_to_typed_ref2)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_tmp_to_typed_ref2)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_tmp_to_typed_ref2)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_tmp_to_typed_ref2)), (unsigned int)((((ptrdiff_t)zend_jit_assign_tmp_to_typed_ref2))>>32)); + } + dasm_put(Dst, 66); + } +#line 6297 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_VAR) { + //| EXT_CALL zend_jit_assign_var_to_typed_ref2, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_var_to_typed_ref2)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_var_to_typed_ref2)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_var_to_typed_ref2)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_var_to_typed_ref2)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_var_to_typed_ref2)), (unsigned int)((((ptrdiff_t)zend_jit_assign_var_to_typed_ref2))>>32)); + } + dasm_put(Dst, 66); + } +#line 6299 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_CV) { + //| EXT_CALL zend_jit_assign_cv_to_typed_ref2, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_cv_to_typed_ref2)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_cv_to_typed_ref2)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_cv_to_typed_ref2)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_cv_to_typed_ref2)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_cv_to_typed_ref2)), (unsigned int)((((ptrdiff_t)zend_jit_assign_cv_to_typed_ref2))>>32)); + } + dasm_put(Dst, 66); + } +#line 6301 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + //|.if not(X64) + //| add r4, 12 + //|.endif + } + if (check_exception) { + //| // if (UNEXPECTED(EG(exception) != NULL)) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 6311 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je >8 // END OF zend_jit_assign_to_variable() + //| jmp ->exception_handler + dasm_put(Dst, 4148, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 6313 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >8 + dasm_put(Dst, 3802); +#line 6315 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 6317 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_assign_to_variable_call(dasm_State **Dst, + const zend_op *opline, + zend_jit_addr __var_use_addr, + zend_jit_addr var_addr, + uint32_t __var_info, + uint32_t __var_def_info, + uint8_t val_type, + zend_jit_addr val_addr, + uint32_t val_info, + zend_jit_addr __res_addr, + bool __check_exception) +{ + if (val_info & MAY_BE_UNDEF) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //| IF_ZVAL_TYPE val_addr, IS_UNDEF, &exit_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4162, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 6343 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_ZVAL_TYPE val_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 6345 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 6346 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6347 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + ZEND_ASSERT(Z_REG(val_addr) == ZREG_FP); + if (Z_REG(var_addr) != ZREG_FP) { + //| mov aword T1, Ra(Z_REG(var_addr)) // save + dasm_put(Dst, 3552, (Z_REG(var_addr))); +#line 6350 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6352 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, Z_OFFSET(val_addr) + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, Z_OFFSET(val_addr)); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6354 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(var_addr) != ZREG_FP) { + //| mov Ra(Z_REG(var_addr)), aword T1 // restore + dasm_put(Dst, 3574, (Z_REG(var_addr))); +#line 6356 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1 || Z_OFFSET(var_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, var_addr + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(var_addr)) { + dasm_put(Dst, 2341, (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6359 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 4174, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 4180, tsrm_tls_index, tsrm_tls_offset); + } +#line 6361 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| call ->assign_const + //| jmp >9 + //|.code + dasm_put(Dst, 4197, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); +#line 6364 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1 || Z_OFFSET(var_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, var_addr + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(var_addr)) { + dasm_put(Dst, 2341, (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6368 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2 || Z_OFFSET(val_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG2a, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 2376, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6371 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6374 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!(val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + //| call ->assign_tmp + dasm_put(Dst, 4210); +#line 6377 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_CONST) { + //| call ->assign_const + dasm_put(Dst, 4214); +#line 6379 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_TMP_VAR) { + //| call ->assign_tmp + dasm_put(Dst, 4210); +#line 6381 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (val_type == IS_VAR) { + if (!(val_info & MAY_BE_REF)) { + //| call ->assign_tmp + dasm_put(Dst, 4210); +#line 6384 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| call ->assign_var + dasm_put(Dst, 4218); +#line 6386 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (val_type == IS_CV) { + if (!(val_info & MAY_BE_REF)) { + //| call ->assign_cv_noref + dasm_put(Dst, 4222); +#line 6390 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| call ->assign_cv + dasm_put(Dst, 4226); +#line 6392 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((val_info & MAY_BE_UNDEF) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { + //|9: + dasm_put(Dst, 4230); +#line 6395 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + ZEND_UNREACHABLE(); + } + + return 1; +} + +static int zend_jit_assign_to_variable(dasm_State **Dst, + const zend_op *opline, + zend_jit_addr var_use_addr, + zend_jit_addr var_addr, + uint32_t var_info, + uint32_t var_def_info, + uint8_t val_type, + zend_jit_addr val_addr, + uint32_t val_info, + zend_jit_addr res_addr, + bool check_exception) +/* Labels: 1,2,3,4,5,8 */ +{ + int done = 0; + zend_reg ref_reg, tmp_reg; + + if (Z_MODE(var_addr) == IS_REG || Z_REG(var_use_addr) != ZREG_R0) { + ref_reg = ZREG_FCARG1; + tmp_reg = ZREG_R0; + } else { + /* ASSIGN_DIM */ + ref_reg = ZREG_R0; + tmp_reg = ZREG_FCARG1; + } + + if (var_info & MAY_BE_REF) { + if (Z_MODE(var_use_addr) != IS_MEM_ZVAL || Z_REG(var_use_addr) != ref_reg || Z_OFFSET(var_use_addr) != 0) { + //| LOAD_ZVAL_ADDR Ra(ref_reg), var_use_addr + if (Z_MODE(var_use_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_use_addr))) { + dasm_put(Dst, 1775, (ref_reg), ((ptrdiff_t)Z_ZV(var_use_addr))); + } else { + dasm_put(Dst, 1768, (ref_reg), (unsigned int)(((ptrdiff_t)Z_ZV(var_use_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_use_addr)))>>32)); + } + } else if (Z_MODE(var_use_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(var_use_addr)) { + dasm_put(Dst, 2496, (ref_reg), (Z_REG(var_use_addr)), Z_OFFSET(var_use_addr)); + } else { + dasm_put(Dst, 1782, (Z_REG(var_use_addr)), (ref_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6431 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + var_addr = var_use_addr = ZEND_ADDR_MEM_ZVAL(ref_reg, 0); + } + //| // if (Z_ISREF_P(variable_ptr)) { + //| IF_NOT_Z_TYPE, Ra(ref_reg), IS_REFERENCE, >3 + //| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { + //| GET_Z_PTR FCARG1a, Ra(ref_reg) + dasm_put(Dst, 4233, (ref_reg), offsetof(zval, u1.v.type), IS_REFERENCE, (ref_reg), 0); +#line 6437 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_assign_to_typed_ref(Dst, opline, val_type, val_addr, res_addr, check_exception)) { + return 0; + } + //| lea Ra(ref_reg), [FCARG1a + offsetof(zend_reference, val)] + //|3: + dasm_put(Dst, 4253, (ref_reg), offsetof(zend_reference, val)); +#line 6442 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (RC_MAY_BE_1(var_info)) { + int in_cold = 0; + + if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| IF_ZVAL_REFCOUNTED var_use_addr, >1 + ZEND_ASSERT(Z_MODE(var_use_addr) == IS_MEM_ZVAL); +#line 6449 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 263, (Z_REG(var_use_addr)), Z_OFFSET(var_use_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); +#line 6450 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6451 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + in_cold = 1; + } + if (Z_REG(var_use_addr) == ZREG_FCARG1 || Z_REG(var_use_addr) == ZREG_R0) { + bool keep_gc = 0; + + //| GET_ZVAL_PTR Ra(tmp_reg), var_use_addr + ZEND_ASSERT(Z_MODE(var_use_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(var_use_addr)), Z_OFFSET(var_use_addr)); +#line 6457 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (tmp_reg == ZREG_FCARG1) { + if (Z_MODE(val_addr) == IS_REG) { + keep_gc = 1; + } else if ((val_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_GUARD)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) == 0) { + keep_gc = 1; + } else if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (sizeof(void*) == 4) { + keep_gc = 1; + } else { + zval *zv = Z_ZV(val_addr); + + if (Z_TYPE_P(zv) == IS_DOUBLE) { + if (Z_DVAL_P(zv) == 0 || IS_SIGNED_32BIT(zv)) { + keep_gc = 1; + } + } else if (IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + keep_gc = 1; + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if ((val_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + keep_gc = 1; + } + } + } + if (!keep_gc) { + //| mov aword T1, Ra(tmp_reg) // save + dasm_put(Dst, 3552, (tmp_reg)); +#line 6484 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val_addr, val_info, res_addr, in_cold, 0, 0)) { + return 0; + } + if (!keep_gc) { + //| mov FCARG1a, aword T1 // restore + dasm_put(Dst, 3986); +#line 6490 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| GET_ZVAL_PTR FCARG1a, var_use_addr + ZEND_ASSERT(Z_MODE(var_use_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(var_use_addr)), Z_OFFSET(var_use_addr)); +#line 6493 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val_addr, val_info, res_addr, in_cold, 1, 0)) { + return 0; + } + } + //| GC_DELREF FCARG1a + dasm_put(Dst, 299); +#line 6498 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0) { + //| jnz >4 + dasm_put(Dst, 308); +#line 6500 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jnz >8 + dasm_put(Dst, 3726); +#line 6502 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DTOR_FUNC var_info, opline + do { + if (!((var_info) & MAY_BE_GUARD) + && has_concrete_type((var_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((var_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((var_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((var_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); +#line 6504 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (in_cold || (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0)) { + if (check_exception && !(val_info & MAY_BE_UNDEF)) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 6507 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je >8 + //| jmp ->exception_handler + dasm_put(Dst, 4148, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 6509 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >8 + dasm_put(Dst, 3802); +#line 6511 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0) { + //|4: + //| IF_GC_MAY_NOT_LEAK FCARG1a, >8 + //| EXT_CALL gc_possible_root, r0 + dasm_put(Dst, 4263, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } +#line 6517 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (in_cold) { + //| jmp >8 + dasm_put(Dst, 3802); +#line 6519 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (check_exception && (val_info & MAY_BE_UNDEF)) { + //|8: + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 4275); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 6524 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je >8 + //| jmp ->exception_handler + dasm_put(Dst, 4148, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 6526 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (in_cold) { + //|.code + dasm_put(Dst, 373); +#line 6529 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + done = 1; + } + } else /* if (RC_MAY_BE_N(var_info)) */ { + if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| IF_NOT_ZVAL_REFCOUNTED var_use_addr, >5 + ZEND_ASSERT(Z_MODE(var_use_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4279, (Z_REG(var_use_addr)), Z_OFFSET(var_use_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); +#line 6535 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) { + if (Z_REG(var_use_addr) != ZREG_FP) { + //| mov T1, Ra(Z_REG(var_use_addr)) // save + dasm_put(Dst, 3552, (Z_REG(var_use_addr))); +#line 6539 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_PTR FCARG1a, var_use_addr + ZEND_ASSERT(Z_MODE(var_use_addr) == IS_MEM_ZVAL); +#line 6541 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF FCARG1a + //| IF_GC_MAY_NOT_LEAK FCARG1a, >5 + //| EXT_CALL gc_possible_root, r0 + dasm_put(Dst, 4293, (Z_REG(var_use_addr)), Z_OFFSET(var_use_addr), (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } +#line 6544 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(var_use_addr) != ZREG_FP) { + //| mov Ra(Z_REG(var_use_addr)), T1 // restore + dasm_put(Dst, 3574, (Z_REG(var_use_addr))); +#line 6546 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| GET_ZVAL_PTR Ra(tmp_reg), var_use_addr + ZEND_ASSERT(Z_MODE(var_use_addr) == IS_MEM_ZVAL); +#line 6549 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF Ra(tmp_reg) + dasm_put(Dst, 4313, (tmp_reg), (Z_REG(var_use_addr)), Z_OFFSET(var_use_addr), (tmp_reg), 0); +#line 6550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|5: + dasm_put(Dst, 509); +#line 6552 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!done && !zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val_addr, val_info, res_addr, 0, 0, check_exception)) { + return 0; + } + + //|8: + dasm_put(Dst, 4331); +#line 6560 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t val_info, uint8_t dim_type, int may_throw) +{ + zend_jit_addr op2_addr, op3_addr, res_addr; + + op2_addr = (opline->op2_type != IS_UNUSED) ? OP2_ADDR() : 0; + op3_addr = OP1_DATA_ADDR(); + if (opline->result_type == IS_UNUSED) { + res_addr = 0; + } else { + res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + } + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && (val_info & MAY_BE_UNDEF)) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //| IF_ZVAL_TYPE op3_addr, IS_UNDEF, &exit_addr + ZEND_ASSERT(Z_MODE(op3_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4162, (Z_REG(op3_addr)), Z_OFFSET(op3_addr)+offsetof(zval, u1.v.type), IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 6585 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + val_info &= ~MAY_BE_UNDEF; + } + + if (op1_info & MAY_BE_REF) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6591 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE FCARG1a, IS_REFERENCE, >1 + //| GET_Z_PTR FCARG2a, FCARG1a + //| IF_NOT_TYPE byte [FCARG2a + offsetof(zend_reference, val) + offsetof(zval, u1.v.type)], IS_ARRAY, >2 + //| lea FCARG1a, [FCARG2a + offsetof(zend_reference, val)] + //| jmp >3 + //|.cold_code + dasm_put(Dst, 4334, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val) + offsetof(zval, u1.v.type), IS_ARRAY, offsetof(zend_reference, val)); +#line 6597 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 2065); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6599 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_prepare_assign_dim_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_prepare_assign_dim_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_prepare_assign_dim_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_prepare_assign_dim_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_prepare_assign_dim_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_prepare_assign_dim_ref)), (unsigned int)((((ptrdiff_t)zend_jit_prepare_assign_dim_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 6600 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| mov FCARG1a, r0 + //| jne >1 + //| jmp ->exception_handler_undef + //|.code + dasm_put(Dst, 4363); +#line 6605 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6606 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + + if (op1_info & MAY_BE_ARRAY) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_ARRAY, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4379, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_ARRAY); +#line 6612 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + //| SEPARATE_ARRAY op1_addr, op1_info, 1 + dasm_put(Dst, 333); + if (RC_MAY_BE_N(op1_info)) { + if (Z_REG(op1_addr) != ZREG_FP) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R0), (ZREG_R0)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R0 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R0)); + } + } else { + ZEND_UNREACHABLE(); + } + if (RC_MAY_BE_1(op1_info)) { + dasm_put(Dst, 4392); + } + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (MAY_USE_32BIT_ADDR(zend_jit_zval_array_dup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_zval_array_dup)); + } else { + if (IS_SIGNED_32BIT(zend_jit_zval_array_dup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_zval_array_dup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_zval_array_dup)), (unsigned int)((((ptrdiff_t)zend_jit_zval_array_dup))>>32)); + } + dasm_put(Dst, 66); + } + dasm_put(Dst, 4400); + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (RC_MAY_BE_1(op1_info)) { + dasm_put(Dst, 4406); + if (1) { + dasm_put(Dst, 4410); + dasm_put(Dst, 70); + } else { + dasm_put(Dst, 3684); + } + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4416, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + if (MAY_USE_32BIT_ADDR(zend_array_dup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_dup)); + } else { + if (IS_SIGNED_32BIT(zend_array_dup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_dup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_dup)), (unsigned int)((((ptrdiff_t)zend_array_dup))>>32)); + } + dasm_put(Dst, 66); + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4435, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); + if (RC_MAY_BE_1(op1_info)) { + if (1) { + dasm_put(Dst, 2938); + } + } + dasm_put(Dst, 2065); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 6615 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + //| CMP_ZVAL_TYPE op1_addr, IS_NULL + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 6618 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jg >7 + dasm_put(Dst, 4447, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_NULL); +#line 6619 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ZVAL_ARR(container, zend_new_array(8)); + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov T1, Ra(Z_REG(op1_addr)) // save + dasm_put(Dst, 3552, (Z_REG(op1_addr))); +#line 6623 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL _zend_new_array_0, r0 + if (MAY_USE_32BIT_ADDR(_zend_new_array_0)) { + dasm_put(Dst, 53, (ptrdiff_t)(_zend_new_array_0)); + } else { + if (IS_SIGNED_32BIT(_zend_new_array_0)) { + dasm_put(Dst, 56, ((ptrdiff_t)_zend_new_array_0)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_zend_new_array_0)), (unsigned int)((((ptrdiff_t)_zend_new_array_0))>>32)); + } + dasm_put(Dst, 66); + } +#line 6625 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov Ra(Z_REG(op1_addr)), T1 // restore + dasm_put(Dst, 3574, (Z_REG(op1_addr))); +#line 6627 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_LVAL op1_addr, r0 + if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(op1_addr))); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } +#line 6629 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_ARRAY_EX + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 6630 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, r0 + dasm_put(Dst, 4435, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); +#line 6631 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + //|6: + dasm_put(Dst, 3411); +#line 6635 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op2_type == IS_UNUSED) { + uint32_t var_info = MAY_BE_NULL; + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + + //| // var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval)); + //| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 4174, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 4180, tsrm_tls_index, tsrm_tls_offset); + } +#line 6641 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_next_index_insert, r0 + dasm_put(Dst, 4460, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); + if (MAY_USE_32BIT_ADDR(zend_hash_next_index_insert)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_next_index_insert)); + } else { + if (IS_SIGNED_32BIT(zend_hash_next_index_insert)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_next_index_insert)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_next_index_insert)), (unsigned int)((((ptrdiff_t)zend_hash_next_index_insert))>>32)); + } + dasm_put(Dst, 66); + } +#line 6642 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // if (UNEXPECTED(!var_ptr)) { + //| test r0, r0 + //| jz >1 + //|.cold_code + dasm_put(Dst, 4465); +#line 6646 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_throw_error(NULL, "Cannot add element to the array as the next element is already occupied"); + //| CANNOT_ADD_ELEMENT opline + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + dasm_put(Dst, 4474); + } else { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + dasm_put(Dst, 4478); + } +#line 6649 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| //ZEND_VM_C_GOTO(assign_dim_op_ret_null); + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 6652 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, -1, (opline+1)->op1_type, op3_addr, val_info, res_addr, 0, 0, 0)) { + return 0; + } + } else { + uint32_t var_info = zend_array_element_type(op1_info, opline->op1_type, 0, 0); + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + + if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_W, op1_info, op2_info, dim_type, NULL, NULL, NULL)) { + return 0; + } + + if (op1_info & (MAY_BE_ARRAY_OF_REF|MAY_BE_OBJECT)) { + var_info |= MAY_BE_REF; + } + if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + var_info |= MAY_BE_RC1; + } + + //|8: + //| // value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE); + dasm_put(Dst, 4331); +#line 6673 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type == IS_VAR) { + ZEND_ASSERT(opline->result_type == IS_UNUSED); + if (!zend_jit_assign_to_variable_call(Dst, opline, var_addr, var_addr, var_info, -1, (opline+1)->op1_type, op3_addr, val_info, res_addr, 0)) { + return 0; + } + } else { + if (!zend_jit_assign_to_variable(Dst, opline, var_addr, var_addr, var_info, -1, (opline+1)->op1_type, op3_addr, val_info, res_addr, 0)) { + return 0; + } + } + } + } + + if (((op1_info & MAY_BE_ARRAY) && + (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL))) || + (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY)))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + //|.cold_code + dasm_put(Dst, 276); +#line 6691 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 6692 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if ((op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) && + (op1_info & MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + //| CMP_ZVAL_TYPE op1_addr, IS_NULL + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 6698 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jg >2 + dasm_put(Dst, 4485, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_NULL); +#line 6699 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ZVAL_ARR(container, zend_new_array(8)); + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov T1, Ra(Z_REG(op1_addr)) // save + dasm_put(Dst, 3552, (Z_REG(op1_addr))); +#line 6703 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL _zend_new_array_0, r0 + if (MAY_USE_32BIT_ADDR(_zend_new_array_0)) { + dasm_put(Dst, 53, (ptrdiff_t)(_zend_new_array_0)); + } else { + if (IS_SIGNED_32BIT(_zend_new_array_0)) { + dasm_put(Dst, 56, ((ptrdiff_t)_zend_new_array_0)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_zend_new_array_0)), (unsigned int)((((ptrdiff_t)_zend_new_array_0))>>32)); + } + dasm_put(Dst, 66); + } +#line 6705 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov Ra(Z_REG(op1_addr)), T1 // restore + dasm_put(Dst, 3574, (Z_REG(op1_addr))); +#line 6707 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_LVAL op1_addr, r0 + if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(op1_addr))); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } +#line 6709 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_ARRAY_EX + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 6710 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, r0 + //| // ZEND_VM_C_GOTO(assign_dim_op_new_array); + //| jmp <6 + //|2: + dasm_put(Dst, 4498, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); +#line 6714 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6718 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6720 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type == IS_UNUSED) { + //| xor FCARG2a, FCARG2a + dasm_put(Dst, 2390); +#line 6723 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->op2_type == IS_CONST && Z_EXTRA_P(RT_CONSTANT(opline, opline->op2)) == ZEND_EXTRA_VALUE) { + ZEND_ASSERT(Z_MODE(op2_addr) == IS_CONST_ZVAL); + //| LOAD_ADDR FCARG2a, (Z_ZV(op2_addr) + 1) + if (IS_SIGNED_32BIT((Z_ZV(op2_addr) + 1))) { + dasm_put(Dst, 751, ((ptrdiff_t)(Z_ZV(op2_addr) + 1))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)(Z_ZV(op2_addr) + 1))), (unsigned int)((((ptrdiff_t)(Z_ZV(op2_addr) + 1)))>>32)); + } +#line 6726 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6728 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| sub r4, 8 + //|.endif + if (opline->result_type == IS_UNUSED) { + //|.if X64 + //| xor CARG4, CARG4 + //|.else + //| push 0 + //|.endif + dasm_put(Dst, 4516); +#line 6738 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //|.if X64 + //| LOAD_ZVAL_ADDR CARG4, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 4520, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 4525, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 4530, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 4538, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6741 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + } + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, op3_addr + if (Z_MODE(op3_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op3_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(op3_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(op3_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op3_addr)))>>32)); + } + } else if (Z_MODE(op3_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op3_addr)) { + dasm_put(Dst, 3424, (Z_REG(op3_addr)), Z_OFFSET(op3_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(op3_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6747 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| PUSH_ZVAL_ADDR op3_addr, r0 + //|.endif + //| EXT_CALL zend_jit_assign_dim_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_dim_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_dim_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_dim_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_dim_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_dim_helper)), (unsigned int)((((ptrdiff_t)zend_jit_assign_dim_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6751 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 8 + //|.endif + +#ifdef ZEND_JIT_USE_RC_INFERENCE + if (((opline+1)->op1_type & (IS_TMP_VAR|IS_VAR)) && (val_info & MAY_BE_RC1)) { + /* ASSIGN_DIM may increase refcount of the value */ + val_info |= MAY_BE_RCN; + } +#endif + + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, NULL + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_1(val_info)) { + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_N(val_info)) { + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((val_info) & MAY_BE_GUARD) + && has_concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((val_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((val_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((val_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 6763 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + //| jmp >9 // END + dasm_put(Dst, 3717); +#line 6768 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 6770 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + +#ifdef ZEND_JIT_USE_RC_INFERENCE + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) && (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY|MAY_BE_OBJECT))) { + /* ASSIGN_DIM may increase refcount of the key */ + op2_info |= MAY_BE_RCN; + } +#endif + + //|9: + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + dasm_put(Dst, 4230); + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 6782 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (may_throw) { + zend_jit_check_exception(Dst); + } + + return 1; +} + +static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t op1_data_info, zend_ssa_range *op1_data_range, uint8_t dim_type, int may_throw) +{ + zend_jit_addr op2_addr, op3_addr, var_addr; + const void *not_found_exit_addr = NULL; + uint32_t var_info = MAY_BE_NULL; + + ZEND_ASSERT(opline->result_type == IS_UNUSED); + + op2_addr = (opline->op2_type != IS_UNUSED) ? OP2_ADDR() : 0; + op3_addr = OP1_DATA_ADDR(); + + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 6802 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_REF) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6804 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE FCARG1a, IS_REFERENCE, >1 + //| GET_Z_PTR FCARG2a, FCARG1a + //| IF_NOT_TYPE byte [FCARG2a + offsetof(zend_reference, val) + offsetof(zval, u1.v.type)], IS_ARRAY, >2 + //| lea FCARG1a, [FCARG2a + offsetof(zend_reference, val)] + //| jmp >3 + //|.cold_code + dasm_put(Dst, 4334, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val) + offsetof(zval, u1.v.type), IS_ARRAY, offsetof(zend_reference, val)); +#line 6810 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + //| EXT_CALL zend_jit_prepare_assign_dim_ref, r0 + dasm_put(Dst, 2065); + if (MAY_USE_32BIT_ADDR(zend_jit_prepare_assign_dim_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_prepare_assign_dim_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_prepare_assign_dim_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_prepare_assign_dim_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_prepare_assign_dim_ref)), (unsigned int)((((ptrdiff_t)zend_jit_prepare_assign_dim_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 6812 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| mov FCARG1a, r0 + //| jne >1 + //| jmp ->exception_handler_undef + //|.code + dasm_put(Dst, 4363); +#line 6817 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6818 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + + if (op1_info & MAY_BE_ARRAY) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_ARRAY, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4379, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_ARRAY); +#line 6824 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + //| SEPARATE_ARRAY op1_addr, op1_info, 1 + dasm_put(Dst, 333); + if (RC_MAY_BE_N(op1_info)) { + if (Z_REG(op1_addr) != ZREG_FP) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R0), (ZREG_R0)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R0 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R0)); + } + } else { + ZEND_UNREACHABLE(); + } + if (RC_MAY_BE_1(op1_info)) { + dasm_put(Dst, 4392); + } + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (MAY_USE_32BIT_ADDR(zend_jit_zval_array_dup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_zval_array_dup)); + } else { + if (IS_SIGNED_32BIT(zend_jit_zval_array_dup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_zval_array_dup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_zval_array_dup)), (unsigned int)((((ptrdiff_t)zend_jit_zval_array_dup))>>32)); + } + dasm_put(Dst, 66); + } + dasm_put(Dst, 4400); + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (RC_MAY_BE_1(op1_info)) { + dasm_put(Dst, 4406); + if (1) { + dasm_put(Dst, 4410); + dasm_put(Dst, 70); + } else { + dasm_put(Dst, 3684); + } + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4416, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + if (MAY_USE_32BIT_ADDR(zend_array_dup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_dup)); + } else { + if (IS_SIGNED_32BIT(zend_array_dup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_dup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_dup)), (unsigned int)((((ptrdiff_t)zend_array_dup))>>32)); + } + dasm_put(Dst, 66); + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4435, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); + if (RC_MAY_BE_1(op1_info)) { + if (1) { + dasm_put(Dst, 2938); + } + } + dasm_put(Dst, 2065); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 6827 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { + if (op1_info & MAY_BE_ARRAY) { + //|.cold_code + dasm_put(Dst, 276); +#line 6831 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 6832 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + //| CMP_ZVAL_TYPE op1_addr, IS_NULL + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 6835 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jg >7 + dasm_put(Dst, 4447, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_NULL); +#line 6836 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov T1, Ra(Z_REG(op1_addr)) // save + dasm_put(Dst, 3552, (Z_REG(op1_addr))); +#line 6839 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_UNDEF) { + if (op1_info & MAY_BE_NULL) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 6843 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG1a, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 798, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 6846 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6847 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ZVAL_ARR(container, zend_new_array(8)); + //| EXT_CALL _zend_new_array_0, r0 + if (MAY_USE_32BIT_ADDR(_zend_new_array_0)) { + dasm_put(Dst, 53, (ptrdiff_t)(_zend_new_array_0)); + } else { + if (IS_SIGNED_32BIT(_zend_new_array_0)) { + dasm_put(Dst, 56, ((ptrdiff_t)_zend_new_array_0)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_zend_new_array_0)), (unsigned int)((((ptrdiff_t)_zend_new_array_0))>>32)); + } + dasm_put(Dst, 66); + } +#line 6850 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov Ra(Z_REG(op1_addr)), T1 // restore + dasm_put(Dst, 3574, (Z_REG(op1_addr))); +#line 6852 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_LVAL op1_addr, r0 + if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(op1_addr))); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } +#line 6854 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_ARRAY_EX + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 6855 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, r0 + dasm_put(Dst, 4435, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); +#line 6856 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_ARRAY) { + //| jmp >1 + //|.code + dasm_put(Dst, 3817); +#line 6859 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6860 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + uint32_t var_def_info = zend_array_element_type(op1_def_info, opline->op1_type, 1, 0); + + //|6: + dasm_put(Dst, 3411); +#line 6867 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op2_type == IS_UNUSED) { + var_info = MAY_BE_NULL; + + //| // var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval)); + //| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 4174, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 4180, tsrm_tls_index, tsrm_tls_offset); + } +#line 6872 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_next_index_insert, r0 + dasm_put(Dst, 4460, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); + if (MAY_USE_32BIT_ADDR(zend_hash_next_index_insert)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_next_index_insert)); + } else { + if (IS_SIGNED_32BIT(zend_hash_next_index_insert)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_next_index_insert)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_next_index_insert)), (unsigned int)((((ptrdiff_t)zend_hash_next_index_insert))>>32)); + } + dasm_put(Dst, 66); + } +#line 6873 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // if (UNEXPECTED(!var_ptr)) { + //| test r0, r0 + //| jz >1 + //|.cold_code + dasm_put(Dst, 4465); +#line 6877 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_throw_error(NULL, "Cannot add element to the array as the next element is already occupied"); + //| CANNOT_ADD_ELEMENT opline + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + dasm_put(Dst, 4474); + } else { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + dasm_put(Dst, 4478); + } +#line 6880 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| //ZEND_VM_C_GOTO(assign_dim_op_ret_null); + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 6883 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + var_info = zend_array_element_type(op1_info, opline->op1_type, 0, 0); + if (op1_info & (MAY_BE_ARRAY_OF_REF|MAY_BE_OBJECT)) { + var_info |= MAY_BE_REF; + } + if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + var_info |= MAY_BE_RC1; + } + + if (dim_type != IS_UNKNOWN + && dim_type != IS_UNDEF + && (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY + && (op2_info & (MAY_BE_LONG|MAY_BE_STRING)) + && !(op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_STRING)))) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + not_found_exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!not_found_exit_addr) { + return 0; + } + } + + if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_RW, op1_info, op2_info, dim_type, NULL, not_found_exit_addr, NULL)) { + return 0; + } + + //|8: + dasm_put(Dst, 4331); +#line 6909 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (not_found_exit_addr && dim_type != IS_REFERENCE) { + //| IF_NOT_Z_TYPE, r0, dim_type, ¬_found_exit_addr + dasm_put(Dst, 4544, offsetof(zval, u1.v.type), dim_type, (ptrdiff_t)(not_found_exit_addr)); +#line 6911 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + var_info = (1 << dim_type) | (var_info & ~(MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)); + } + if (var_info & MAY_BE_REF) { + binary_op_type binary_op = get_binary_op(opline->extended_value); + //| IF_NOT_Z_TYPE, r0, IS_REFERENCE, >1 + //| GET_Z_PTR FCARG1a, r0 + //| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0 + //| jnz >2 + //| lea r0, aword [FCARG1a + offsetof(zend_reference, val)] + //|.cold_code + dasm_put(Dst, 4552, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, sources.ptr), offsetof(zend_reference, val)); +#line 6921 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + //| LOAD_ZVAL_ADDR FCARG2a, op3_addr + dasm_put(Dst, 2065); + if (Z_MODE(op3_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op3_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op3_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op3_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op3_addr)))>>32)); + } + } else if (Z_MODE(op3_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op3_addr)) { + dasm_put(Dst, 2376, (Z_REG(op3_addr)), Z_OFFSET(op3_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op3_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6923 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ADDR CARG3, binary_op + if (IS_SIGNED_32BIT(binary_op)) { + dasm_put(Dst, 3414, ((ptrdiff_t)binary_op)); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)binary_op)), (unsigned int)((((ptrdiff_t)binary_op))>>32)); + } +#line 6925 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ADDR binary_op, r0 + //|.endif + if (((opline+1)->op1_type & (IS_TMP_VAR|IS_VAR)) + && (op1_data_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| EXT_CALL zend_jit_assign_op_to_typed_ref_tmp, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref_tmp)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp))>>32)); + } + dasm_put(Dst, 66); + } +#line 6932 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_assign_op_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 6934 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 6940 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 6941 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + switch (opline->extended_value) { + case ZEND_ADD: + case ZEND_SUB: + case ZEND_MUL: + case ZEND_DIV: + if (!zend_jit_math_helper(Dst, opline, opline->extended_value, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info, 0, var_addr, var_def_info, var_info, + 1 /* may overflow */, may_throw)) { + return 0; + } + break; + case ZEND_BW_OR: + case ZEND_BW_AND: + case ZEND_BW_XOR: + case ZEND_SL: + case ZEND_SR: + case ZEND_MOD: + if (!zend_jit_long_math_helper(Dst, opline, opline->extended_value, + IS_CV, opline->op1, var_addr, var_info, NULL, + (opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info, + op1_data_range, + 0, var_addr, var_def_info, var_info, may_throw)) { + return 0; + } + break; + case ZEND_CONCAT: + if (!zend_jit_concat_helper(Dst, opline, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, op3_addr, op1_data_info, var_addr, + may_throw)) { + return 0; + } + break; + default: + ZEND_UNREACHABLE(); + } + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 6979 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + binary_op_type binary_op; + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + //|.cold_code + dasm_put(Dst, 276); +#line 6986 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 6987 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6991 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type == IS_UNUSED) { + //| xor FCARG2a, FCARG2a + dasm_put(Dst, 2390); +#line 6994 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->op2_type == IS_CONST && Z_EXTRA_P(RT_CONSTANT(opline, opline->op2)) == ZEND_EXTRA_VALUE) { + ZEND_ASSERT(Z_MODE(op2_addr) == IS_CONST_ZVAL); + //| LOAD_ADDR FCARG2a, (Z_ZV(op2_addr) + 1) + if (IS_SIGNED_32BIT((Z_ZV(op2_addr) + 1))) { + dasm_put(Dst, 751, ((ptrdiff_t)(Z_ZV(op2_addr) + 1))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)(Z_ZV(op2_addr) + 1))), (unsigned int)((((ptrdiff_t)(Z_ZV(op2_addr) + 1)))>>32)); + } +#line 6997 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 6999 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + binary_op = get_binary_op(opline->extended_value); + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, op3_addr + if (Z_MODE(op3_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op3_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(op3_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(op3_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op3_addr)))>>32)); + } + } else if (Z_MODE(op3_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op3_addr)) { + dasm_put(Dst, 3424, (Z_REG(op3_addr)), Z_OFFSET(op3_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(op3_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7003 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ADDR CARG4, binary_op + if (IS_SIGNED_32BIT(binary_op)) { + dasm_put(Dst, 4520, ((ptrdiff_t)binary_op)); + } else { + dasm_put(Dst, 4525, (unsigned int)(((ptrdiff_t)binary_op)), (unsigned int)((((ptrdiff_t)binary_op))>>32)); + } +#line 7004 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 8 + //| PUSH_ADDR binary_op, r0 + //| PUSH_ZVAL_ADDR op3_addr, r0 + //|.endif + //| EXT_CALL zend_jit_assign_dim_op_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_dim_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_dim_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_dim_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_dim_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_dim_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_assign_dim_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 7010 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 8 + //|.endif + + //|9: + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, op1_data_info, 0, NULL + dasm_put(Dst, 4230); + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_data_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_data_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((op1_data_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_data_info)) { + if (((op1_data_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_data_info)) { + if (0 && (((op1_data_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_data_info) && ((op1_data_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_data_info) & MAY_BE_GUARD) + && has_concrete_type((op1_data_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_data_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_data_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op1_data_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_data_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_data_info) && ((op1_data_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_data_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_data_info) && ((op1_data_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_data_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_data_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 7016 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, NULL + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 7017 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception(Dst); + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + //| jmp >9 // END + //|.code + dasm_put(Dst, 4204); +#line 7024 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + dasm_put(Dst, 4230); +#line 7025 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if ((op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) + && (!not_found_exit_addr || (var_info & MAY_BE_REF))) { + //|.cold_code + dasm_put(Dst, 276); +#line 7029 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, op1_data_info, 0, opline + dasm_put(Dst, 4230); + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_data_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_data_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((op1_data_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_data_info)) { + if (((op1_data_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_data_info)) { + if (0 && (((op1_data_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_data_info) && ((op1_data_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_data_info) & MAY_BE_GUARD) + && has_concrete_type((op1_data_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_data_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_data_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_data_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_data_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_data_info) && ((op1_data_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_data_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_data_info) && ((op1_data_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_data_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_data_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 7031 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 7032 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception(Dst); + } + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 7037 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + dasm_put(Dst, 4230); +#line 7038 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_assign_op(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op1_def_info, zend_ssa_range *op1_range, uint32_t op2_info, zend_ssa_range *op2_range, int may_overflow, int may_throw) +{ + zend_jit_addr op1_addr, op2_addr; + + ZEND_ASSERT(opline->op1_type == IS_CV && opline->result_type == IS_UNUSED); + ZEND_ASSERT(!(op1_info & MAY_BE_UNDEF) && !(op2_info & MAY_BE_UNDEF)); + + op1_addr = OP1_ADDR(); + op2_addr = OP2_ADDR(); + + if (op1_info & MAY_BE_REF) { + binary_op_type binary_op = get_binary_op(opline->extended_value); + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7056 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE, FCARG1a, IS_REFERENCE, >1 + //| GET_Z_PTR FCARG1a, FCARG1a + //| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0 + //| jnz >2 + //| add FCARG1a, offsetof(zend_reference, val) + //|.cold_code + dasm_put(Dst, 4578, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, sources.ptr), offsetof(zend_reference, val)); +#line 7062 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + dasm_put(Dst, 2065); + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7064 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ADDR CARG3, binary_op + if (IS_SIGNED_32BIT(binary_op)) { + dasm_put(Dst, 3414, ((ptrdiff_t)binary_op)); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)binary_op)), (unsigned int)((((ptrdiff_t)binary_op))>>32)); + } +#line 7066 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ADDR binary_op, r0 + //|.endif + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 7071 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) + && (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| EXT_CALL zend_jit_assign_op_to_typed_ref_tmp, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref_tmp)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp))>>32)); + } + dasm_put(Dst, 66); + } +#line 7074 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_assign_op_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 7076 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + zend_jit_check_exception(Dst); + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 7083 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 7084 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + + int result; + switch (opline->extended_value) { + case ZEND_ADD: + case ZEND_SUB: + case ZEND_MUL: + case ZEND_DIV: + result = zend_jit_math_helper(Dst, opline, opline->extended_value, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, opline->op1.var, op1_addr, op1_def_info, op1_info, may_overflow, may_throw); + break; + case ZEND_BW_OR: + case ZEND_BW_AND: + case ZEND_BW_XOR: + case ZEND_SL: + case ZEND_SR: + case ZEND_MOD: + result = zend_jit_long_math_helper(Dst, opline, opline->extended_value, + opline->op1_type, opline->op1, op1_addr, op1_info, op1_range, + opline->op2_type, opline->op2, op2_addr, op2_info, op2_range, + opline->op1.var, op1_addr, op1_def_info, op1_info, may_throw); + break; + case ZEND_CONCAT: + result = zend_jit_concat_helper(Dst, opline, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, op1_addr, may_throw); + break; + default: + ZEND_UNREACHABLE(); + } + //|9: + dasm_put(Dst, 4230); +#line 7113 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return result; +} + +static int zend_jit_cmp_long_long(dasm_State **Dst, + const zend_op *opline, + zend_ssa_range *op1_range, + zend_jit_addr op1_addr, + zend_ssa_range *op2_range, + zend_jit_addr op2_addr, + zend_jit_addr res_addr, + uint8_t smart_branch_opcode, + uint32_t target_label, + uint32_t target_label2, + const void *exit_addr, + bool skip_comparison) +{ + bool swap = 0; + bool result; + + if (zend_jit_is_constant_cmp_long_long(opline, op1_range, op1_addr, op2_range, op2_addr, &result)) { + if (!smart_branch_opcode || + smart_branch_opcode == ZEND_JMPZ_EX || + smart_branch_opcode == ZEND_JMPNZ_EX) { + //| SET_ZVAL_TYPE_INFO res_addr, (result ? IS_TRUE : IS_FALSE) + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), (result ? IS_TRUE : IS_FALSE)); +#line 7137 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (smart_branch_opcode && !exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ || + smart_branch_opcode == ZEND_JMPZ_EX) { + if (!result) { + //| jmp => target_label + dasm_put(Dst, 1614, target_label); +#line 7143 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode == ZEND_JMPNZ || + smart_branch_opcode == ZEND_JMPNZ_EX) { + if (result) { + //| jmp => target_label + dasm_put(Dst, 1614, target_label); +#line 7148 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + ZEND_UNREACHABLE(); + } + } + return 1; + } + + if (skip_comparison) { + if (Z_MODE(op1_addr) != IS_REG && + (Z_MODE(op2_addr) == IS_REG || + (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_MODE(op2_addr) != IS_CONST_ZVAL))) { + swap = 1; + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + //| test Ra(Z_REG(op1_addr)), Ra(Z_REG(op1_addr)) + dasm_put(Dst, 3590, (Z_REG(op1_addr)), (Z_REG(op1_addr))); +#line 7165 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LONG_OP cmp, Z_REG(op1_addr), op2_addr, r0 + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 4604, (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (Z_REG(op1_addr))); + } else { + dasm_put(Dst, 4614, (Z_REG(op1_addr)), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 4622, (Z_REG(op1_addr)), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 4632, (Z_REG(op2_addr)), (Z_REG(op1_addr))); + } else { + ZEND_UNREACHABLE(); + } +#line 7167 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + //| test Ra(Z_REG(op2_addr)), Ra(Z_REG(op2_addr)) + dasm_put(Dst, 3590, (Z_REG(op2_addr)), (Z_REG(op2_addr))); +#line 7171 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LONG_OP cmp, Z_REG(op2_addr), op1_addr, r0 + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 4604, (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32), (Z_REG(op2_addr))); + } else { + dasm_put(Dst, 4614, (Z_REG(op2_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 4622, (Z_REG(op2_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 4632, (Z_REG(op1_addr)), (Z_REG(op2_addr))); + } else { + ZEND_UNREACHABLE(); + } +#line 7173 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + swap = 1; + } else if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_MODE(op2_addr) != IS_CONST_ZVAL) { + //| LONG_OP_WITH_CONST cmp, op2_addr, Z_LVAL_P(Z_ZV(op1_addr)) + if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 4640, (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 4652, (Z_REG(op2_addr)), Z_OFFSET(op2_addr), Z_LVAL_P(Z_ZV(op1_addr))); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 4604, (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32), (Z_REG(op2_addr))); + } else { + dasm_put(Dst, 4614, (Z_REG(op2_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7177 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + swap = 1; + } else if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_MODE(op1_addr) != IS_CONST_ZVAL) { + //| LONG_OP_WITH_CONST cmp, op1_addr, Z_LVAL_P(Z_ZV(op2_addr)) + if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 4640, (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 4652, (Z_REG(op1_addr)), Z_OFFSET(op1_addr), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 4604, (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (Z_REG(op1_addr))); + } else { + dasm_put(Dst, 4614, (Z_REG(op1_addr)), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7180 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_LVAL ZREG_R0, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R0), (ZREG_R0)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R0 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7182 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + //| test r0, r0 + dasm_put(Dst, 3655); +#line 7184 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LONG_OP cmp, ZREG_R0, op2_addr, r0 + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 4604, (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32), (ZREG_R0)); + } else { + dasm_put(Dst, 4614, (ZREG_R0), Z_LVAL_P(Z_ZV(op2_addr))); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 4622, (ZREG_R0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + dasm_put(Dst, 4632, (Z_REG(op2_addr)), (ZREG_R0)); + } else { + ZEND_UNREACHABLE(); + } +#line 7186 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ_EX || + smart_branch_opcode == ZEND_JMPNZ_EX) { + + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + //| sete al + dasm_put(Dst, 4661); +#line 7199 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + case ZEND_IS_NOT_IDENTICAL: + //| setne al + dasm_put(Dst, 4665); +#line 7203 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER: + if (swap) { + //| setg al + dasm_put(Dst, 4669); +#line 7207 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| setl al + dasm_put(Dst, 4673); +#line 7209 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + //| setge al + dasm_put(Dst, 4677); +#line 7214 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| setle al + dasm_put(Dst, 4681); +#line 7216 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + //| movzx eax, al + //| lea eax, [eax + 2] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4685, 2); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 7224 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (smart_branch_opcode == ZEND_JMPZ || + smart_branch_opcode == ZEND_JMPZ_EX) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + if (exit_addr) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 7234 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + dasm_put(Dst, 1908, target_label); +#line 7236 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_EQUAL: + if (exit_addr) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 7241 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je => target_label + dasm_put(Dst, 4700, target_label); +#line 7243 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_IDENTICAL: + if (exit_addr) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 7248 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je => target_label + dasm_put(Dst, 4700, target_label); +#line 7250 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER: + if (swap) { + if (exit_addr) { + //| jle &exit_addr + dasm_put(Dst, 3860, (ptrdiff_t)(exit_addr)); +#line 7256 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jle => target_label + dasm_put(Dst, 4704, target_label); +#line 7258 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (exit_addr) { + //| jge &exit_addr + dasm_put(Dst, 4708, (ptrdiff_t)(exit_addr)); +#line 7262 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jge => target_label + dasm_put(Dst, 4712, target_label); +#line 7264 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + if (exit_addr) { + //| jl &exit_addr + dasm_put(Dst, 4716, (ptrdiff_t)(exit_addr)); +#line 7271 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jl => target_label + dasm_put(Dst, 4720, target_label); +#line 7273 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (exit_addr) { + //| jg &exit_addr + dasm_put(Dst, 3864, (ptrdiff_t)(exit_addr)); +#line 7277 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jg => target_label + dasm_put(Dst, 4724, target_label); +#line 7279 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + break; + default: + ZEND_UNREACHABLE(); + } + } else if (smart_branch_opcode == ZEND_JMPNZ || + smart_branch_opcode == ZEND_JMPNZ_EX) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + if (exit_addr) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 7294 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je => target_label + dasm_put(Dst, 4700, target_label); +#line 7296 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_EQUAL: + if (exit_addr) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 7301 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + dasm_put(Dst, 1908, target_label); +#line 7303 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_IDENTICAL: + if (exit_addr) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 7308 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + dasm_put(Dst, 1908, target_label); +#line 7310 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER: + if (swap) { + if (exit_addr) { + //| jg &exit_addr + dasm_put(Dst, 3864, (ptrdiff_t)(exit_addr)); +#line 7316 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jg => target_label + dasm_put(Dst, 4724, target_label); +#line 7318 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (exit_addr) { + //| jl &exit_addr + dasm_put(Dst, 4716, (ptrdiff_t)(exit_addr)); +#line 7322 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jl => target_label + dasm_put(Dst, 4720, target_label); +#line 7324 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + if (exit_addr) { + //| jge &exit_addr + dasm_put(Dst, 4708, (ptrdiff_t)(exit_addr)); +#line 7331 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jge => target_label + dasm_put(Dst, 4712, target_label); +#line 7333 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (exit_addr) { + //| jle &exit_addr + dasm_put(Dst, 3860, (ptrdiff_t)(exit_addr)); +#line 7337 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jle => target_label + dasm_put(Dst, 4704, target_label); +#line 7339 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + break; + default: + ZEND_UNREACHABLE(); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + //| sete al + dasm_put(Dst, 4661); +#line 7355 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + case ZEND_IS_NOT_IDENTICAL: + //| setne al + dasm_put(Dst, 4665); +#line 7359 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER: + if (swap) { + //| setg al + dasm_put(Dst, 4669); +#line 7363 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| setl al + dasm_put(Dst, 4673); +#line 7365 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + //| setge al + dasm_put(Dst, 4677); +#line 7370 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| setle al + dasm_put(Dst, 4681); +#line 7372 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + //| movzx eax, al + //| add eax, 2 + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4728); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 7380 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, zend_jit_addr res_addr, bool swap, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + if (exit_addr) { + //| jne &exit_addr + //| jp &exit_addr + dasm_put(Dst, 4735, (ptrdiff_t)(exit_addr), (ptrdiff_t)(exit_addr)); +#line 7397 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + //| jp => target_label + dasm_put(Dst, 4742, target_label, target_label); +#line 7400 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_EQUAL: + //| jp >1 + dasm_put(Dst, 4749); +#line 7404 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 7406 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je => target_label + dasm_put(Dst, 4700, target_label); +#line 7408 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + dasm_put(Dst, 70); +#line 7410 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_IDENTICAL: + if (exit_addr) { + //| jne &exit_addr + //| jp &exit_addr + dasm_put(Dst, 4735, (ptrdiff_t)(exit_addr), (ptrdiff_t)(exit_addr)); +#line 7415 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jp >1 + //| je => target_label + //|1: + dasm_put(Dst, 4754, target_label); +#line 7419 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER: + if (swap) { + if (exit_addr) { + //| jbe &exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(exit_addr)); +#line 7425 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jbe => target_label + dasm_put(Dst, 4764, target_label); +#line 7427 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (exit_addr) { + //| jae &exit_addr + //| jp &exit_addr + dasm_put(Dst, 4768, (ptrdiff_t)(exit_addr), (ptrdiff_t)(exit_addr)); +#line 7432 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jae => target_label + //| jp => target_label + dasm_put(Dst, 4775, target_label, target_label); +#line 7435 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + if (exit_addr) { + //| jb &exit_addr + dasm_put(Dst, 4782, (ptrdiff_t)(exit_addr)); +#line 7442 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jb => target_label + dasm_put(Dst, 4786, target_label); +#line 7444 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (exit_addr) { + //| ja &exit_addr + //| jp &exit_addr + dasm_put(Dst, 4790, (ptrdiff_t)(exit_addr), (ptrdiff_t)(exit_addr)); +#line 7449 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ja => target_label + //| jp => target_label + dasm_put(Dst, 4797, target_label, target_label); +#line 7452 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + break; + default: + ZEND_UNREACHABLE(); + } + } else if (smart_branch_opcode == ZEND_JMPNZ) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + //| jp >1 + dasm_put(Dst, 4749); +#line 7465 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 7467 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je => target_label + dasm_put(Dst, 4700, target_label); +#line 7469 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + dasm_put(Dst, 70); +#line 7471 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + if (exit_addr) { + //| jne &exit_addr + //| jp &exit_addr + dasm_put(Dst, 4735, (ptrdiff_t)(exit_addr), (ptrdiff_t)(exit_addr)); +#line 7476 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + //| jp => target_label + dasm_put(Dst, 4742, target_label, target_label); +#line 7479 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_IDENTICAL: + if (exit_addr) { + //| jp >1 + //| je &exit_addr + //|1: + dasm_put(Dst, 4804, (ptrdiff_t)(exit_addr)); +#line 7486 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + //| jp => target_label + dasm_put(Dst, 4742, target_label, target_label); +#line 7489 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER: + if (swap) { + if (exit_addr) { + //| ja &exit_addr + dasm_put(Dst, 4814, (ptrdiff_t)(exit_addr)); +#line 7495 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ja => target_label + dasm_put(Dst, 4818, target_label); +#line 7497 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jp >1 + dasm_put(Dst, 4749); +#line 7500 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + //| jb &exit_addr + dasm_put(Dst, 4782, (ptrdiff_t)(exit_addr)); +#line 7502 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jb => target_label + dasm_put(Dst, 4786, target_label); +#line 7504 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + dasm_put(Dst, 70); +#line 7506 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + if (exit_addr) { + //| jae &exit_addr + dasm_put(Dst, 1756, (ptrdiff_t)(exit_addr)); +#line 7512 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jae => target_label + dasm_put(Dst, 4822, target_label); +#line 7514 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jp >1 + dasm_put(Dst, 4749); +#line 7517 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + //| jbe &exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(exit_addr)); +#line 7519 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jbe => target_label + dasm_put(Dst, 4764, target_label); +#line 7521 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + dasm_put(Dst, 70); +#line 7523 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + } else if (smart_branch_opcode == ZEND_JMPZ_EX) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7535 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne => target_label + //| jp => target_label + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4826, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, target_label, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 7538 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + case ZEND_IS_NOT_IDENTICAL: + //| jp >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 4749); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7543 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je => target_label + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4841, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 7546 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER: + if (swap) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jbe => target_label + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4855, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 7552 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7554 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jae => target_label + //| jp => target_label + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4867, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, target_label, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 7557 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7562 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jb => target_label + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4882, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 7564 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7566 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ja => target_label + //| jp => target_label + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4894, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, target_label, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 7569 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + } else if (smart_branch_opcode == ZEND_JMPNZ_EX) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + //| jp >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4749); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7582 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je => target_label + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 4841, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 7585 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + case ZEND_IS_NOT_IDENTICAL: + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7589 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne => target_label + //| jp => target_label + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 4826, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE, target_label, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 7592 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER: + if (swap) { + //| seta al + //| movzx eax, al + //| lea eax, [eax + 2] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4909, 2); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7599 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ja => target_label + dasm_put(Dst, 4919, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), target_label); +#line 7600 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jp >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4749); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7603 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jb => target_label + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 4930, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 7606 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + //| setae al + //| movzx eax, al + //| lea eax, [eax + 2] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4944, 2); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7614 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jae => target_label + dasm_put(Dst, 4954, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), target_label); +#line 7615 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jp >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4749); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 7618 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jbe => target_label + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 4965, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE, target_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 7621 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_CASE: + case ZEND_CASE_STRICT: + //| jp >1 + //| mov eax, IS_TRUE + //| je >2 + //|1: + //| mov eax, IS_FALSE + //|2: + dasm_put(Dst, 4979, IS_TRUE, IS_FALSE); +#line 7641 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + case ZEND_IS_NOT_IDENTICAL: + //| jp >1 + //| mov eax, IS_FALSE + //| je >2 + //|1: + //| mov eax, IS_TRUE + //|2: + dasm_put(Dst, 4979, IS_FALSE, IS_TRUE); +#line 7650 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER: + if (swap) { + //| seta al + //| movzx eax, al + //| add eax, 2 + dasm_put(Dst, 4996); +#line 7656 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jp >1 + //| mov eax, IS_TRUE + //| jb >2 + //|1: + //| mov eax, IS_FALSE + //|2: + dasm_put(Dst, 5006, IS_TRUE, IS_FALSE); +#line 7663 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (swap) { + //| setae al + //| movzx eax, al + //| add eax, 2 + dasm_put(Dst, 5023); +#line 7670 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jp >1 + //| mov eax, IS_TRUE + //| jbe >2 + //|1: + //| mov eax, IS_FALSE + //|2: + dasm_put(Dst, 5033, IS_TRUE, IS_FALSE); +#line 7677 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + //| SET_ZVAL_TYPE_INFO res_addr, eax + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 7683 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_cmp_long_double(dasm_State **Dst, const zend_op *opline, zend_jit_addr op1_addr, zend_jit_addr op2_addr, zend_jit_addr res_addr, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + zend_reg tmp_reg = ZREG_XMM0; + + //| DOUBLE_GET_ZVAL_LVAL tmp_reg, op1_addr, ZREG_R0 + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(Z_ZV(op1_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (ZREG_R0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2825, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr))); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7693 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| DOUBLE_CMP tmp_reg, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5050, (tmp_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 5060, (tmp_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 5070, (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 5078, (tmp_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5086, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 5098, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5110, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5120, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7694 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return zend_jit_cmp_double_common(Dst, opline, res_addr, 0, smart_branch_opcode, target_label, target_label2, exit_addr); +} + +static int zend_jit_cmp_double_long(dasm_State **Dst, const zend_op *opline, zend_jit_addr op1_addr, zend_jit_addr op2_addr, zend_jit_addr res_addr, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + zend_reg tmp_reg = ZREG_XMM0; + + //| DOUBLE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0 + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(Z_ZV(op2_addr))); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (ZREG_R0)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2799, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2825, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } else { + dasm_put(Dst, 2780, (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7703 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| DOUBLE_CMP tmp_reg, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5050, (tmp_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 5060, (tmp_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 5070, (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 5078, (tmp_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5086, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 5098, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5110, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5120, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return zend_jit_cmp_double_common(Dst, opline, res_addr, /* swap */ 1, smart_branch_opcode, target_label, target_label2, exit_addr); +} + +static int zend_jit_cmp_double_double(dasm_State **Dst, const zend_op *opline, zend_jit_addr op1_addr, zend_jit_addr op2_addr, zend_jit_addr res_addr, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + bool swap = 0; + + if (Z_MODE(op1_addr) == IS_REG) { + //| DOUBLE_CMP Z_REG(op1_addr), op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5050, (Z_REG(op1_addr)-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 5060, (Z_REG(op1_addr)-ZREG_XMM0), Z_ZV(op2_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 5070, (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5078, (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5086, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 5098, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5110, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5120, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7714 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_MODE(op2_addr) == IS_REG) { + //| DOUBLE_CMP Z_REG(op2_addr), op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5050, (Z_REG(op2_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 5060, (Z_REG(op2_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 5070, (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5078, (Z_REG(op2_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5086, (Z_REG(op2_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 5098, (Z_REG(op2_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5110, (Z_REG(op2_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5120, (Z_REG(op2_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7716 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + swap = 1; + } else { + zend_reg tmp_reg = ZREG_XMM0; + + //| DOUBLE_GET_ZVAL_DVAL tmp_reg, op1_addr + if (Z_MODE(op1_addr) != IS_REG || tmp_reg != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (tmp_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (tmp_reg-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (tmp_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (tmp_reg-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 7721 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| DOUBLE_CMP tmp_reg, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5050, (tmp_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } else { + dasm_put(Dst, 5060, (tmp_reg-ZREG_XMM0), Z_ZV(op2_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 5070, (tmp_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 5078, (tmp_reg-ZREG_XMM0)); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5086, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 5098, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } + } else if (Z_MODE(op2_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5110, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5120, (tmp_reg-ZREG_XMM0), (Z_REG(op2_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 7722 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return zend_jit_cmp_double_common(Dst, opline, res_addr, swap, smart_branch_opcode, target_label, target_label2, exit_addr); +} + +static int zend_jit_cmp_slow(dasm_State **Dst, const zend_op *opline, zend_jit_addr res_addr, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + //| test, eax, eax + dasm_put(Dst, 3656); +#line 7730 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ_EX || + smart_branch_opcode == ZEND_JMPNZ_EX) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_CASE: + //| sete al + dasm_put(Dst, 4661); +#line 7737 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + //| setne al + dasm_put(Dst, 4665); +#line 7740 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER: + //| setl al + dasm_put(Dst, 4673); +#line 7743 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER_OR_EQUAL: + //| setle al + dasm_put(Dst, 4681); +#line 7746 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + //| movzx eax, al + //| lea eax, [eax + 2] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4685, 2); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 7753 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (smart_branch_opcode == ZEND_JMPZ || + smart_branch_opcode == ZEND_JMPZ_EX) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_CASE: + if (exit_addr) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 7761 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + dasm_put(Dst, 1908, target_label); +#line 7763 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_EQUAL: + if (exit_addr) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 7768 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je => target_label + dasm_put(Dst, 4700, target_label); +#line 7770 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER: + if (exit_addr) { + //| jge &exit_addr + dasm_put(Dst, 4708, (ptrdiff_t)(exit_addr)); +#line 7775 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jge => target_label + dasm_put(Dst, 4712, target_label); +#line 7777 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (exit_addr) { + //| jg &exit_addr + dasm_put(Dst, 3864, (ptrdiff_t)(exit_addr)); +#line 7782 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jg => target_label + dasm_put(Dst, 4724, target_label); +#line 7784 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + } else if (smart_branch_opcode == ZEND_JMPNZ || + smart_branch_opcode == ZEND_JMPNZ_EX) { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_CASE: + if (exit_addr) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 7796 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je => target_label + dasm_put(Dst, 4700, target_label); +#line 7798 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_NOT_EQUAL: + if (exit_addr) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 7803 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne => target_label + dasm_put(Dst, 1908, target_label); +#line 7805 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER: + if (exit_addr) { + //| jl &exit_addr + dasm_put(Dst, 4716, (ptrdiff_t)(exit_addr)); +#line 7810 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jl => target_label + dasm_put(Dst, 4720, target_label); +#line 7812 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + case ZEND_IS_SMALLER_OR_EQUAL: + if (exit_addr) { + //| jle &exit_addr + dasm_put(Dst, 3860, (ptrdiff_t)(exit_addr)); +#line 7817 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jle => target_label + dasm_put(Dst, 4704, target_label); +#line 7819 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + break; + default: + ZEND_UNREACHABLE(); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + switch (opline->opcode) { + case ZEND_IS_EQUAL: + case ZEND_CASE: + //| sete al + dasm_put(Dst, 4661); +#line 7832 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_NOT_EQUAL: + //| setne al + dasm_put(Dst, 4665); +#line 7835 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER: + //| setl al + dasm_put(Dst, 4673); +#line 7838 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_IS_SMALLER_OR_EQUAL: + //| setle al + dasm_put(Dst, 4681); +#line 7841 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + //| movzx eax, al + //| add eax, 2 + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4728); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 7848 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_cmp(dasm_State **Dst, + const zend_op *opline, + uint32_t op1_info, + zend_ssa_range *op1_range, + zend_jit_addr op1_addr, + uint32_t op2_info, + zend_ssa_range *op2_range, + zend_jit_addr op2_addr, + zend_jit_addr res_addr, + int may_throw, + uint8_t smart_branch_opcode, + uint32_t target_label, + uint32_t target_label2, + const void *exit_addr, + bool skip_comparison) +{ + bool same_ops = (opline->op1_type == opline->op2_type) && (opline->op1.var == opline->op2.var); + bool has_slow; + + has_slow = + (op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + (op2_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) && + ((op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) || + (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE)))); + + if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG)) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) { + if (op1_info & MAY_BE_DOUBLE) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >4 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5130, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 7882 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >9 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 7884 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!same_ops && (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG))) { + if (op2_info & MAY_BE_DOUBLE) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >3 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); +#line 7889 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 5156, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 7890 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|3: + dasm_put(Dst, 333); +#line 7891 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >9 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7893 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_cmp_long_double(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + //| jmp >6 + //|.code + dasm_put(Dst, 5170); +#line 7899 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >9 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 7901 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_cmp_long_long(Dst, opline, op1_range, op1_addr, op2_range, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr, skip_comparison)) { + return 0; + } + if (op1_info & MAY_BE_DOUBLE) { + //|.cold_code + dasm_put(Dst, 276); +#line 7908 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + dasm_put(Dst, 375); +#line 7909 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >9 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7911 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op2_info & MAY_BE_DOUBLE) { + if (!same_ops && (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_DOUBLE))) { + if (!same_ops) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >5 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5176, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7916 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >9 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7918 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_cmp_double_double(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + //| jmp >6 + dasm_put(Dst, 5189); +#line 7924 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!same_ops) { + //|5: + dasm_put(Dst, 509); +#line 7927 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >9 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 7929 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_cmp_double_long(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + //| jmp >6 + dasm_put(Dst, 5189); +#line 7934 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 7936 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if ((op1_info & MAY_BE_DOUBLE) && + !(op1_info & MAY_BE_LONG) && + (op2_info & (MAY_BE_LONG|MAY_BE_DOUBLE))) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_DOUBLE)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >9 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7942 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op2_info & MAY_BE_DOUBLE) { + if (!same_ops && (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_DOUBLE))) { + if (!same_ops && (op2_info & MAY_BE_LONG)) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >3 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7947 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >9 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7949 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_cmp_double_double(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + } + if (!same_ops && (op2_info & MAY_BE_LONG)) { + if (op2_info & MAY_BE_DOUBLE) { + //|.cold_code + dasm_put(Dst, 276); +#line 7958 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 7960 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_DOUBLE|MAY_BE_LONG))) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >9 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 7962 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_cmp_double_long(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + if (op2_info & MAY_BE_DOUBLE) { + //| jmp >6 + //|.code + dasm_put(Dst, 5170); +#line 7969 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if ((op2_info & MAY_BE_DOUBLE) && + !(op2_info & MAY_BE_LONG) && + (op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE))) { + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_DOUBLE)) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_DOUBLE, >9 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7976 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_DOUBLE) { + if (!same_ops && (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_DOUBLE))) { + if (!same_ops && (op1_info & MAY_BE_LONG)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7981 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_DOUBLE, >9 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_DOUBLE); +#line 7983 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!zend_jit_cmp_double_double(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + } + if (!same_ops && (op1_info & MAY_BE_LONG)) { + if (op1_info & MAY_BE_DOUBLE) { + //|.cold_code + dasm_put(Dst, 276); +#line 7992 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 7994 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_DOUBLE|MAY_BE_LONG))) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >9 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5143, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 7996 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_cmp_long_double(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + if (op1_info & MAY_BE_DOUBLE) { + //| jmp >6 + //|.code + dasm_put(Dst, 5170); +#line 8003 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if (has_slow || + (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) || + (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE)))) { + if (has_slow) { + //|.cold_code + dasm_put(Dst, 276); +#line 8012 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + dasm_put(Dst, 4230); +#line 8013 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 8015 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op1_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var); + if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) { + return 0; + } + op1_addr = real_addr; + } + if (Z_MODE(op2_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var); + if (!zend_jit_spill_store(Dst, op2_addr, real_addr, op2_info, 1)) { + return 0; + } + op2_addr = real_addr; + } + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8030 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) { + //| IF_NOT_Z_TYPE FCARG1a, IS_UNDEF, >1 + //| mov FCARG1a, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 5194, offsetof(zval, u1.v.type), IS_UNDEF, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 8034 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ADDR_ZTS FCARG1a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5207, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5213, tsrm_tls_index, tsrm_tls_offset); + } +#line 8035 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 5230, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); +#line 8036 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type == IS_CV && (op2_info & MAY_BE_UNDEF)) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); +#line 8039 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov T1, FCARG1a // save + //| mov FCARG1a, opline->op2.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 5237, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_UNDEF, opline->op2.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 8042 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, T1 // restore + //| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval + dasm_put(Dst, 5258); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 4174, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 4180, tsrm_tls_index, tsrm_tls_offset); + } +#line 8044 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >2 + //|1: + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + dasm_put(Dst, 5264, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8047 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 8048 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8050 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_compare, r0 + if (MAY_USE_32BIT_ADDR(zend_compare)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_compare)); + } else { + if (IS_SIGNED_32BIT(zend_compare)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_compare)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_compare)), (unsigned int)((((ptrdiff_t)zend_compare))>>32)); + } + dasm_put(Dst, 66); + } +#line 8052 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->opcode != ZEND_CASE && + (opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) || + ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) && + (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) { + //| mov dword T1, eax // save + dasm_put(Dst, 3548); +#line 8058 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_CASE) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 0, NULL + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8060 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, NULL + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8062 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + //| mov eax, dword T1 // restore + dasm_put(Dst, 3570); +#line 8066 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (may_throw) { +#if ZTS + //| mov dword T1, eax // save + dasm_put(Dst, 3548); +#line 8069 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(exception)))) { + //| mov dword T1, eax // save + dasm_put(Dst, 3548); +#line 8072 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#endif + zend_jit_check_exception_undef_result(Dst, opline); +#if ZTS + //| mov eax, dword T1 // restore + dasm_put(Dst, 3570); +#line 8077 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(exception)))) { + //| mov eax, dword T1 // restore + dasm_put(Dst, 3570); +#line 8080 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#endif + } + if (!zend_jit_cmp_slow(Dst, opline, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + if (has_slow) { + //| jmp >6 + //|.code + dasm_put(Dst, 5170); +#line 8089 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //|6: + dasm_put(Dst, 3411); +#line 8093 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_identical(dasm_State **Dst, + const zend_op *opline, + uint32_t op1_info, + zend_ssa_range *op1_range, + zend_jit_addr op1_addr, + uint32_t op2_info, + zend_ssa_range *op2_range, + zend_jit_addr op2_addr, + zend_jit_addr res_addr, + int may_throw, + uint8_t smart_branch_opcode, + uint32_t target_label, + uint32_t target_label2, + const void *exit_addr, + bool skip_comparison) +{ + uint32_t identical_label = (uint32_t)-1; + uint32_t not_identical_label = (uint32_t)-1; + + if (smart_branch_opcode && !exit_addr) { + if (opline->opcode != ZEND_IS_NOT_IDENTICAL) { + if (smart_branch_opcode == ZEND_JMPZ) { + not_identical_label = target_label; + } else if (smart_branch_opcode == ZEND_JMPNZ) { + identical_label = target_label; + } else { + ZEND_UNREACHABLE(); + } + } else { + if (smart_branch_opcode == ZEND_JMPZ) { + identical_label = target_label; + } else if (smart_branch_opcode == ZEND_JMPNZ) { + not_identical_label = target_label; + } else { + ZEND_UNREACHABLE(); + } + } + } + + if ((op1_info & (MAY_BE_REF|MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_LONG && + (op2_info & (MAY_BE_REF|MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_LONG) { + if (!zend_jit_cmp_long_long(Dst, opline, op1_range, op1_addr, op2_range, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr, skip_comparison)) { + return 0; + } + return 1; + } else if ((op1_info & (MAY_BE_REF|MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_DOUBLE && + (op2_info & (MAY_BE_REF|MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_DOUBLE) { + if (!zend_jit_cmp_double_double(Dst, opline, op1_addr, op2_addr, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) { + return 0; + } + return 1; + } + + if ((op1_info & MAY_BE_UNDEF) && (op2_info & MAY_BE_UNDEF)) { + op1_info |= MAY_BE_NULL; + op2_info |= MAY_BE_NULL; + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8154 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_Z_TYPE FCARG1a, IS_UNDEF, >1 + //|.cold_code + dasm_put(Dst, 5275, offsetof(zval, u1.v.type), IS_UNDEF); +#line 8156 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 8159 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 8161 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + //| LOAD_ADDR_ZTS FCARG1a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5207, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5213, tsrm_tls_index, tsrm_tls_offset); + } +#line 8165 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >1 + //|.code + dasm_put(Dst, 5285, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); +#line 8167 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + dasm_put(Dst, 70); + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8169 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_Z_TYPE FCARG2a, IS_UNDEF, >1 + //|.cold_code + dasm_put(Dst, 5295, offsetof(zval, u1.v.type), IS_UNDEF); +#line 8171 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 8174 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov aword T1, FCARG1a // save + //| mov FCARG1d, opline->op2.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 5305, opline->op2.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 8177 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + //| mov FCARG1a, aword T1 // restore + //| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval + dasm_put(Dst, 5258); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 4174, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 4180, tsrm_tls_index, tsrm_tls_offset); + } +#line 8182 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >1 + //|.code + dasm_put(Dst, 5312, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); +#line 8184 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 8185 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (op1_info & MAY_BE_UNDEF) { + op1_info |= MAY_BE_NULL; + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8188 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_Z_TYPE FCARG1a, IS_UNDEF, >1 + //|.cold_code + dasm_put(Dst, 5275, offsetof(zval, u1.v.type), IS_UNDEF); +#line 8190 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 8193 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 8195 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + //| LOAD_ADDR_ZTS FCARG1a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5207, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5213, tsrm_tls_index, tsrm_tls_offset); + } +#line 8199 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >1 + //|.code + dasm_put(Dst, 5285, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); +#line 8201 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 8202 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op2_type != IS_CONST) { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8204 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (op2_info & MAY_BE_UNDEF) { + op2_info |= MAY_BE_NULL; + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8208 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_Z_TYPE FCARG2a, IS_UNDEF, >1 + //|.cold_code + dasm_put(Dst, 5295, offsetof(zval, u1.v.type), IS_UNDEF); +#line 8210 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 8213 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op2.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op2.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 8215 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + //| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 4174, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 4180, tsrm_tls_index, tsrm_tls_offset); + } +#line 8219 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >1 + //|.code + dasm_put(Dst, 5312, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); +#line 8221 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 8222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type != IS_CONST) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8224 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if ((op1_info & op2_info & MAY_BE_ANY) != 0) { + if (opline->op1_type != IS_CONST) { + if (Z_MODE(op1_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var); + if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) { + return 0; + } + op1_addr = real_addr; + } + } + if (opline->op2_type != IS_CONST) { + if (Z_MODE(op2_addr) == IS_REG) { + zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var); + if (!zend_jit_spill_store(Dst, op2_addr, real_addr, op2_info, 1)) { + return 0; + } + op2_addr = real_addr; + } + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8244 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op1_type != IS_CONST) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8247 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if ((op1_info & op2_info & MAY_BE_ANY) == 0) { + if ((opline->opcode != ZEND_CASE_STRICT && + (opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) || + ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) && + (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) { + if (opline->opcode != ZEND_CASE_STRICT) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8258 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8260 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (smart_branch_opcode) { + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8268 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (not_identical_label != (uint32_t)-1) { + //| jmp =>not_identical_label + dasm_put(Dst, 1614, not_identical_label); +#line 8271 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_FALSE : IS_TRUE) + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_FALSE : IS_TRUE)); +#line 8274 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception(Dst); + } + } + return 1; + } + + if (opline->op1_type & (IS_CV|IS_VAR)) { + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 8283 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type & (IS_CV|IS_VAR)) { + //| ZVAL_DEREF FCARG2a, op2_info + if (op2_info & MAY_BE_REF) { + dasm_put(Dst, 5340, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 8286 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (has_concrete_type(op1_info) + && has_concrete_type(op2_info) + && concrete_type(op1_info) == concrete_type(op2_info) + && concrete_type(op1_info) <= IS_TRUE) { + if (smart_branch_opcode) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8296 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (identical_label != (uint32_t)-1) { + //| jmp =>identical_label + dasm_put(Dst, 1614, identical_label); +#line 8299 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_TRUE : IS_FALSE) + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_TRUE : IS_FALSE)); +#line 8302 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (zend_is_identical(Z_ZV(op1_addr), Z_ZV(op2_addr))) { + if (smart_branch_opcode) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8309 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (identical_label != (uint32_t)-1) { + //| jmp =>identical_label + dasm_put(Dst, 1614, identical_label); +#line 8312 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_TRUE : IS_FALSE) + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_TRUE : IS_FALSE)); +#line 8315 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (smart_branch_opcode) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8321 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (not_identical_label != (uint32_t)-1) { + //| jmp =>not_identical_label + dasm_put(Dst, 1614, not_identical_label); +#line 8324 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_FALSE : IS_TRUE) + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), (opline->opcode != ZEND_IS_NOT_IDENTICAL ? IS_FALSE : IS_TRUE)); +#line 8327 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_TYPE_P(Z_ZV(op1_addr)) <= IS_TRUE) { + zval *val = Z_ZV(op1_addr); + + //| cmp byte [FCARG2a + offsetof(zval, u1.v.type)], Z_TYPE_P(val) + dasm_put(Dst, 5358, offsetof(zval, u1.v.type), Z_TYPE_P(val)); +#line 8333 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (smart_branch_opcode) { + if (opline->op2_type == IS_VAR && (op2_info & MAY_BE_REF)) { + //| jne >8 + //| FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline + dasm_put(Dst, 3726); + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8337 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8342 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (identical_label != (uint32_t)-1) { + //| jmp =>identical_label + dasm_put(Dst, 1614, identical_label); +#line 8344 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8346 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|8: + dasm_put(Dst, 4331); +#line 8348 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 8350 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (identical_label != (uint32_t)-1) { + //| je =>identical_label + dasm_put(Dst, 4700, identical_label); +#line 8352 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je >9 + dasm_put(Dst, 3712); +#line 8354 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (opline->opcode != ZEND_IS_NOT_IDENTICAL) { + //| sete al + dasm_put(Dst, 4661); +#line 8358 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| setne al + dasm_put(Dst, 4665); +#line 8360 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| movzx eax, al + //| lea eax, [eax + 2] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4685, 2); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8364 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) && + (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + //| FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8368 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + } + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8375 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode && not_identical_label != (uint32_t)-1) { + //| jmp =>not_identical_label + dasm_put(Dst, 1614, not_identical_label); +#line 8378 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_TYPE_P(Z_ZV(op2_addr)) <= IS_TRUE) { + zval *val = Z_ZV(op2_addr); + + //| cmp byte [FCARG1a + offsetof(zval, u1.v.type)], Z_TYPE_P(val) + dasm_put(Dst, 5363, offsetof(zval, u1.v.type), Z_TYPE_P(val)); +#line 8383 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (smart_branch_opcode) { + if (opline->opcode != ZEND_CASE_STRICT + && opline->op1_type == IS_VAR && (op1_info & MAY_BE_REF)) { + //| jne >8 + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + dasm_put(Dst, 3726); + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8388 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8393 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (identical_label != (uint32_t)-1) { + //| jmp =>identical_label + dasm_put(Dst, 1614, identical_label); +#line 8395 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8397 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|8: + dasm_put(Dst, 4331); +#line 8399 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (exit_addr && smart_branch_opcode == ZEND_JMPNZ) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 8401 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (identical_label != (uint32_t)-1) { + //| je =>identical_label + dasm_put(Dst, 4700, identical_label); +#line 8403 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je >9 + dasm_put(Dst, 3712); +#line 8405 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (opline->opcode != ZEND_IS_NOT_IDENTICAL) { + //| sete al + dasm_put(Dst, 4661); +#line 8409 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| setne al + dasm_put(Dst, 4665); +#line 8411 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| movzx eax, al + //| lea eax, [eax + 2] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4685, 2); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8415 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode != ZEND_CASE_STRICT + && (opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8420 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + } + if (smart_branch_opcode) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8428 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (not_identical_label != (uint32_t)-1) { + //| jmp =>not_identical_label + dasm_put(Dst, 1614, not_identical_label); +#line 8431 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if (opline->op1_type == IS_CONST) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8436 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type == IS_CONST) { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8439 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_is_identical, r0 + if (MAY_USE_32BIT_ADDR(zend_is_identical)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_is_identical)); + } else { + if (IS_SIGNED_32BIT(zend_is_identical)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_is_identical)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_is_identical)), (unsigned int)((((ptrdiff_t)zend_is_identical))>>32)); + } + dasm_put(Dst, 66); + } +#line 8441 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->opcode != ZEND_CASE_STRICT && + (opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) || + ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) && + (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) { + //| mov aword T1, r0 // save + dasm_put(Dst, 3547); +#line 8447 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_CASE_STRICT) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8449 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| FREE_OP opline->op2_type, opline->op2, op2_info, 1, opline + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 8451 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception_undef_result(Dst, opline); + } + //| mov r0, aword T1 // restore + dasm_put(Dst, 3569); +#line 8455 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (smart_branch_opcode) { + //| test al, al + dasm_put(Dst, 5368); +#line 8458 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jnz &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 8461 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 8463 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (not_identical_label != (uint32_t)-1) { + //| jz =>not_identical_label + dasm_put(Dst, 4700, not_identical_label); +#line 8466 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (identical_label != (uint32_t)-1) { + //| jmp =>identical_label + dasm_put(Dst, 1614, identical_label); +#line 8468 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (identical_label != (uint32_t)-1) { + //| jnz =>identical_label + dasm_put(Dst, 1908, identical_label); +#line 8471 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| movzx eax, al + dasm_put(Dst, 5371); +#line 8474 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_IS_NOT_IDENTICAL) { + //| lea eax, [eax + 2] + dasm_put(Dst, 4688, 2); +#line 8476 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| neg eax + //| lea eax, [eax + 3] + dasm_put(Dst, 5375, 3); +#line 8479 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_TYPE_INFO res_addr, eax + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8481 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //|9: + dasm_put(Dst, 4230); +#line 8485 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + zend_jit_check_exception(Dst); + } + return 1; +} + +static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr res_addr, uint32_t target_label, uint32_t target_label2, int may_throw, uint8_t branch_opcode, const void *exit_addr) +{ + uint32_t true_label = -1; + uint32_t false_label = -1; + bool set_bool = 0; + bool set_bool_not = 0; + bool set_delayed = 0; + bool jmp_done = 0; + + if (branch_opcode == ZEND_BOOL) { + set_bool = 1; + } else if (branch_opcode == ZEND_BOOL_NOT) { + set_bool = 1; + set_bool_not = 1; + } else if (branch_opcode == ZEND_JMPZ) { + false_label = target_label; + } else if (branch_opcode == ZEND_JMPNZ) { + true_label = target_label; + } else if (branch_opcode == ZEND_JMPZ_EX) { + set_bool = 1; + false_label = target_label; + } else if (branch_opcode == ZEND_JMPNZ_EX) { + set_bool = 1; + true_label = target_label; + } else { + ZEND_UNREACHABLE(); + } + + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (zend_is_true(Z_ZV(op1_addr))) { + /* Always TRUE */ + if (set_bool) { + if (set_bool_not) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8525 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8527 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (true_label != (uint32_t)-1) { + //| jmp =>true_label; + dasm_put(Dst, 1614, true_label); +#line 8531 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + /* Always FALSE */ + if (set_bool) { + if (set_bool_not) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8537 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8539 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (false_label != (uint32_t)-1) { + //| jmp =>false_label; + dasm_put(Dst, 1614, false_label); +#line 8543 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + return 1; + } + + if (opline->op1_type == IS_CV && (op1_info & MAY_BE_REF)) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 8551 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE)) { + if (!(op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)-MAY_BE_TRUE))) { + /* Always TRUE */ + if (set_bool) { + if (set_bool_not) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8560 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8562 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (true_label != (uint32_t)-1) { + //| jmp =>true_label; + dasm_put(Dst, 1614, true_label); +#line 8566 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (!(op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE)))) { + /* Always FALSE */ + if (set_bool) { + if (set_bool_not) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8573 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8575 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + //| CMP_ZVAL_TYPE op1_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5382, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_TRUE); +#line 8579 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & MAY_BE_LONG) && + !(op1_info & MAY_BE_UNDEF) && + !set_bool) { + if (exit_addr) { + if (branch_opcode == ZEND_JMPNZ) { + //| jl >9 + dasm_put(Dst, 5391); +#line 8586 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jl &exit_addr + dasm_put(Dst, 4716, (ptrdiff_t)(exit_addr)); +#line 8588 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (false_label != (uint32_t)-1) { + //| jl =>false_label + dasm_put(Dst, 4720, false_label); +#line 8591 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jl >9 + dasm_put(Dst, 5391); +#line 8593 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + jmp_done = 1; + } else { + //| jg >2 + dasm_put(Dst, 4493); +#line 8597 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!(op1_info & MAY_BE_TRUE)) { + /* It's FALSE */ + if (set_bool) { + if (set_bool_not) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8604 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8606 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if (exit_addr) { + if (set_bool) { + //| jne >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 344); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8613 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8615 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8617 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 70); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8620 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (branch_opcode == ZEND_JMPZ || branch_opcode == ZEND_JMPZ_EX) { + if (!(op1_info & (MAY_BE_UNDEF|MAY_BE_LONG))) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 8623 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 8628 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (!(op1_info & (MAY_BE_UNDEF|MAY_BE_LONG))) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 8630 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je >9 + dasm_put(Dst, 3712); +#line 8632 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (true_label != (uint32_t)-1 || false_label != (uint32_t)-1) { + if (set_bool) { + //| jne >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 344); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8638 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (true_label != (uint32_t)-1) { + //| jmp =>true_label + dasm_put(Dst, 1614, true_label); +#line 8640 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8642 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 70); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8645 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (true_label != (uint32_t)-1) { + //| je =>true_label + dasm_put(Dst, 4700, true_label); +#line 8648 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (!(op1_info & (MAY_BE_UNDEF|MAY_BE_LONG))) { + //| jne =>false_label + dasm_put(Dst, 1908, false_label); +#line 8650 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + jmp_done = 1; + } else { + //| je >9 + dasm_put(Dst, 3712); +#line 8653 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (set_bool) { + //| sete al + //| movzx eax, al + dasm_put(Dst, 5396); +#line 8658 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (set_bool_not) { + //| neg eax + //| add eax, 3 + dasm_put(Dst, 5403); +#line 8661 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| add eax, 2 + dasm_put(Dst, 4731); +#line 8663 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((op1_info & MAY_BE_UNDEF) && (op1_info & MAY_BE_ANY)) { + set_delayed = 1; + } else { + //| SET_ZVAL_TYPE_INFO res_addr, eax + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8668 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + } + + /* It's FALSE, but may be UNDEF */ + if (op1_info & MAY_BE_UNDEF) { + if (op1_info & MAY_BE_ANY) { + if (set_delayed) { + //| CMP_ZVAL_TYPE op1_addr, IS_UNDEF + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 8678 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 5382, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 8679 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jz >1 + dasm_put(Dst, 5410, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8680 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5422, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 8682 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.cold_code + dasm_put(Dst, 276); +#line 8684 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 8685 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG1d, opline->op1.var + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 2338, opline->op1.var); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 8688 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_undefined_op_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 8689 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (may_throw) { + if (!zend_jit_check_exception_undef_result(Dst, opline)) { + return 0; + } + } + + if (exit_addr) { + if (branch_opcode == ZEND_JMPZ || branch_opcode == ZEND_JMPZ_EX) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8699 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (false_label != (uint32_t)-1) { + //| jmp =>false_label + dasm_put(Dst, 1614, false_label); +#line 8702 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_ANY) { + if (exit_addr) { + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8707 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (false_label == (uint32_t)-1) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8710 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 8712 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!jmp_done) { + if (exit_addr) { + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + if (op1_info & MAY_BE_LONG) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8720 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (op1_info & MAY_BE_LONG) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 8723 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (false_label != (uint32_t)-1) { + //| jmp =>false_label + dasm_put(Dst, 1614, false_label); +#line 8726 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((op1_info & MAY_BE_LONG) || (op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8728 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + } + + if (op1_info & MAY_BE_LONG) { + //|2: + dasm_put(Dst, 2065); +#line 8735 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG))) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >2 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2252, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 8737 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_MODE(op1_addr) == IS_REG) { + //| test Ra(Z_REG(op1_addr)), Ra(Z_REG(op1_addr)) + dasm_put(Dst, 3590, (Z_REG(op1_addr)), (Z_REG(op1_addr))); +#line 8740 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LONG_OP_WITH_CONST, cmp, op1_addr, Z_L(0) + if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (!IS_SIGNED_32BIT(Z_L(0))) { + dasm_put(Dst, 4640, (unsigned int)(Z_L(0)), (unsigned int)((Z_L(0))>>32), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 4652, (Z_REG(op1_addr)), Z_OFFSET(op1_addr), Z_L(0)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (!IS_SIGNED_32BIT(Z_L(0))) { + dasm_put(Dst, 4604, (unsigned int)(Z_L(0)), (unsigned int)((Z_L(0))>>32), (Z_REG(op1_addr))); + } else { + dasm_put(Dst, 4614, (Z_REG(op1_addr)), Z_L(0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8742 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (set_bool) { + //| setne al + //| movzx eax, al + dasm_put(Dst, 5435); +#line 8746 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (set_bool_not) { + //| neg eax + //| add eax, 3 + dasm_put(Dst, 5403); +#line 8749 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| lea eax, [eax + 2] + dasm_put(Dst, 4688, 2); +#line 8751 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_TYPE_INFO res_addr, eax + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8753 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (exit_addr) { + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 8757 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 8759 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (true_label != (uint32_t)-1 || false_label != (uint32_t)-1) { + if (true_label != (uint32_t)-1) { + //| jne =>true_label + dasm_put(Dst, 1908, true_label); +#line 8763 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (false_label != (uint32_t)-1) { + //| jmp =>false_label + dasm_put(Dst, 1614, false_label); +#line 8765 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| je =>false_label + dasm_put(Dst, 4700, false_label); +#line 8768 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if ((op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG))) == MAY_BE_DOUBLE) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //|.cold_code + dasm_put(Dst, 276); +#line 8775 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + dasm_put(Dst, 2065); +#line 8777 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (CAN_USE_AVX()) { + //| vxorps xmm0, xmm0, xmm0 + dasm_put(Dst, 5442); +#line 8779 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| xorps xmm0, xmm0 + dasm_put(Dst, 5448); +#line 8781 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| DOUBLE_CMP ZREG_XMM0, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5050, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 5060, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 5070, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 5078, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5086, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 5098, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 5110, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 5120, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8783 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (set_bool) { + if (exit_addr) { + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 8788 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jp &exit_addr + //| jne &exit_addr + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 5452, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE, (ptrdiff_t)(exit_addr), (ptrdiff_t)(exit_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8791 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jp >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 4749); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 8794 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je &exit_addr + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 5467, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, (ptrdiff_t)(exit_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8797 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (false_label != (uint32_t)-1) { // JMPZ_EX (p=>true, z=>false, false=>jmp) + //| jp >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 4749); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 8801 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je => false_label + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 4841, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE, false_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 8804 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (true_label != (uint32_t)-1) { // JMPNZ_EX (p=>true, z=>false, true=>jmp) + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 8806 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jp => true_label + //| jne => true_label + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 5481, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE, true_label, true_label); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 8809 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (set_bool_not) { // BOOL_NOT (p=>false, z=>true) + //| mov eax, IS_FALSE + //| jp >1 + //| jne >1 + //| mov eax, IS_TRUE + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 5496, IS_FALSE, IS_TRUE); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8816 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { // BOOL (p=>true, z=>false) + //| mov eax, IS_TRUE + //| jp >1 + //| jne >1 + //| mov eax, IS_FALSE + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 5496, IS_TRUE, IS_FALSE); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8823 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 8827 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (exit_addr) { + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| jp &exit_addr + //| jne &exit_addr + //|1: + dasm_put(Dst, 5511, (ptrdiff_t)(exit_addr), (ptrdiff_t)(exit_addr)); +#line 8834 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jp >1 + //| je &exit_addr + //|1: + dasm_put(Dst, 4804, (ptrdiff_t)(exit_addr)); +#line 8838 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8841 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + ZEND_ASSERT(true_label != (uint32_t)-1 || false_label != (uint32_t)-1); + if (false_label != (uint32_t)-1 ) { + //| jp >1 + //| je => false_label + //|1: + dasm_put(Dst, 4754, false_label); +#line 8848 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (true_label != (uint32_t)-1) { + //| jmp =>true_label + dasm_put(Dst, 1614, true_label); +#line 8850 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8852 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jp => true_label + //| jne => true_label + dasm_put(Dst, 5489, true_label, true_label); +#line 8856 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8858 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //|.code + dasm_put(Dst, 373); +#line 8863 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (op1_info & (MAY_BE_ANY - (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //|.cold_code + dasm_put(Dst, 276); +#line 8868 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 8869 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 8872 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 8874 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_is_true, r0 + if (MAY_USE_32BIT_ADDR(zend_is_true)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_is_true)); + } else { + if (IS_SIGNED_32BIT(zend_is_true)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_is_true)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_is_true)), (unsigned int)((((ptrdiff_t)zend_is_true))>>32)); + } + dasm_put(Dst, 66); + } +#line 8875 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var); + + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| IF_NOT_ZVAL_REFCOUNTED op1_addr, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5520, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); +#line 8882 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 8884 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF FCARG1a + //| jnz >3 + //| mov aword T1, r0 // save + //| ZVAL_DTOR_FUNC op1_info, opline + dasm_put(Dst, 5534, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); +#line 8888 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, aword T1 // restore + //|3: + dasm_put(Dst, 5553); +#line 8890 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (may_throw) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r1 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } +#line 8893 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->exception_handler_undef + dasm_put(Dst, 5560, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 8894 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (set_bool) { + if (set_bool_not) { + //| neg eax + //| add eax, 3 + dasm_put(Dst, 5403); +#line 8900 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| add eax, 2 + dasm_put(Dst, 4731); +#line 8902 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_TYPE_INFO res_addr, eax + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 8904 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + //| CMP_ZVAL_TYPE res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5382, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type), IS_FALSE); +#line 8906 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 8908 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 8910 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (true_label != (uint32_t)-1 || false_label != (uint32_t)-1) { + //| CMP_ZVAL_TYPE res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5382, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type), IS_FALSE); +#line 8913 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (true_label != (uint32_t)-1) { + //| jne =>true_label + dasm_put(Dst, 1908, true_label); +#line 8915 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (false_label != (uint32_t)-1) { + //| jmp =>false_label + dasm_put(Dst, 1614, false_label); +#line 8917 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8919 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| je =>false_label + dasm_put(Dst, 4700, false_label); +#line 8922 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 8927 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| test r0, r0 + dasm_put(Dst, 3655); +#line 8930 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (branch_opcode == ZEND_JMPNZ || branch_opcode == ZEND_JMPNZ_EX) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 8933 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8935 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 8938 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8940 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (true_label != (uint32_t)-1) { + //| jne =>true_label + dasm_put(Dst, 1908, true_label); +#line 8944 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (false_label != (uint32_t)-1) { + //| jmp =>false_label + dasm_put(Dst, 1614, false_label); +#line 8946 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8948 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| je =>false_label + dasm_put(Dst, 4700, false_label); +#line 8951 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 8953 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG)) { + //|.code + dasm_put(Dst, 373); +#line 8958 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + //|9: + dasm_put(Dst, 4230); +#line 8963 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_qm_assign(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr op1_def_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr) +{ + if (op1_addr != op1_def_addr) { + if (!zend_jit_update_regs(Dst, opline->op1.var, op1_addr, op1_def_addr, op1_info)) { + return 0; + } + if (Z_MODE(op1_def_addr) == IS_REG && Z_MODE(op1_addr) != IS_REG) { + op1_addr = op1_def_addr; + } + } + + if (!zend_jit_simple_assign(Dst, opline, res_addr, res_use_info, res_info, opline->op1_type, op1_addr, op1_info, 0, 0, 0, 1)) { + return 0; + } + if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) { + return 0; + } + if (op1_info & MAY_BE_UNDEF) { + zend_jit_check_exception(Dst); + } + return 1; +} + +static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_use_addr, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, zend_jit_addr op2_addr, zend_jit_addr op2_def_addr, uint32_t res_info, zend_jit_addr res_addr, int may_throw) +{ + ZEND_ASSERT(opline->op1_type == IS_CV); + + if (op2_addr != op2_def_addr) { + if (!zend_jit_update_regs(Dst, opline->op2.var, op2_addr, op2_def_addr, op2_info)) { + return 0; + } + if (Z_MODE(op2_def_addr) == IS_REG && Z_MODE(op2_addr) != IS_REG) { + op2_addr = op2_def_addr; + } + } + + if (Z_MODE(op1_addr) != IS_REG + && Z_MODE(op1_use_addr) == IS_REG + && !Z_LOAD(op1_use_addr) + && !Z_STORE(op1_use_addr)) { + /* Force type update */ + op1_info |= MAY_BE_UNDEF; + } + if (!zend_jit_assign_to_variable(Dst, opline, op1_use_addr, op1_addr, op1_info, op1_def_info, opline->op2_type, op2_addr, op2_info, res_addr, + may_throw)) { + return 0; + } + if (!zend_jit_store_var_if_necessary_ex(Dst, opline->op1.var, op1_addr, op1_def_info, op1_use_addr, op1_info)) { + return 0; + } + if (opline->result_type != IS_UNUSED) { + if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) { + return 0; + } + } + + return 1; +} + +/* copy of hidden zend_closure */ +typedef struct _zend_closure { + zend_object std; + zend_function func; + zval this_ptr; + zend_class_entry *called_scope; + zif_handler orig_internal_handler; +} zend_closure; + +static int zend_jit_stack_check(dasm_State **Dst, const zend_op *opline, uint32_t used_stack) +{ + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //| // Check Stack Overflow + //| MEM_LOAD_ZTS r1, aword, executor_globals, vm_stack_end, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 9046 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| MEM_LOAD_OP_ZTS sub, r1, aword, executor_globals, vm_stack_top, r0 + dasm_put(Dst, 5570, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_end))); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 9047 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp r1, used_stack + //| jb &exit_addr + dasm_put(Dst, 5576, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_top)), used_stack, (ptrdiff_t)(exit_addr)); +#line 9049 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_push_call_frame(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_function *func, bool is_closure, bool delayed_fetch_this, int checked_stack) +{ + uint32_t used_stack; + bool stack_check = 1; + + if (func) { + used_stack = zend_vm_calc_used_stack(opline->extended_value, func); + if ((int)used_stack <= checked_stack) { + stack_check = 0; + } + } else { + used_stack = (ZEND_CALL_FRAME_SLOT + opline->extended_value + ZEND_OBSERVER_ENABLED) * sizeof(zval); + + //| // if (EXPECTED(ZEND_USER_CODE(func->type))) { + if (!is_closure) { + //| test byte [r0 + offsetof(zend_function, type)], 1 + //| mov FCARG1a, used_stack + //| jnz >1 + dasm_put(Dst, 5589, offsetof(zend_function, type), used_stack); +#line 9071 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG1a, used_stack + dasm_put(Dst, 798, used_stack); +#line 9073 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // used_stack += (func->op_array.last_var + func->op_array.T - MIN(func->op_array.num_args, num_args)) * sizeof(zval); + //| mov edx, opline->extended_value + dasm_put(Dst, 5603, opline->extended_value); +#line 9076 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!is_closure) { + //| cmp edx, dword [r0 + offsetof(zend_function, op_array.num_args)] + //| cmova edx, dword [r0 + offsetof(zend_function, op_array.num_args)] + //| sub edx, dword [r0 + offsetof(zend_function, op_array.last_var)] + //| sub edx, dword [r0 + offsetof(zend_function, op_array.T)] + dasm_put(Dst, 5606, offsetof(zend_function, op_array.num_args), offsetof(zend_function, op_array.num_args), offsetof(zend_function, op_array.last_var), offsetof(zend_function, op_array.T)); +#line 9081 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| cmp edx, dword [r0 + offsetof(zend_closure, func.op_array.num_args)] + //| cmova edx, dword [r0 + offsetof(zend_closure, func.op_array.num_args)] + //| sub edx, dword [r0 + offsetof(zend_closure, func.op_array.last_var)] + //| sub edx, dword [r0 + offsetof(zend_closure, func.op_array.T)] + dasm_put(Dst, 5606, offsetof(zend_closure, func.op_array.num_args), offsetof(zend_closure, func.op_array.num_args), offsetof(zend_closure, func.op_array.last_var), offsetof(zend_closure, func.op_array.T)); +#line 9086 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| shl edx, 4 + //|.if X64 + //| movsxd r2, edx + //|.endif + //| sub FCARG1a, r2 + //|1: + dasm_put(Dst, 5620); +#line 9093 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + zend_jit_start_reuse_ip(); + + //| // if (UNEXPECTED(used_stack > (size_t)(((char*)EG(vm_stack_end)) - (char*)call))) { + //| MEM_LOAD_ZTS RX, aword, executor_globals, vm_stack_top, RX + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 512, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 518, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 530, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_top))); +#line 9099 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (stack_check) { + //| // Check Stack Overflow + //| MEM_LOAD_ZTS r2, aword, executor_globals, vm_stack_end, r2 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5632, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5638, tsrm_tls_index, tsrm_tls_offset); + } +#line 9103 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| sub r2, RX + dasm_put(Dst, 5655, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_end))); +#line 9104 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (func) { + //| cmp r2, used_stack + dasm_put(Dst, 5664, used_stack); +#line 9106 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| cmp r2, FCARG1a + dasm_put(Dst, 5670); +#line 9108 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //| jb &exit_addr + dasm_put(Dst, 4782, (ptrdiff_t)(exit_addr)); +#line 9119 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jb >1 + //| // EG(vm_stack_top) = (zval*)((char*)call + used_stack); + //|.cold_code + dasm_put(Dst, 5675); +#line 9123 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9124 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (func) { + //| mov FCARG1d, used_stack + dasm_put(Dst, 2338, used_stack); +#line 9126 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#ifdef _WIN32 + if (0) { +#else + if (opline->opcode == ZEND_INIT_FCALL && func && func->type == ZEND_INTERNAL_FUNCTION) { +#endif + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 9133 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_int_extend_stack_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_int_extend_stack_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_int_extend_stack_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_int_extend_stack_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_int_extend_stack_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_int_extend_stack_helper)), (unsigned int)((((ptrdiff_t)zend_jit_int_extend_stack_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9134 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (!is_closure) { + if (func + && op_array == &func->op_array + && (func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) + && (sizeof(void*) != 8 || IS_SIGNED_32BIT(func))) { + //| LOAD_ADDR FCARG2a, func + if (IS_SIGNED_32BIT(func)) { + dasm_put(Dst, 751, ((ptrdiff_t)func)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32)); + } +#line 9141 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG2a, r0 + dasm_put(Dst, 3454); +#line 9143 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| lea FCARG2a, aword [r0 + offsetof(zend_closure, func)] + dasm_put(Dst, 5681, offsetof(zend_closure, func)); +#line 9146 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 9148 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_extend_stack_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_extend_stack_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_extend_stack_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_extend_stack_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_extend_stack_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_extend_stack_helper)), (unsigned int)((((ptrdiff_t)zend_jit_extend_stack_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9149 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov RX, r0 + //| jmp >1 + //|.code + dasm_put(Dst, 5686); +#line 9153 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (func) { + //| MEM_UPDATE_ZTS add, aword, executor_globals, vm_stack_top, used_stack, r2 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5632, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5638, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 5695, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_top)), used_stack); +#line 9158 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| MEM_UPDATE_ZTS add, aword, executor_globals, vm_stack_top, FCARG1a, r2 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5632, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5638, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 5701, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_top))); +#line 9160 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // zend_vm_init_call_frame(call, call_info, func, num_args, called_scope, object); + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || opline->opcode != ZEND_INIT_METHOD_CALL) { + //| // ZEND_SET_CALL_INFO(call, 0, call_info); + //| mov dword EX:RX->This.u1.type_info, (IS_UNDEF | ZEND_CALL_NESTED_FUNCTION) + dasm_put(Dst, 5706, Dt1(->This.u1.type_info), (IS_UNDEF | ZEND_CALL_NESTED_FUNCTION)); +#line 9165 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#ifdef _WIN32 + if (0) { +#else + if (opline->opcode == ZEND_INIT_FCALL && func && func->type == ZEND_INTERNAL_FUNCTION) { +#endif + //| // call->func = func; + //|1: + //| ADDR_STORE aword EX:RX->func, func, r1 + dasm_put(Dst, 70); + if (IS_SIGNED_32BIT(func)) { + dasm_put(Dst, 5712, Dt1(->func), ((ptrdiff_t)func)); + } else { + dasm_put(Dst, 5718, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32), Dt1(->func)); + } +#line 9174 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (!is_closure) { + //| // call->func = func; + if (func + && op_array == &func->op_array + && (func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) + && (sizeof(void*) != 8 || IS_SIGNED_32BIT(func))) { + //| ADDR_STORE aword EX:RX->func, func, r1 + if (IS_SIGNED_32BIT(func)) { + dasm_put(Dst, 5712, Dt1(->func), ((ptrdiff_t)func)); + } else { + dasm_put(Dst, 5718, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32), Dt1(->func)); + } +#line 9182 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov aword EX:RX->func, r0 + dasm_put(Dst, 1553, Dt1(->func)); +#line 9184 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| // call->func = &closure->func; + //| lea r1, aword [r0 + offsetof(zend_closure, func)] + //| mov aword EX:RX->func, r1 + dasm_put(Dst, 5727, offsetof(zend_closure, func), Dt1(->func)); +#line 9189 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + dasm_put(Dst, 70); +#line 9191 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + //| // Z_PTR(call->This) = obj; + //| mov r1, aword T1 + //| mov aword EX:RX->This.value.ptr, r1 + dasm_put(Dst, 5736, Dt1(->This.value.ptr)); +#line 9196 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type == IS_UNUSED || delayed_fetch_this) { + //| // call->call_info |= ZEND_CALL_HAS_THIS; + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + //| mov dword EX:RX->This.u1.type_info, ZEND_CALL_HAS_THIS + dasm_put(Dst, 5706, Dt1(->This.u1.type_info), ZEND_CALL_HAS_THIS); +#line 9200 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| or dword EX:RX->This.u1.type_info, ZEND_CALL_HAS_THIS + dasm_put(Dst, 5745, Dt1(->This.u1.type_info), ZEND_CALL_HAS_THIS); +#line 9202 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (opline->op1_type == IS_CV) { + //| // GC_ADDREF(obj); + //| add dword [r1], 1 + dasm_put(Dst, 5751); +#line 9207 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // call->call_info |= ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS; + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + //| mov dword EX:RX->This.u1.type_info, (ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS) + dasm_put(Dst, 5706, Dt1(->This.u1.type_info), (ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS)); +#line 9211 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| or dword EX:RX->This.u1.type_info, (ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS) + dasm_put(Dst, 5745, Dt1(->This.u1.type_info), (ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS)); +#line 9213 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (!is_closure) { + //| // Z_CE(call->This) = called_scope; + //| mov aword EX:RX->This.value.ptr, 0 + dasm_put(Dst, 1540, Dt1(->This.value.ptr)); +#line 9218 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (opline->op2_type == IS_CV) { + //| // GC_ADDREF(closure); + //| add dword [r0], 1 + dasm_put(Dst, 5755); +#line 9222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // object_or_called_scope = closure->called_scope; + //| mov r1, aword [r0 + offsetof(zend_closure, called_scope)] + //| mov aword EX:RX->This.value.ptr, r1 + //| // call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_CLOSURE | + //| // (closure->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE); + //| mov edx, dword [r0 + offsetof(zend_closure, func.common.fn_flags)] + //| and edx, ZEND_ACC_FAKE_CLOSURE + //| or edx, (ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_CLOSURE) + //| // if (Z_TYPE(closure->this_ptr) != IS_UNDEF) { + //| cmp byte [r0 + offsetof(zend_closure, this_ptr.u1.v.type)], IS_UNDEF + //| jz >1 + //| // call_info |= ZEND_CALL_HAS_THIS; + //| or edx, ZEND_CALL_HAS_THIS + //| // object_or_called_scope = Z_OBJ(closure->this_ptr); + //| mov r1, aword [r0 + offsetof(zend_closure, this_ptr.value.ptr)] + //|1: + //| // ZEND_SET_CALL_INFO(call, 0, call_info); + //| or dword EX:RX->This.u1.type_info, edx + //| // Z_PTR(call->This) = object_or_called_scope; + //| mov aword EX:RX->This.value.ptr, r1 + //| cmp aword [r0 + offsetof(zend_closure, func.op_array.run_time_cache__ptr)], 0 + //| jnz >1 + //| lea FCARG1a, aword [r0 + offsetof(zend_closure, func)] + //| EXT_CALL zend_jit_init_func_run_time_cache_helper, r0 + dasm_put(Dst, 5759, offsetof(zend_closure, called_scope), Dt1(->This.value.ptr), offsetof(zend_closure, func.common.fn_flags), ZEND_ACC_FAKE_CLOSURE, (ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_CLOSURE), offsetof(zend_closure, this_ptr.u1.v.type), IS_UNDEF, ZEND_CALL_HAS_THIS, offsetof(zend_closure, this_ptr.value.ptr), Dt1(->This.u1.type_info), Dt1(->This.value.ptr), offsetof(zend_closure, func.op_array.run_time_cache__ptr), offsetof(zend_closure, func)); + if (MAY_USE_32BIT_ADDR(zend_jit_init_func_run_time_cache_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_init_func_run_time_cache_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_init_func_run_time_cache_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_init_func_run_time_cache_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_init_func_run_time_cache_helper)), (unsigned int)((((ptrdiff_t)zend_jit_init_func_run_time_cache_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9247 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9248 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ZEND_CALL_NUM_ARGS(call) = num_args; + //| mov dword EX:RX->This.u2.num_args, opline->extended_value + dasm_put(Dst, 5706, Dt1(->This.u2.num_args), opline->extended_value); +#line 9251 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_init_fcall_guard(dasm_State **Dst, uint32_t level, const zend_function *func, const zend_op *to_opline) +{ + int32_t exit_point; + const void *exit_addr; + + if (func->type == ZEND_INTERNAL_FUNCTION) { +#ifdef ZEND_WIN32 + // TODO: ASLR may cause different addresses in different workers ??? + return 0; +#endif + } else if (func->type == ZEND_USER_FUNCTION) { + if (!zend_accel_in_shm(func->op_array.opcodes)) { + /* op_array and op_array->opcodes are not persistent. We can't link. */ + return 0; + } + } else { + ZEND_UNREACHABLE(); + return 0; + } + + exit_point = zend_jit_trace_get_exit_point(to_opline, ZEND_JIT_EXIT_POLYMORPHISM); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + + //| // call = EX(call); + //| mov r1, EX->call + dasm_put(Dst, 5815, Dt1(->call)); +#line 9282 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + while (level > 0) { + //| mov r1, EX:r1->prev_execute_data + dasm_put(Dst, 1826, Dt1(->prev_execute_data)); +#line 9284 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + level--; + } + + if (func->type == ZEND_USER_FUNCTION && + (!(func->common.fn_flags & ZEND_ACC_IMMUTABLE) || + (func->common.fn_flags & ZEND_ACC_CLOSURE) || + !func->common.function_name)) { + const zend_op *opcodes = func->op_array.opcodes; + + //| mov r1, aword EX:r1->func + //| .if X64 + dasm_put(Dst, 1826, Dt1(->func)); + if (!IS_SIGNED_32BIT(opcodes)) { +#line 9296 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov64 r2, ((ptrdiff_t)opcodes) + //| cmp aword [r1 + offsetof(zend_op_array, opcodes)], r2 + dasm_put(Dst, 5820, (unsigned int)(((ptrdiff_t)opcodes)), (unsigned int)((((ptrdiff_t)opcodes))>>32), offsetof(zend_op_array, opcodes)); + } else { +#line 9299 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [r1 + offsetof(zend_op_array, opcodes)], opcodes + dasm_put(Dst, 5829, offsetof(zend_op_array, opcodes), opcodes); + } +#line 9301 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp aword [r1 + offsetof(zend_op_array, opcodes)], opcodes + //| .endif + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 9305 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| .if X64 + if (!IS_SIGNED_32BIT(func)) { + //| mov64 r2, ((ptrdiff_t)func) + //| cmp aword EX:r1->func, r2 + dasm_put(Dst, 5820, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32), Dt1(->func)); + } else { +#line 9311 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword EX:r1->func, func + dasm_put(Dst, 5829, Dt1(->func), func); + } +#line 9313 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp aword EX:r1->func, func + //| .endif + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 9317 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t b, const zend_op_array *op_array, zend_ssa *ssa, const zend_ssa_op *ssa_op, int call_level, zend_jit_trace_rec *trace, int checked_stack) +{ + zend_func_info *info = ZEND_FUNC_INFO(op_array); + zend_call_info *call_info = NULL; + zend_function *func = NULL; + + if (delayed_call_chain) { + if (!zend_jit_save_call_chain(Dst, delayed_call_level)) { + return 0; + } + } + + if (info) { + call_info = info->callee_info; + while (call_info && call_info->caller_init_opline != opline) { + call_info = call_info->next_callee; + } + if (call_info && call_info->callee_func && !call_info->is_prototype) { + func = call_info->callee_func; + } + } + + if (!func + && trace + && trace->op == ZEND_JIT_TRACE_INIT_CALL) { +#ifdef _WIN32 + /* ASLR */ + if (trace->func->type != ZEND_INTERNAL_FUNCTION) { + func = (zend_function*)trace->func; + } +#else + func = (zend_function*)trace->func; +#endif + } + +#ifdef _WIN32 + if (0) { +#else + if (opline->opcode == ZEND_INIT_FCALL + && func + && func->type == ZEND_INTERNAL_FUNCTION) { +#endif + /* load constant address later */ + } else if (func && op_array == &func->op_array) { + /* recursive call */ + if (!(func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) || + (sizeof(void*) == 8 && !IS_SIGNED_32BIT(func))) { + //| mov r0, EX->func + dasm_put(Dst, 5835, Dt1(->func)); +#line 9370 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| // if (CACHED_PTR(opline->result.num)) + //| mov r2, EX->run_time_cache + //| mov r0, aword [r2 + opline->result.num] + dasm_put(Dst, 5840, Dt1(->run_time_cache), opline->result.num); +#line 9375 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && func + && (func->common.fn_flags & ZEND_ACC_IMMUTABLE) + && opline->opcode != ZEND_INIT_FCALL) { + /* Called func may be changed because of recompilation. See ext/opcache/tests/jit/init_fcall_003.phpt */ + //| .if X64 + if (!IS_SIGNED_32BIT(func)) { + //| mov64 r1, ((ptrdiff_t)func) + //| cmp r0, r1 + dasm_put(Dst, 5849, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32)); + } else { +#line 9385 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp r0, func + dasm_put(Dst, 3659, func); + } +#line 9387 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp r0, func + //| .endif + //| jnz >1 + //|.cold_code + dasm_put(Dst, 272); +#line 9392 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9393 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test r0, r0 + //| jz >1 + dasm_put(Dst, 5857); +#line 9396 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.cold_code + dasm_put(Dst, 276); +#line 9398 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9399 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_INIT_FCALL + && func + && func->type == ZEND_USER_FUNCTION + && (func->op_array.fn_flags & ZEND_ACC_IMMUTABLE)) { + //| LOAD_ADDR FCARG1a, func + if (IS_SIGNED_32BIT(func)) { + dasm_put(Dst, 798, ((ptrdiff_t)func)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32)); + } +#line 9404 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov aword [r2 + opline->result.num], FCARG1a + //| EXT_CALL zend_jit_init_func_run_time_cache_helper, r0 + dasm_put(Dst, 5865, opline->result.num); + if (MAY_USE_32BIT_ADDR(zend_jit_init_func_run_time_cache_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_init_func_run_time_cache_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_init_func_run_time_cache_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_init_func_run_time_cache_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_init_func_run_time_cache_helper)), (unsigned int)((((ptrdiff_t)zend_jit_init_func_run_time_cache_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9406 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >3 + dasm_put(Dst, 3991); +#line 9407 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zval *zv = RT_CONSTANT(opline, opline->op2); + + if (opline->opcode == ZEND_INIT_FCALL) { + //| LOAD_ADDR FCARG1a, Z_STR_P(zv); + if (IS_SIGNED_32BIT(Z_STR_P(zv))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_STR_P(zv))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_STR_P(zv))), (unsigned int)((((ptrdiff_t)Z_STR_P(zv)))>>32)); + } +#line 9412 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| lea FCARG2a, aword [r2 + opline->result.num] + //| EXT_CALL zend_jit_find_func_helper, r0 + dasm_put(Dst, 5870, opline->result.num); + if (MAY_USE_32BIT_ADDR(zend_jit_find_func_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_find_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_find_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_find_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_find_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_find_func_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9414 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + //| LOAD_ADDR FCARG1a, Z_STR_P(zv + 1); + if (IS_SIGNED_32BIT(Z_STR_P(zv + 1))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_STR_P(zv + 1))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_STR_P(zv + 1))), (unsigned int)((((ptrdiff_t)Z_STR_P(zv + 1)))>>32)); + } +#line 9416 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| lea FCARG2a, aword [r2 + opline->result.num] + //| EXT_CALL zend_jit_find_func_helper, r0 + dasm_put(Dst, 5870, opline->result.num); + if (MAY_USE_32BIT_ADDR(zend_jit_find_func_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_find_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_find_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_find_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_find_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_find_func_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9418 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) { + //| LOAD_ADDR FCARG1a, zv; + if (IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 798, ((ptrdiff_t)zv)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)zv)), (unsigned int)((((ptrdiff_t)zv))>>32)); + } +#line 9420 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| lea FCARG2a, aword [r2 + opline->result.num] + //| EXT_CALL zend_jit_find_ns_func_helper, r0 + dasm_put(Dst, 5870, opline->result.num); + if (MAY_USE_32BIT_ADDR(zend_jit_find_ns_func_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_find_ns_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_find_ns_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_find_ns_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_find_ns_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_find_ns_func_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9422 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, + func && (func->common.fn_flags & ZEND_ACC_IMMUTABLE) ? ZEND_JIT_EXIT_INVALIDATE : 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + if (!func || opline->opcode == ZEND_INIT_FCALL) { + //| test r0, r0 + //| jnz >3 + dasm_put(Dst, 5875); +#line 9436 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (func->type == ZEND_USER_FUNCTION + && !(func->common.fn_flags & ZEND_ACC_IMMUTABLE)) { + const zend_op *opcodes = func->op_array.opcodes; + + //| .if X64 + if (!IS_SIGNED_32BIT(opcodes)) { + //| mov64 r1, ((ptrdiff_t)opcodes) + //| cmp aword [r0 + offsetof(zend_op_array, opcodes)], r1 + dasm_put(Dst, 5883, (unsigned int)(((ptrdiff_t)opcodes)), (unsigned int)((((ptrdiff_t)opcodes))>>32), offsetof(zend_op_array, opcodes)); + } else { +#line 9445 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes + dasm_put(Dst, 5892, offsetof(zend_op_array, opcodes), opcodes); + } +#line 9447 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes + //| .endif + //| jz >3 + dasm_put(Dst, 4027); +#line 9451 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| .if X64 + if (!IS_SIGNED_32BIT(func)) { + //| mov64 r1, ((ptrdiff_t)func) + //| cmp r0, r1 + dasm_put(Dst, 5849, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32)); + } else { +#line 9457 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp r0, func + dasm_put(Dst, 3659, func); + } +#line 9459 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp r0, func + //| .endif + //| jz >3 + dasm_put(Dst, 4027); +#line 9463 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 9465 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test r0, r0 + //| jnz >3 + //| // SAVE_OPLINE(); + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 5875); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 9470 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->undefined_function + dasm_put(Dst, 5898); +#line 9471 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|.code + dasm_put(Dst, 373); +#line 9474 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|3: + dasm_put(Dst, 333); +#line 9475 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!zend_jit_push_call_frame(Dst, opline, op_array, func, 0, 0, checked_stack)) { + return 0; + } + + if (zend_jit_needs_call_chain(call_info, b, op_array, ssa, ssa_op, opline, call_level, trace)) { + if (!zend_jit_save_call_chain(Dst, call_level)) { + return 0; + } + } else { + delayed_call_chain = 1; + delayed_call_level = call_level; + } + + return 1; +} + +static int zend_jit_init_method_call(dasm_State **Dst, + const zend_op *opline, + uint32_t b, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + int call_level, + uint32_t op1_info, + zend_jit_addr op1_addr, + zend_class_entry *ce, + bool ce_is_instanceof, + bool on_this, + bool delayed_fetch_this, + zend_class_entry *trace_ce, + zend_jit_trace_rec *trace, + int checked_stack, + bool polymorphic_side_trace) +{ + zend_func_info *info = ZEND_FUNC_INFO(op_array); + zend_call_info *call_info = NULL; + zend_function *func = NULL; + zval *function_name; + + ZEND_ASSERT(opline->op2_type == IS_CONST); + ZEND_ASSERT(op1_info & MAY_BE_OBJECT); + + function_name = RT_CONSTANT(opline, opline->op2); + + if (info) { + call_info = info->callee_info; + while (call_info && call_info->caller_init_opline != opline) { + call_info = call_info->next_callee; + } + if (call_info && call_info->callee_func && !call_info->is_prototype) { + func = call_info->callee_func; + } + } + + if (polymorphic_side_trace) { + /* function is passed in r0 from parent_trace */ + } else { + if (on_this) { + zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); + + //| GET_ZVAL_PTR FCARG1a, this_addr + ZEND_ASSERT(Z_MODE(this_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(this_addr)), Z_OFFSET(this_addr)); +#line 9538 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (op1_info & MAY_BE_REF) { + if (opline->op1_type == IS_CV) { + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 9543 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 9545 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } else { + /* Hack: Convert reference to regular value to simplify JIT code */ + ZEND_ASSERT(Z_REG(op1_addr) == ZREG_FP); + //| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 9550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 9551 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_unref_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_unref_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_unref_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_unref_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_unref_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_unref_helper)), (unsigned int)((((ptrdiff_t)zend_jit_unref_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9552 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9553 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT, (ptrdiff_t)(exit_addr)); +#line 9564 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 9566 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3386, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT); +#line 9567 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9568 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 9570 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 9572 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !delayed_fetch_this) { + //| EXT_CALL zend_jit_invalid_method_call_tmp, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_method_call_tmp)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_method_call_tmp)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_method_call_tmp)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_method_call_tmp)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_method_call_tmp)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_method_call_tmp))>>32)); + } + dasm_put(Dst, 66); + } +#line 9574 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_invalid_method_call, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_method_call)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_method_call)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_method_call)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_method_call)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_method_call)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_method_call))>>32)); + } + dasm_put(Dst, 66); + } +#line 9576 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 5915); +#line 9579 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 9582 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (delayed_call_chain) { + if (!zend_jit_save_call_chain(Dst, delayed_call_level)) { + return 0; + } + } + + //| mov aword T1, FCARG1a // save + dasm_put(Dst, 3959); +#line 9591 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (func) { + //| // fbc = CACHED_PTR(opline->result.num + sizeof(void*)); + //| mov r0, EX->run_time_cache + //| mov r0, aword [r0 + opline->result.num + sizeof(void*)] + //| test r0, r0 + //| jz >1 + dasm_put(Dst, 5921, Dt1(->run_time_cache), opline->result.num + sizeof(void*)); +#line 9598 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| // if (CACHED_PTR(opline->result.num) == obj->ce)) { + //| mov r0, EX->run_time_cache + //| mov r2, aword [r0 + opline->result.num] + //| cmp r2, [FCARG1a + offsetof(zend_object, ce)] + //| jnz >1 + //| // fbc = CACHED_PTR(opline->result.num + sizeof(void*)); + //| mov r0, aword [r0 + opline->result.num + sizeof(void*)] + dasm_put(Dst, 5937, Dt1(->run_time_cache), opline->result.num, offsetof(zend_object, ce), opline->result.num + sizeof(void*)); +#line 9606 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|.cold_code + dasm_put(Dst, 276); +#line 9609 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| LOAD_ADDR FCARG2a, function_name + dasm_put(Dst, 70); + if (IS_SIGNED_32BIT(function_name)) { + dasm_put(Dst, 751, ((ptrdiff_t)function_name)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)function_name)), (unsigned int)((((ptrdiff_t)function_name))>>32)); + } +#line 9611 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| lea CARG3, aword T1 + //|.else + //| lea r0, aword T1 + //| sub r4, 12 + //| push r0 + //|.endif + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 5958); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 9619 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !delayed_fetch_this) { + //| EXT_CALL zend_jit_find_method_tmp_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_find_method_tmp_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_find_method_tmp_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_find_method_tmp_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_find_method_tmp_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_find_method_tmp_helper)), (unsigned int)((((ptrdiff_t)zend_jit_find_method_tmp_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9621 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_find_method_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_find_method_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_find_method_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_find_method_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_find_method_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_find_method_helper)), (unsigned int)((((ptrdiff_t)zend_jit_find_method_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9623 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + //| test r0, r0 + //| jnz >2 + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 5963); +#line 9631 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 9632 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if ((!func || zend_jit_may_be_modified(func, op_array)) + && trace + && trace->op == ZEND_JIT_TRACE_INIT_CALL + && trace->func +#ifdef _WIN32 + && trace->func->type != ZEND_INTERNAL_FUNCTION +#endif + ) { + int32_t exit_point; + const void *exit_addr; + + exit_point = zend_jit_trace_get_exit_point(opline, func ? ZEND_JIT_EXIT_INVALIDATE : ZEND_JIT_EXIT_METHOD_CALL); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + + func = (zend_function*)trace->func; + + if (func->type == ZEND_USER_FUNCTION && + (!(func->common.fn_flags & ZEND_ACC_IMMUTABLE) || + (func->common.fn_flags & ZEND_ACC_CLOSURE) || + !func->common.function_name)) { + const zend_op *opcodes = func->op_array.opcodes; + + //| .if X64 + if (!IS_SIGNED_32BIT(opcodes)) { + //| mov64 r1, ((ptrdiff_t)opcodes) + //| cmp aword [r0 + offsetof(zend_op_array, opcodes)], r1 + dasm_put(Dst, 5883, (unsigned int)(((ptrdiff_t)opcodes)), (unsigned int)((((ptrdiff_t)opcodes))>>32), offsetof(zend_op_array, opcodes)); + } else { +#line 9664 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes + dasm_put(Dst, 5892, offsetof(zend_op_array, opcodes), opcodes); + } +#line 9666 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes + //| .endif + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 9670 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| .if X64 + if (!IS_SIGNED_32BIT(func)) { + //| mov64 r1, ((ptrdiff_t)func) + //| cmp r0, r1 + dasm_put(Dst, 5849, (unsigned int)(((ptrdiff_t)func)), (unsigned int)((((ptrdiff_t)func))>>32)); + } else { +#line 9676 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp r0, func + dasm_put(Dst, 3659, func); + } +#line 9678 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp r0, func + //| .endif + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 9682 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!func) { + //| // if (fbc->common.fn_flags & ZEND_ACC_STATIC) { + //| test dword [r0 + offsetof(zend_function, common.fn_flags)], ZEND_ACC_STATIC + //| jnz >1 + //|.cold_code + dasm_put(Dst, 5976, offsetof(zend_function, common.fn_flags), ZEND_ACC_STATIC); +#line 9690 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9691 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!func || (func->common.fn_flags & ZEND_ACC_STATIC) != 0) { + //| mov FCARG1a, aword T1 // restore + //| mov FCARG2a, r0 + //|.if X64 + //| mov CARG3d, opline->extended_value + //|.else + //| sub r4, 12 + //| push opline->extended_value + //|.endif + dasm_put(Dst, 5987, opline->extended_value); +#line 9702 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !delayed_fetch_this) { + //| EXT_CALL zend_jit_push_static_metod_call_frame_tmp, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_push_static_metod_call_frame_tmp)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_push_static_metod_call_frame_tmp)); + } else { + if (IS_SIGNED_32BIT(zend_jit_push_static_metod_call_frame_tmp)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_push_static_metod_call_frame_tmp)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_push_static_metod_call_frame_tmp)), (unsigned int)((((ptrdiff_t)zend_jit_push_static_metod_call_frame_tmp))>>32)); + } + dasm_put(Dst, 66); + } +#line 9704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_push_static_metod_call_frame, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_push_static_metod_call_frame)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_push_static_metod_call_frame)); + } else { + if (IS_SIGNED_32BIT(zend_jit_push_static_metod_call_frame)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_push_static_metod_call_frame)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_push_static_metod_call_frame)), (unsigned int)((((ptrdiff_t)zend_jit_push_static_metod_call_frame))>>32)); + } + dasm_put(Dst, 66); + } +#line 9706 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR) && !delayed_fetch_this)) { + //| test r0, r0 + //| jz ->exception_handler + dasm_put(Dst, 5997); +#line 9713 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov RX, r0 + dasm_put(Dst, 6005); +#line 9715 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!func) { + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 9720 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!func || (func->common.fn_flags & ZEND_ACC_STATIC) == 0) { + if (!zend_jit_push_call_frame(Dst, opline, NULL, func, 0, delayed_fetch_this, checked_stack)) { + return 0; + } + } + + if (!func) { + //|9: + dasm_put(Dst, 4230); +#line 9730 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + zend_jit_start_reuse_ip(); + + if (zend_jit_needs_call_chain(call_info, b, op_array, ssa, ssa_op, opline, call_level, trace)) { + if (!zend_jit_save_call_chain(Dst, call_level)) { + return 0; + } + } else { + delayed_call_chain = 1; + delayed_call_level = call_level; + } + + return 1; +} + +static int zend_jit_init_closure_call(dasm_State **Dst, + const zend_op *opline, + uint32_t b, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + int call_level, + zend_jit_trace_rec *trace, + int checked_stack) +{ + zend_function *func = NULL; + zend_jit_addr op2_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var); + + //| GET_ZVAL_PTR r0, op2_addr + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 6009, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); +#line 9759 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (ssa->var_info[ssa_op->op2_use].ce != zend_ce_closure + && !(ssa->var_info[ssa_op->op2_use].type & MAY_BE_CLASS_GUARD)) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //|.if X64 + if (!IS_SIGNED_32BIT(zend_ce_closure)) { + //| mov64 FCARG1a, ((ptrdiff_t)zend_ce_closure) + //| cmp aword [r0 + offsetof(zend_object, ce)], FCARG1a + dasm_put(Dst, 6017, (unsigned int)(((ptrdiff_t)zend_ce_closure)), (unsigned int)((((ptrdiff_t)zend_ce_closure))>>32), offsetof(zend_object, ce)); + } else { +#line 9774 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [r0 + offsetof(zend_object, ce)], zend_ce_closure + dasm_put(Dst, 5892, offsetof(zend_object, ce), zend_ce_closure); + } +#line 9776 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| cmp aword [r0 + offsetof(zend_object, ce)], zend_ce_closure + //|.endif + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 9780 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (ssa->var_info && ssa_op->op2_use >= 0) { + ssa->var_info[ssa_op->op2_use].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op2_use].ce = zend_ce_closure; + ssa->var_info[ssa_op->op2_use].is_instanceof = 0; + } + } + + if (trace + && trace->op == ZEND_JIT_TRACE_INIT_CALL + && trace->func + && trace->func->type == ZEND_USER_FUNCTION) { + const zend_op *opcodes; + int32_t exit_point; + const void *exit_addr; + + func = (zend_function*)trace->func; + opcodes = func->op_array.opcodes; + exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_CLOSURE_CALL); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + + //| .if X64 + if (!IS_SIGNED_32BIT(opcodes)) { + //| mov64 FCARG1a, ((ptrdiff_t)opcodes) + //| cmp aword [r0 + offsetof(zend_closure, func.op_array.opcodes)], FCARG1a + dasm_put(Dst, 6017, (unsigned int)(((ptrdiff_t)opcodes)), (unsigned int)((((ptrdiff_t)opcodes))>>32), offsetof(zend_closure, func.op_array.opcodes)); + } else { +#line 9808 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [r0 + offsetof(zend_closure, func.op_array.opcodes)], opcodes + dasm_put(Dst, 5892, offsetof(zend_closure, func.op_array.opcodes), opcodes); + } +#line 9810 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| cmp aword [r0 + offsetof(zend_closure, func.op_array.opcodes)], opcodes + //| .endif + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 9814 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (delayed_call_chain) { + if (!zend_jit_save_call_chain(Dst, delayed_call_level)) { + return 0; + } + } + + if (!zend_jit_push_call_frame(Dst, opline, NULL, func, 1, 0, checked_stack)) { + return 0; + } + + if (zend_jit_needs_call_chain(NULL, b, op_array, ssa, ssa_op, opline, call_level, trace)) { + if (!zend_jit_save_call_chain(Dst, call_level)) { + return 0; + } + } else { + delayed_call_chain = 1; + delayed_call_level = call_level; + } + + if (trace + && trace->op == ZEND_JIT_TRACE_END + && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) { + if (!zend_jit_set_valid_ip(Dst, opline + 1)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, int call_level, unsigned int next_block, zend_jit_trace_rec *trace) +{ + zend_func_info *info = ZEND_FUNC_INFO(op_array); + zend_call_info *call_info = NULL; + const zend_function *func = NULL; + uint32_t i; + zend_jit_addr res_addr; + uint32_t call_num_args = 0; + bool unknown_num_args = 0; + const void *exit_addr = NULL; + const zend_op *prev_opline; + + if (RETURN_VALUE_USED(opline)) { + res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + } else { + /* CPU stack allocated temporary zval */ + res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R4, TMP_ZVAL_OFFSET); + } + + prev_opline = opline - 1; + while (prev_opline->opcode == ZEND_EXT_FCALL_BEGIN || prev_opline->opcode == ZEND_TICKS) { + prev_opline--; + } + if (prev_opline->opcode == ZEND_SEND_UNPACK || prev_opline->opcode == ZEND_SEND_ARRAY || + prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS) { + unknown_num_args = 1; + } + + if (info) { + call_info = info->callee_info; + while (call_info && call_info->caller_call_opline != opline) { + call_info = call_info->next_callee; + } + if (call_info && call_info->callee_func && !call_info->is_prototype) { + func = call_info->callee_func; + } + if ((op_array->fn_flags & ZEND_ACC_TRAIT_CLONE) + && JIT_G(current_frame) + && JIT_G(current_frame)->call + && !JIT_G(current_frame)->call->func) { + call_info = NULL; func = NULL; /* megamorphic call from trait */ + } + } + if (!func) { + /* resolve function at run time */ + } else if (func->type == ZEND_USER_FUNCTION) { + ZEND_ASSERT(opline->opcode != ZEND_DO_ICALL); + call_num_args = call_info->num_args; + } else if (func->type == ZEND_INTERNAL_FUNCTION) { + ZEND_ASSERT(opline->opcode != ZEND_DO_UCALL); + call_num_args = call_info->num_args; + } else { + ZEND_UNREACHABLE(); + } + + if (trace && !func) { + if (trace->op == ZEND_JIT_TRACE_DO_ICALL) { + ZEND_ASSERT(trace->func->type == ZEND_INTERNAL_FUNCTION); +#ifndef ZEND_WIN32 + // TODO: ASLR may cause different addresses in different workers ??? + func = trace->func; + if (JIT_G(current_frame) && + JIT_G(current_frame)->call && + TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)->call) >= 0) { + call_num_args = TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)->call); + } else { + unknown_num_args = 1; + } +#endif + } else if (trace->op == ZEND_JIT_TRACE_ENTER) { + ZEND_ASSERT(trace->func->type == ZEND_USER_FUNCTION); + if (zend_accel_in_shm(trace->func->op_array.opcodes)) { + func = trace->func; + if (JIT_G(current_frame) && + JIT_G(current_frame)->call && + TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)->call) >= 0) { + call_num_args = TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)->call); + } else { + unknown_num_args = 1; + } + } + } + } + + bool may_have_extra_named_params = + opline->extended_value == ZEND_FCALL_MAY_HAVE_EXTRA_NAMED_PARAMS && + (!func || func->common.fn_flags & ZEND_ACC_VARIADIC); + + if (!reuse_ip) { + zend_jit_start_reuse_ip(); + //| // call = EX(call); + //| mov RX, EX->call + dasm_put(Dst, 0, Dt1(->call)); +#line 9938 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + zend_jit_stop_reuse_ip(); + + //| // fbc = call->func; + //| // mov r2, EX:RX->func ??? + //| // SAVE_OPLINE(); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 9945 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (opline->opcode == ZEND_DO_FCALL) { + if (!func) { + if (trace) { + uint32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| mov r0, EX:RX->func + //| test dword [r0 + offsetof(zend_op_array, fn_flags)], ZEND_ACC_DEPRECATED + //| jnz &exit_addr + dasm_put(Dst, 6026, Dt1(->func), offsetof(zend_op_array, fn_flags), ZEND_ACC_DEPRECATED, (ptrdiff_t)(exit_addr)); +#line 9958 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if (!delayed_call_chain) { + if (call_level == 1) { + //| mov aword EX->call, 0 + dasm_put(Dst, 6039, Dt1(->call)); +#line 9965 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| //EX(call) = call->prev_execute_data; + //| mov r0, EX:RX->prev_execute_data + //| mov EX->call, r0 + dasm_put(Dst, 6048, Dt1(->prev_execute_data), Dt1(->call)); +#line 9969 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + delayed_call_chain = 0; + + //| //call->prev_execute_data = execute_data; + //| mov EX:RX->prev_execute_data, EX + dasm_put(Dst, 6057, Dt1(->prev_execute_data)); +#line 9975 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (!func) { + //| mov r0, EX:RX->func + dasm_put(Dst, 6062, Dt1(->func)); +#line 9978 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (opline->opcode == ZEND_DO_FCALL) { + if (!func) { + if (!trace) { + //| test dword [r0 + offsetof(zend_op_array, fn_flags)], ZEND_ACC_DEPRECATED + //| jnz >1 + //|.cold_code + dasm_put(Dst, 5976, offsetof(zend_op_array, fn_flags), ZEND_ACC_DEPRECATED); +#line 9986 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9987 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, RX + dasm_put(Dst, 558); +#line 9989 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_deprecated_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_deprecated_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_deprecated_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_deprecated_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_deprecated_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_deprecated_helper)), (unsigned int)((((ptrdiff_t)zend_jit_deprecated_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 9991 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test al, al + //| mov r0, EX:RX->func // reload + //| jne >1 + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 6067, Dt1(->func)); +#line 9996 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 9997 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (func->common.fn_flags & ZEND_ACC_DEPRECATED) { + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, RX + dasm_put(Dst, 558); +#line 10001 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_deprecated_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_deprecated_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_deprecated_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_deprecated_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_deprecated_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_deprecated_helper)), (unsigned int)((((ptrdiff_t)zend_jit_deprecated_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 10003 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test al, al + //| je ->exception_handler + dasm_put(Dst, 6083); +#line 10005 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!func + && opline->opcode != ZEND_DO_UCALL + && opline->opcode != ZEND_DO_ICALL) { + //| cmp byte [r0 + offsetof(zend_function, type)], ZEND_USER_FUNCTION + //| jne >8 + dasm_put(Dst, 3722, offsetof(zend_function, type), ZEND_USER_FUNCTION); +#line 10013 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if ((!func || func->type == ZEND_USER_FUNCTION) + && opline->opcode != ZEND_DO_ICALL) { + //| // EX(call) = NULL; + //| mov aword EX:RX->call, 0 + dasm_put(Dst, 1540, Dt1(->call)); +#line 10019 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (RETURN_VALUE_USED(opline)) { + //| // EX(return_value) = EX_VAR(opline->result.var); + //| LOAD_ZVAL_ADDR r2, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10023 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov aword EX:RX->return_value, r2 + dasm_put(Dst, 6090, Dt1(->return_value)); +#line 10024 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| // EX(return_value) = 0; + //| mov aword EX:RX->return_value, 0 + dasm_put(Dst, 1540, Dt1(->return_value)); +#line 10027 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //EX_LOAD_RUN_TIME_CACHE(op_array); + if (!func || func->op_array.cache_size) { + if (func && op_array == &func->op_array) { + /* recursive call */ + if (trace || func->op_array.cache_size > sizeof(void*)) { + //| mov r2, EX->run_time_cache + //| mov EX:RX->run_time_cache, r2 + dasm_put(Dst, 6095, Dt1(->run_time_cache), Dt1(->run_time_cache)); +#line 10036 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (func + && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE) + && ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { + //| MEM_LOAD_ZTS r2, aword, compiler_globals, map_ptr_base, r1 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } +#line 10042 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r2, aword [r2 + (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache)] + dasm_put(Dst, 6104, (compiler_globals_offset+offsetof(zend_compiler_globals, map_ptr_base)), (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache)); +#line 10043 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((func && (func->op_array.fn_flags & ZEND_ACC_CLOSURE)) || + (JIT_G(current_frame) && + JIT_G(current_frame)->call && + TRACE_FRAME_IS_CLOSURE_CALL(JIT_G(current_frame)->call))) { + /* Closures always use direct pointers */ + //| mov r0, EX:RX->func + //| mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] + dasm_put(Dst, 6113, Dt1(->func), offsetof(zend_op_array, run_time_cache__ptr)); +#line 10050 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (func) { + //| mov r0, EX:RX->func + dasm_put(Dst, 6062, Dt1(->func)); +#line 10053 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] + //| test r2, 1 + //| jz >1 + //| MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 + dasm_put(Dst, 6122, offsetof(zend_op_array, run_time_cache__ptr)); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } +#line 10058 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r2, aword [r2] + //|1: + dasm_put(Dst, 6140, (compiler_globals_offset+offsetof(zend_compiler_globals, map_ptr_base))); +#line 10060 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov EX:RX->run_time_cache, r2 + dasm_put(Dst, 6090, Dt1(->run_time_cache)); +#line 10062 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //| // EG(current_execute_data) = execute_data; + //| MEM_STORE_ZTS aword, executor_globals, current_execute_data, RX, r1 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } +#line 10067 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FP, RX + dasm_put(Dst, 6150, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); +#line 10068 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| // opline = op_array->opcodes; + if (func && !unknown_num_args) { + + for (i = call_num_args; i < func->op_array.last_var; i++) { + uint32_t n = EX_NUM_TO_VAR(i); + //| SET_Z_TYPE_INFO RX + n, IS_UNDEF + dasm_put(Dst, 5706, n+offsetof(zval,u1.type_info), IS_UNDEF); +#line 10075 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (call_num_args <= func->op_array.num_args) { + if (!trace || (trace->op == ZEND_JIT_TRACE_END + && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER)) { + uint32_t num_args; + + if ((func->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0) { + if (trace) { + num_args = 0; + } else if (call_info) { + num_args = skip_valid_arguments(op_array, ssa, call_info); + } else { + num_args = call_num_args; + } + } else { + num_args = call_num_args; + } + if (zend_accel_in_shm(func->op_array.opcodes)) { + //| LOAD_IP_ADDR (func->op_array.opcodes + num_args) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((func->op_array.opcodes + num_args))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(func->op_array.opcodes + num_args))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(func->op_array.opcodes + num_args))), (unsigned int)((((ptrdiff_t)(func->op_array.opcodes + num_args)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((func->op_array.opcodes + num_args))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(func->op_array.opcodes + num_args))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(func->op_array.opcodes + num_args))), (unsigned int)((((ptrdiff_t)(func->op_array.opcodes + num_args)))>>32), Dt1(->opline)); + } + } +#line 10095 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov r0, EX->func + dasm_put(Dst, 5835, Dt1(->func)); +#line 10097 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (GCC_GLOBAL_REGS) { + //| mov IP, aword [r0 + offsetof(zend_op_array, opcodes)] + dasm_put(Dst, 6159, offsetof(zend_op_array, opcodes)); +#line 10099 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (num_args) { + //| add IP, (num_args * sizeof(zend_op)) + dasm_put(Dst, 1558, (num_args * sizeof(zend_op))); +#line 10101 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| mov FCARG1a, aword [r0 + offsetof(zend_op_array, opcodes)] + dasm_put(Dst, 6164, offsetof(zend_op_array, opcodes)); +#line 10104 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (num_args) { + //| add FCARG1a, (num_args * sizeof(zend_op)) + dasm_put(Dst, 6169, (num_args * sizeof(zend_op))); +#line 10106 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov aword EX->opline, FCARG1a + dasm_put(Dst, 6174, Dt1(->opline)); +#line 10108 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (GCC_GLOBAL_REGS && !trace && op_array == &func->op_array + && num_args >= op_array->required_num_args) { + /* recursive call */ + if (ZEND_OBSERVER_ENABLED) { + //| SAVE_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 10116 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, FP + //| EXT_CALL zend_observer_fcall_begin, r0 + dasm_put(Dst, 73); + if (MAY_USE_32BIT_ADDR(zend_observer_fcall_begin)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_observer_fcall_begin)); + } else { + if (IS_SIGNED_32BIT(zend_observer_fcall_begin)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_observer_fcall_begin)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_observer_fcall_begin)), (unsigned int)((((ptrdiff_t)zend_observer_fcall_begin))>>32)); + } + dasm_put(Dst, 66); + } +#line 10118 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#ifdef CONTEXT_THREADED_JIT + //| call >1 + //|.cold_code + dasm_put(Dst, 6179); +#line 10122 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| pop r0 + //| jmp =>num_args + //|.code + dasm_put(Dst, 6184, num_args); +#line 10126 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + //| jmp =>num_args + dasm_put(Dst, 1614, num_args); +#line 10128 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#endif + return 1; + } + } + } else { + if (!trace || (trace->op == ZEND_JIT_TRACE_END + && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER)) { + if (func && zend_accel_in_shm(func->op_array.opcodes)) { + //| LOAD_IP_ADDR (func->op_array.opcodes) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((func->op_array.opcodes))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(func->op_array.opcodes))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(func->op_array.opcodes))), (unsigned int)((((ptrdiff_t)(func->op_array.opcodes)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((func->op_array.opcodes))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(func->op_array.opcodes))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(func->op_array.opcodes))), (unsigned int)((((ptrdiff_t)(func->op_array.opcodes)))>>32), Dt1(->opline)); + } + } +#line 10137 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| mov IP, aword [r0 + offsetof(zend_op_array, opcodes)] + dasm_put(Dst, 6159, offsetof(zend_op_array, opcodes)); +#line 10139 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG1a, aword [r0 + offsetof(zend_op_array, opcodes)] + //| mov aword EX->opline, FCARG1a + dasm_put(Dst, 6192, offsetof(zend_op_array, opcodes), Dt1(->opline)); +#line 10142 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, FP + dasm_put(Dst, 73); +#line 10146 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_copy_extra_args_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_copy_extra_args_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_copy_extra_args_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_copy_extra_args_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_copy_extra_args_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_copy_extra_args_helper)), (unsigned int)((((ptrdiff_t)zend_jit_copy_extra_args_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 10148 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| // opline = op_array->opcodes + if (func && zend_accel_in_shm(func->op_array.opcodes)) { + //| LOAD_IP_ADDR (func->op_array.opcodes) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((func->op_array.opcodes))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(func->op_array.opcodes))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(func->op_array.opcodes))), (unsigned int)((((ptrdiff_t)(func->op_array.opcodes)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((func->op_array.opcodes))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(func->op_array.opcodes))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(func->op_array.opcodes))), (unsigned int)((((ptrdiff_t)(func->op_array.opcodes)))>>32), Dt1(->opline)); + } + } +#line 10153 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| mov IP, aword [r0 + offsetof(zend_op_array, opcodes)] + dasm_put(Dst, 6159, offsetof(zend_op_array, opcodes)); +#line 10155 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG1a, aword [r0 + offsetof(zend_op_array, opcodes)] + //| mov aword EX->opline, FCARG1a + dasm_put(Dst, 6192, offsetof(zend_op_array, opcodes), Dt1(->opline)); +#line 10158 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (func) { + //| // num_args = EX_NUM_ARGS(); + //| mov ecx, dword [FP + offsetof(zend_execute_data, This.u2.num_args)] + //| // if (UNEXPECTED(num_args > first_extra_arg)) + //| cmp ecx, (func->op_array.num_args) + dasm_put(Dst, 6201, offsetof(zend_execute_data, This.u2.num_args), (func->op_array.num_args)); +#line 10164 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| // first_extra_arg = op_array->num_args; + //| mov edx, dword [r0 + offsetof(zend_op_array, num_args)] + //| // num_args = EX_NUM_ARGS(); + //| mov ecx, dword [FP + offsetof(zend_execute_data, This.u2.num_args)] + //| // if (UNEXPECTED(num_args > first_extra_arg)) + //| cmp ecx, edx + dasm_put(Dst, 6210, offsetof(zend_op_array, num_args), offsetof(zend_execute_data, This.u2.num_args)); +#line 10171 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jg >1 + //|.cold_code + dasm_put(Dst, 6220); +#line 10174 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10175 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, FP + dasm_put(Dst, 73); +#line 10177 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_copy_extra_args_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_copy_extra_args_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_copy_extra_args_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_copy_extra_args_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_copy_extra_args_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_copy_extra_args_helper)), (unsigned int)((((ptrdiff_t)zend_jit_copy_extra_args_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 10179 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!func) { + //| mov r0, EX->func // reload + dasm_put(Dst, 5835, Dt1(->func)); +#line 10181 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov ecx, dword [FP + offsetof(zend_execute_data, This.u2.num_args)] // reload + //| jmp >1 + //|.code + dasm_put(Dst, 6226, offsetof(zend_execute_data, This.u2.num_args)); +#line 10185 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!func || (func->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0) { + if (!func) { + //| // if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) + //| test dword [r0 + offsetof(zend_op_array, fn_flags)], ZEND_ACC_HAS_TYPE_HINTS + //| jnz >1 + dasm_put(Dst, 6236, offsetof(zend_op_array, fn_flags), ZEND_ACC_HAS_TYPE_HINTS); +#line 10190 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // opline += num_args; + //|.if X64 + ZEND_ASSERT(sizeof(zend_op) == 32); + //| mov edx, ecx + //| shl r2, 5 + //|.else + //| imul r2, ecx, sizeof(zend_op) + //|.endif + //| ADD_IP r2 + dasm_put(Dst, 6246); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 6253); + } else { + dasm_put(Dst, 6257, Dt1(->opline)); + } +#line 10200 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + //| // if (EXPECTED((int)num_args < op_array->last_var)) { + dasm_put(Dst, 70); +#line 10203 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (func) { + //| mov edx, (func->op_array.last_var) + dasm_put(Dst, 5603, (func->op_array.last_var)); +#line 10205 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov edx, dword [r0 + offsetof(zend_op_array, last_var)] + dasm_put(Dst, 6118, offsetof(zend_op_array, last_var)); +#line 10207 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| sub edx, ecx + //| jle >3 //??? + //| // zval *var = EX_VAR_NUM(num_args); + dasm_put(Dst, 6262); +#line 10211 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +// |.if X64 +// | movsxd r1, ecx +// |.endif + //| shl r1, 4 + //| lea r1, [FP + r1 + (ZEND_CALL_FRAME_SLOT * sizeof(zval))] + //|2: + //| SET_Z_TYPE_INFO r1, IS_UNDEF + //| sub edx, 1 + //| lea r1, [r1 + 16] + //| jne <2 + //|3: + dasm_put(Dst, 6269, (ZEND_CALL_FRAME_SLOT * sizeof(zval)), offsetof(zval,u1.type_info), IS_UNDEF, 16); +#line 10222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (ZEND_OBSERVER_ENABLED) { + if (trace && (trace->op != ZEND_JIT_TRACE_END || trace->stop != ZEND_JIT_TRACE_STOP_INTERPRETER)) { + ZEND_ASSERT(trace[1].op == ZEND_JIT_TRACE_VM || trace[1].op == ZEND_JIT_TRACE_END); + //| SET_EX_OPLINE trace[1].opline, r0 + if (trace[1].opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(trace[1].opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)trace[1].opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)trace[1].opline)), (unsigned int)((((ptrdiff_t)trace[1].opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 10228 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SAVE_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } +#line 10230 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG1a, FP + //| EXT_CALL zend_observer_fcall_begin, r0 + dasm_put(Dst, 73); + if (MAY_USE_32BIT_ADDR(zend_observer_fcall_begin)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_observer_fcall_begin)); + } else { + if (IS_SIGNED_32BIT(zend_observer_fcall_begin)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_observer_fcall_begin)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_observer_fcall_begin)), (unsigned int)((((ptrdiff_t)zend_observer_fcall_begin))>>32)); + } + dasm_put(Dst, 66); + } +#line 10233 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (trace) { + if (!func && (opline->opcode != ZEND_DO_UCALL)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 10238 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { +#ifdef CONTEXT_THREADED_JIT + //| call ->context_threaded_call + dasm_put(Dst, 1912); +#line 10242 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!func && (opline->opcode != ZEND_DO_UCALL)) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 10244 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| call ->context_threaded_call + dasm_put(Dst, 1912); +#line 10246 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!func) { + //| jmp >9 + dasm_put(Dst, 3717); +#line 10248 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } +#else + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 10252 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 10253 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + //| JMP_IP + dasm_put(Dst, 115); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 10256 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, 1 // ZEND_VM_ENTER + //| ret + dasm_put(Dst, 120); +#line 10262 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } +#endif + } + + if ((!func || func->type == ZEND_INTERNAL_FUNCTION) + && (opline->opcode != ZEND_DO_UCALL)) { + if (!func && (opline->opcode != ZEND_DO_ICALL)) { + //|8: + dasm_put(Dst, 4331); +#line 10271 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (!func) { + if (trace) { + uint32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| test dword [r0 + offsetof(zend_op_array, fn_flags)], ZEND_ACC_DEPRECATED + //| jnz &exit_addr + dasm_put(Dst, 6030, offsetof(zend_op_array, fn_flags), ZEND_ACC_DEPRECATED, (ptrdiff_t)(exit_addr)); +#line 10283 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test dword [r0 + offsetof(zend_op_array, fn_flags)], ZEND_ACC_DEPRECATED + //| jnz >1 + //|.cold_code + dasm_put(Dst, 5976, offsetof(zend_op_array, fn_flags), ZEND_ACC_DEPRECATED); +#line 10287 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10288 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, RX + dasm_put(Dst, 558); +#line 10290 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_deprecated_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_deprecated_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_deprecated_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_deprecated_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_deprecated_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_deprecated_helper)), (unsigned int)((((ptrdiff_t)zend_jit_deprecated_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 10292 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test al, al + //| mov r0, EX:RX->func // reload + //| jne >1 + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 6067, Dt1(->func)); +#line 10297 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10298 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (func->common.fn_flags & ZEND_ACC_DEPRECATED) { + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, RX + dasm_put(Dst, 558); +#line 10302 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_deprecated_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_deprecated_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_deprecated_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_deprecated_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_deprecated_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_deprecated_helper)), (unsigned int)((((ptrdiff_t)zend_jit_deprecated_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 10304 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test al, al + //| je ->exception_handler + //| mov r0, EX:RX->func // reload + dasm_put(Dst, 6300, Dt1(->func)); +#line 10307 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //| // EG(current_execute_data) = execute_data; + //| MEM_STORE_ZTS aword, executor_globals, current_execute_data, RX, r1 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 6311, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); +#line 10312 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (ZEND_OBSERVER_ENABLED) { + //| mov FCARG1a, RX + //| EXT_CALL zend_observer_fcall_begin, r0 + dasm_put(Dst, 558); + if (MAY_USE_32BIT_ADDR(zend_observer_fcall_begin)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_observer_fcall_begin)); + } else { + if (IS_SIGNED_32BIT(zend_observer_fcall_begin)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_observer_fcall_begin)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_observer_fcall_begin)), (unsigned int)((((ptrdiff_t)zend_observer_fcall_begin))>>32)); + } + dasm_put(Dst, 66); + } +#line 10316 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX:RX->func // reload + dasm_put(Dst, 6062, Dt1(->func)); +#line 10317 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //| // ZVAL_NULL(EX_VAR(opline->result.var)); + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10321 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_Z_TYPE_INFO FCARG2a, IS_NULL + dasm_put(Dst, 314, offsetof(zval,u1.type_info), IS_NULL); +#line 10322 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + zend_jit_reset_last_valid_opline(); + + //| // (zend_execute_internal ? zend_execute_internal : fbc->internal_function.handler)(call, ret); + if (zend_execute_internal) { + //|.if X64 + //| // CARG2 and FCARG2a are identical + //| mov CARG1, RX + //|.else + //| mov aword A2, FCARG2a + //| mov aword A1, RX + //|.endif + //| EXT_CALL zend_execute_internal, r0 + dasm_put(Dst, 558); + if (MAY_USE_32BIT_ADDR(zend_execute_internal)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_execute_internal)); + } else { + if (IS_SIGNED_32BIT(zend_execute_internal)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_execute_internal)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_execute_internal)), (unsigned int)((((ptrdiff_t)zend_execute_internal))>>32)); + } + dasm_put(Dst, 66); + } +#line 10335 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG1a, RX + dasm_put(Dst, 558); +#line 10337 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (func) { + //| EXT_CALL func->internal_function.handler, r0 + if (MAY_USE_32BIT_ADDR(func->internal_function.handler)) { + dasm_put(Dst, 53, (ptrdiff_t)(func->internal_function.handler)); + } else { + if (IS_SIGNED_32BIT(func->internal_function.handler)) { + dasm_put(Dst, 56, ((ptrdiff_t)func->internal_function.handler)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)func->internal_function.handler)), (unsigned int)((((ptrdiff_t)func->internal_function.handler))>>32)); + } + dasm_put(Dst, 66); + } +#line 10339 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| call aword [r0 + offsetof(zend_internal_function, handler)] + dasm_put(Dst, 6316, offsetof(zend_internal_function, handler)); +#line 10341 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (ZEND_OBSERVER_ENABLED) { + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10346 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, RX + //| EXT_CALL zend_observer_fcall_end, r0 + dasm_put(Dst, 558); + if (MAY_USE_32BIT_ADDR(zend_observer_fcall_end)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_observer_fcall_end)); + } else { + if (IS_SIGNED_32BIT(zend_observer_fcall_end)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_observer_fcall_end)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_observer_fcall_end)), (unsigned int)((((ptrdiff_t)zend_observer_fcall_end))>>32)); + } + dasm_put(Dst, 66); + } +#line 10348 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //| // EG(current_execute_data) = execute_data; + //| MEM_STORE_ZTS aword, executor_globals, current_execute_data, FP, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 6321, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); +#line 10352 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| // zend_vm_stack_free_args(call); + if (func && !unknown_num_args) { + for (i = 0; i < call_num_args; i++ ) { + if (zend_jit_needs_arg_dtor(func, i, call_info)) { + uint32_t offset = EX_NUM_TO_VAR(i); + //| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset), MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN, 0, 1, opline + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))); + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || RC_MAY_BE_1(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN)) { + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN)) { + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) + && has_concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_RX, offset))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 10359 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + //| mov FCARG1a, RX + //| EXT_CALL zend_jit_vm_stack_free_args_helper, r0 + dasm_put(Dst, 558); + if (MAY_USE_32BIT_ADDR(zend_jit_vm_stack_free_args_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_vm_stack_free_args_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_vm_stack_free_args_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_vm_stack_free_args_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_vm_stack_free_args_helper)), (unsigned int)((((ptrdiff_t)zend_jit_vm_stack_free_args_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 10364 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (may_have_extra_named_params) { + //| test byte [RX + offsetof(zend_execute_data, This.u1.type_info) + 3], (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS >> 24) + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6326, offsetof(zend_execute_data, This.u1.type_info) + 3, (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS >> 24)); +#line 10369 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| mov FCARG1a, aword [RX + offsetof(zend_execute_data, extra_named_params)] + //| EXT_CALL zend_free_extra_named_params, r0 + dasm_put(Dst, 6338, offsetof(zend_execute_data, extra_named_params)); + if (MAY_USE_32BIT_ADDR(zend_free_extra_named_params)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_free_extra_named_params)); + } else { + if (IS_SIGNED_32BIT(zend_free_extra_named_params)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_free_extra_named_params)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_free_extra_named_params)), (unsigned int)((((ptrdiff_t)zend_free_extra_named_params))>>32)); + } + dasm_put(Dst, 66); + } +#line 10372 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >2 + //|.code + dasm_put(Dst, 2938); +#line 10374 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 10375 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|8: + dasm_put(Dst, 4331); +#line 10378 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_DO_FCALL) { + // TODO: optimize ??? + //| // if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) + //| test byte [RX + offsetof(zend_execute_data, This.u1.type_info) + 2], (ZEND_CALL_RELEASE_THIS >> 16) + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6326, offsetof(zend_execute_data, This.u1.type_info) + 2, (ZEND_CALL_RELEASE_THIS >> 16)); +#line 10384 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| GET_Z_PTR FCARG1a, RX + offsetof(zend_execute_data, This) + //| // OBJ_RELEASE(object); + //| OBJ_RELEASE ZREG_FCARG1, >2 + dasm_put(Dst, 6345, offsetof(zend_execute_data, This), (ZREG_FCARG1), 0); + if (ZREG_FCARG1 != ZREG_FCARG1) { + dasm_put(Dst, 2349, (ZREG_FCARG1)); + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + dasm_put(Dst, 6364, (ZREG_FCARG1), (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (ZREG_FCARG1 != ZREG_FCARG1) { + dasm_put(Dst, 2349, (ZREG_FCARG1)); + } + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } +#line 10388 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >2 + //|.code + dasm_put(Dst, 6383); +#line 10390 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 10391 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + !JIT_G(current_frame) || + !JIT_G(current_frame)->call || + !TRACE_FRAME_IS_NESTED(JIT_G(current_frame)->call) || + prev_opline->opcode == ZEND_SEND_UNPACK || + prev_opline->opcode == ZEND_SEND_ARRAY || + prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS) { + + //| // zend_vm_stack_free_call_frame(call); + //| test byte [RX + offsetof(zend_execute_data, This.u1.type_info) + 2], (ZEND_CALL_ALLOCATED >> 16) + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6326, offsetof(zend_execute_data, This.u1.type_info) + 2, (ZEND_CALL_ALLOCATED >> 16)); +#line 10405 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| mov FCARG1a, RX + //| EXT_CALL zend_jit_free_call_frame, r0 + dasm_put(Dst, 6391); + if (MAY_USE_32BIT_ADDR(zend_jit_free_call_frame)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_free_call_frame)); + } else { + if (IS_SIGNED_32BIT(zend_jit_free_call_frame)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_free_call_frame)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_free_call_frame)), (unsigned int)((((ptrdiff_t)zend_jit_free_call_frame))>>32)); + } + dasm_put(Dst, 66); + } +#line 10408 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >1 + //|.code + dasm_put(Dst, 3817); +#line 10410 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| MEM_STORE_ZTS aword, executor_globals, vm_stack_top, RX, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 10412 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 615, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_top))); +#line 10413 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (!RETURN_VALUE_USED(opline)) { + zend_class_entry *ce; + bool ce_is_instanceof; + uint32_t func_info = call_info ? + zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof) : + (MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN); + + /* If an exception is thrown, the return_value may stay at the + * original value of null. */ + func_info |= MAY_BE_NULL; + + if (func_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) { + //| ZVAL_PTR_DTOR res_addr, func_info, 1, 1, opline + if ((func_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((func_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + if (((func_info) & MAY_BE_GUARD) || RC_MAY_BE_1(func_info)) { + if (((func_info) & MAY_BE_GUARD) || RC_MAY_BE_N(func_info)) { + if (1 && (((func_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(func_info) && ((func_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((func_info) & MAY_BE_GUARD) + && has_concrete_type((func_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((func_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((func_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((func_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (1 && (((func_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(func_info) && ((func_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (1 && (((func_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(func_info) && ((func_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((func_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((func_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 10427 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //| // if (UNEXPECTED(EG(exception) != NULL)) { + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 10432 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->icall_throw_handler + dasm_put(Dst, 6398, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 10433 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + // TODO: Can we avoid checking for interrupts after each call ??? + if (trace && last_valid_opline != opline) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline + 1, ZEND_JIT_EXIT_TO_VM); + + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + } else { + exit_addr = NULL; + } + if (!zend_jit_check_timeout(Dst, opline + 1, exit_addr)) { + return 0; + } + + if ((!trace || !func) && opline->opcode != ZEND_DO_ICALL) { + //| LOAD_IP_ADDR (opline + 1) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32), Dt1(->opline)); + } + } +#line 10451 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (trace + && trace->op == ZEND_JIT_TRACE_END + && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) { + //| LOAD_IP_ADDR (opline + 1) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32), Dt1(->opline)); + } + } +#line 10455 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!func) { + //|9: + dasm_put(Dst, 4230); +#line 10460 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_send_val(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr) +{ + uint32_t arg_num = opline->op2.num; + zend_jit_addr arg_addr; + + ZEND_ASSERT(opline->opcode == ZEND_SEND_VAL || arg_num <= MAX_ARG_FLAG_NUM); + + if (!zend_jit_reuse_ip(Dst)) { + return 0; + } + + if (opline->opcode == ZEND_SEND_VAL_EX) { + uint32_t mask = ZEND_SEND_BY_REF << ((arg_num + 3) * 2); + + ZEND_ASSERT(arg_num <= MAX_ARG_FLAG_NUM); + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && JIT_G(current_frame) + && JIT_G(current_frame)->call + && JIT_G(current_frame)->call->func) { + if (ARG_MUST_BE_SENT_BY_REF(JIT_G(current_frame)->call->func, arg_num)) { + /* Don't generate code that always throws exception */ + return 0; + } + } else if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| mov r0, EX:RX->func + //| test dword [r0 + offsetof(zend_function, quick_arg_flags)], mask + //| jnz &exit_addr + dasm_put(Dst, 6026, Dt1(->func), offsetof(zend_function, quick_arg_flags), mask, (ptrdiff_t)(exit_addr)); +#line 10498 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov r0, EX:RX->func + //| test dword [r0 + offsetof(zend_function, quick_arg_flags)], mask + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6408, Dt1(->func), offsetof(zend_function, quick_arg_flags), mask); +#line 10503 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10504 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op1_addr) == IS_REG) { + /* set type to avoid zval_ptr_dtor() on uninitialized value */ + zend_jit_addr addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var); + //| SET_ZVAL_TYPE_INFO addr, IS_UNDEF + ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(addr)), Z_OFFSET(addr)+offsetof(zval,u1.type_info), IS_UNDEF); +#line 10508 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 10510 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->throw_cannot_pass_by_ref + //|.code + dasm_put(Dst, 6423); +#line 10512 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + } + } + + arg_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, opline->result.var); + + if (opline->op1_type == IS_CONST) { + zval *zv = RT_CONSTANT(opline, opline->op1); + + //| ZVAL_COPY_CONST arg_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_R0 + if (Z_TYPE_P(zv) > IS_TRUE) { + if (Z_TYPE_P(zv) == IS_DOUBLE) { + zend_reg dst_reg = (Z_MODE(arg_addr) == IS_REG) ? Z_REG(arg_addr) : ZREG_XMM0; + if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else if (!IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)zv)), (unsigned int)((((uintptr_t)zv))>>32)); + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } else { + dasm_put(Dst, 2028, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } + } else { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } else { + dasm_put(Dst, 1988, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (dst_reg != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_TYPE_P(zv) == IS_LONG && MAY_BE_ANY == MAY_BE_DOUBLE) { + zend_reg dst_reg = (Z_MODE(arg_addr) == IS_REG) ? Z_REG(arg_addr) : ZREG_XMM0; + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (dst_reg != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_LVAL_P(zv) == 0 && Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + } else { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R0), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(arg_addr)), Z_OFFSET(arg_addr), Z_LVAL_P(zv)); + } + } + } + } + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if (MAY_BE_ANY == MAY_BE_DOUBLE) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); + } + } else if (((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1<>32)); + } else { + dasm_put(Dst, 3918, Z_LVAL_P(zv)); + } +#line 10524 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10527 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_check_undef_args(dasm_State **Dst, const zend_op *opline) +{ + //| mov FCARG1a, EX->call + //| test byte [FCARG1a + offsetof(zend_execute_data, This.u1.type_info) + 3], (ZEND_CALL_MAY_HAVE_UNDEF >> 24) + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6437, Dt1(->call), offsetof(zend_execute_data, This.u1.type_info) + 3, (ZEND_CALL_MAY_HAVE_UNDEF >> 24)); +#line 10538 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 10540 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_handle_undef_args, r0 + if (MAY_USE_32BIT_ADDR(zend_handle_undef_args)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_handle_undef_args)); + } else { + if (IS_SIGNED_32BIT(zend_handle_undef_args)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_handle_undef_args)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_handle_undef_args)), (unsigned int)((((ptrdiff_t)zend_handle_undef_args))>>32)); + } + dasm_put(Dst, 66); + } +#line 10541 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| jnz ->exception_handler + //| jmp >2 + //|.code + dasm_put(Dst, 6452); +#line 10545 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 10546 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_send_ref(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, int cold) +{ + zend_jit_addr op1_addr, arg_addr, ref_addr; + + op1_addr = OP1_ADDR(); + arg_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, opline->result.var); + + if (!zend_jit_reuse_ip(Dst)) { + return 0; + } + + if (opline->op1_type == IS_VAR) { + if (op1_info & MAY_BE_INDIRECT) { + //| LOAD_ZVAL_ADDR r0, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 6465, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 6473, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10564 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // if (EXPECTED(Z_TYPE_P(ret) == IS_INDIRECT)) { + //| IF_NOT_Z_TYPE r0, IS_INDIRECT, >1 + //| // ret = Z_INDIRECT_P(ret); + //| GET_Z_PTR r0, r0 + //|1: + dasm_put(Dst, 6479, offsetof(zval, u1.v.type), IS_INDIRECT); +#line 10569 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + } + } else if (opline->op1_type == IS_CV) { + if (op1_info & MAY_BE_UNDEF) { + if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10575 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10576 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >2 + //|1: + dasm_put(Dst, 6493, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 10578 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + op1_info &= ~MAY_BE_UNDEF; + op1_info |= MAY_BE_NULL; + } + } else { + ZEND_UNREACHABLE(); + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) { + if (op1_info & MAY_BE_REF) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >2 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10589 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR r1, op1_addr + dasm_put(Dst, 2252, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10590 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_ADDREF r1 + //| SET_ZVAL_PTR arg_addr, r1 + dasm_put(Dst, 6508, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); +#line 10592 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO arg_addr, IS_REFERENCE_EX + dasm_put(Dst, 6519, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); +#line 10593 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >6 + dasm_put(Dst, 6527, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), IS_REFERENCE_EX); +#line 10594 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + //| // ZVAL_NEW_REF(arg, varptr); + dasm_put(Dst, 2065); +#line 10597 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type == IS_VAR) { + if (Z_REG(op1_addr) != ZREG_R0 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR r0, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 6465, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 6473, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10600 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov aword T1, r0 // save + dasm_put(Dst, 3547); +#line 10602 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EMALLOC sizeof(zend_reference), op_array, opline + #if ZEND_DEBUG + const char *filename = op_array->filename ? op_array->filename->val : NULL; + dasm_put(Dst, 798, sizeof(zend_reference)); + if (IS_SIGNED_32BIT(filename)) { + dasm_put(Dst, 751, ((ptrdiff_t)filename)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)filename)), (unsigned int)((((ptrdiff_t)filename))>>32)); + } + dasm_put(Dst, 6540, opline->lineno); + if (MAY_USE_32BIT_ADDR(_emalloc)) { + dasm_put(Dst, 53, (ptrdiff_t)(_emalloc)); + } else { + if (IS_SIGNED_32BIT(_emalloc)) { + dasm_put(Dst, 56, ((ptrdiff_t)_emalloc)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_emalloc)), (unsigned int)((((ptrdiff_t)_emalloc))>>32)); + } + dasm_put(Dst, 66); + } + #else + #ifdef HAVE_BUILTIN_CONSTANT_P + if (sizeof(zend_reference) > 24 && sizeof(zend_reference) <= 32) { + if (MAY_USE_32BIT_ADDR(_emalloc_32)) { + dasm_put(Dst, 53, (ptrdiff_t)(_emalloc_32)); + } else { + if (IS_SIGNED_32BIT(_emalloc_32)) { + dasm_put(Dst, 56, ((ptrdiff_t)_emalloc_32)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_emalloc_32)), (unsigned int)((((ptrdiff_t)_emalloc_32))>>32)); + } + dasm_put(Dst, 66); + } + } else { + dasm_put(Dst, 798, sizeof(zend_reference)); + if (MAY_USE_32BIT_ADDR(_emalloc)) { + dasm_put(Dst, 53, (ptrdiff_t)(_emalloc)); + } else { + if (IS_SIGNED_32BIT(_emalloc)) { + dasm_put(Dst, 56, ((ptrdiff_t)_emalloc)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_emalloc)), (unsigned int)((((ptrdiff_t)_emalloc))>>32)); + } + dasm_put(Dst, 66); + } + } + #else + dasm_put(Dst, 798, sizeof(zend_reference)); + if (MAY_USE_32BIT_ADDR(_emalloc)) { + dasm_put(Dst, 53, (ptrdiff_t)(_emalloc)); + } else { + if (IS_SIGNED_32BIT(_emalloc)) { + dasm_put(Dst, 56, ((ptrdiff_t)_emalloc)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_emalloc)), (unsigned int)((((ptrdiff_t)_emalloc))>>32)); + } + dasm_put(Dst, 66); + } + #endif + #endif +#line 10604 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov dword [r0], 2 + //| mov dword [r0 + offsetof(zend_reference, gc.u.type_info)], GC_REFERENCE + //| mov aword [r0 + offsetof(zend_reference, sources.ptr)], 0 + dasm_put(Dst, 6549, offsetof(zend_reference, gc.u.type_info), GC_REFERENCE, offsetof(zend_reference, sources.ptr)); +#line 10607 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, offsetof(zend_reference, val)); + if (opline->op1_type == IS_VAR) { + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R1, 0); + + //| mov r1, aword T1 // restore + //| ZVAL_COPY_VALUE ref_addr, MAY_BE_ANY, val_addr, op1_info, ZREG_R2, ZREG_R2 + dasm_put(Dst, 6568); + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(ref_addr) != IS_REG || Z_REG(ref_addr) != Z_REG(val_addr)) { + if (Z_MODE(ref_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(ref_addr))); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(ref_addr)), (Z_REG(ref_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(ref_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(ref_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(ref_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(ref_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(ref_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(ref_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(ref_addr))); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(ref_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(ref_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(ref_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(ref_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(ref_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(ref_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(ref_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ref_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ref_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info)); + } +#line 10613 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_PTR val_addr, r0 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 10614 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO val_addr, IS_REFERENCE_EX + dasm_put(Dst, 2312, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info), IS_REFERENCE_EX); +#line 10615 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ZVAL_COPY_VALUE ref_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R1, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ref_addr) != IS_REG || Z_REG(ref_addr) != Z_REG(op1_addr)) { + if (Z_MODE(ref_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ref_addr))); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(ref_addr)), (Z_REG(ref_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(ref_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(ref_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(ref_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(ref_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ref_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(ref_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(ref_addr))); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(ref_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(ref_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(ref_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(ref_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(ref_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(ref_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(ref_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ref_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ref_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R1), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info)); + } +#line 10617 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_PTR op1_addr, r0 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10618 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_REFERENCE_EX + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_REFERENCE_EX); +#line 10619 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_PTR arg_addr, r0 + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); +#line 10621 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO arg_addr, IS_REFERENCE_EX + dasm_put(Dst, 2312, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), IS_REFERENCE_EX); +#line 10622 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|6: + //| FREE_OP opline->op1_type, opline->op1, op1_info, !cold, opline + dasm_put(Dst, 3411); + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (!cold) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (!cold && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 10626 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 10627 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_send_var(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr op1_def_addr) +{ + uint32_t arg_num = opline->op2.num; + zend_jit_addr arg_addr; + + ZEND_ASSERT((opline->opcode != ZEND_SEND_VAR_EX && + opline->opcode != ZEND_SEND_VAR_NO_REF_EX) || + arg_num <= MAX_ARG_FLAG_NUM); + + arg_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, opline->result.var); + + if (!zend_jit_reuse_ip(Dst)) { + return 0; + } + + if (opline->opcode == ZEND_SEND_VAR_EX) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && JIT_G(current_frame) + && JIT_G(current_frame)->call + && JIT_G(current_frame)->call->func) { + if (ARG_SHOULD_BE_SENT_BY_REF(JIT_G(current_frame)->call->func, arg_num)) { + if (!zend_jit_send_ref(Dst, opline, op_array, op1_info, 0)) { + return 0; + } + return 1; + } + } else { + uint32_t mask = (ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF) << ((arg_num + 3) * 2); + + //| mov r0, EX:RX->func + //| test dword [r0 + offsetof(zend_function, quick_arg_flags)], mask + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6408, Dt1(->func), offsetof(zend_function, quick_arg_flags), mask); +#line 10664 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10665 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_send_ref(Dst, opline, op_array, op1_info, 1)) { + return 0; + } + //| jmp >7 + //|.code + dasm_put(Dst, 6573); +#line 10670 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opline->opcode == ZEND_SEND_VAR_NO_REF_EX) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && JIT_G(current_frame) + && JIT_G(current_frame)->call + && JIT_G(current_frame)->call->func) { + if (ARG_SHOULD_BE_SENT_BY_REF(JIT_G(current_frame)->call->func, arg_num)) { + + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R1, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R1), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10679 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (!ARG_MAY_BE_SENT_BY_REF(JIT_G(current_frame)->call->func, arg_num)) { + if (!(op1_info & MAY_BE_REF)) { + /* Don't generate code that always throws exception */ + return 0; + } else { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| cmp cl, IS_REFERENCE + //| jne &exit_addr + dasm_put(Dst, 6579, IS_REFERENCE, (ptrdiff_t)(exit_addr)); +#line 10692 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + return 1; + } + } else { + uint32_t mask = (ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF) << ((arg_num + 3) * 2); + + //| mov r0, EX:RX->func + //| test dword [r0 + offsetof(zend_function, quick_arg_flags)], mask + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6408, Dt1(->func), offsetof(zend_function, quick_arg_flags), mask); +#line 10703 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + mask = ZEND_SEND_PREFER_REF << ((arg_num + 3) * 2); + + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R1, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R1), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10708 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_REF) { + //| cmp cl, IS_REFERENCE + //| je >7 + dasm_put(Dst, 6587, IS_REFERENCE); +#line 10711 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test dword [r0 + offsetof(zend_function, quick_arg_flags)], mask + //| jnz >7 + dasm_put(Dst, 6596, offsetof(zend_function, quick_arg_flags), mask); +#line 10714 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 10721 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 10723 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ZVAL_ADDR FCARG1a, arg_addr + if (Z_MODE(arg_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(arg_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(arg_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(arg_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(arg_addr)))>>32)); + } + } else if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(arg_addr)) { + dasm_put(Dst, 2341, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10724 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_only_vars_by_reference, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_only_vars_by_reference)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_only_vars_by_reference)); + } else { + if (IS_SIGNED_32BIT(zend_jit_only_vars_by_reference)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_only_vars_by_reference)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_only_vars_by_reference)), (unsigned int)((((ptrdiff_t)zend_jit_only_vars_by_reference))>>32)); + } + dasm_put(Dst, 66); + } +#line 10725 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_check_exception(Dst)) { + return 0; + } + //| jmp >7 + dasm_put(Dst, 3757); +#line 10729 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|.code + dasm_put(Dst, 373); +#line 10732 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opline->opcode == ZEND_SEND_FUNC_ARG) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && JIT_G(current_frame) + && JIT_G(current_frame)->call + && JIT_G(current_frame)->call->func) { + if (ARG_SHOULD_BE_SENT_BY_REF(JIT_G(current_frame)->call->func, arg_num)) { + if (!zend_jit_send_ref(Dst, opline, op_array, op1_info, 0)) { + return 0; + } + return 1; + } + } else { + //| test dword [RX + offsetof(zend_execute_data, This.u1.type_info)], ZEND_CALL_SEND_ARG_BY_REF + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6606, offsetof(zend_execute_data, This.u1.type_info), ZEND_CALL_SEND_ARG_BY_REF); +#line 10748 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10749 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_send_ref(Dst, opline, op_array, op1_info, 1)) { + return 0; + } + //| jmp >7 + //|.code + dasm_put(Dst, 6573); +#line 10754 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & MAY_BE_UNDEF) { + if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) { + //| IF_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10760 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 10761 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 10762 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 10765 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 10767 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO arg_addr, IS_NULL + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); +#line 10768 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| jz ->exception_handler + dasm_put(Dst, 6618, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 10770 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) { + //| jmp >7 + //|.code + dasm_put(Dst, 6573); +#line 10774 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //|7: + dasm_put(Dst, 4482); +#line 10776 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; + } + } + + if (opline->opcode == ZEND_SEND_VAR_NO_REF) { + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R1, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R1), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10782 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_REF) { + //| cmp cl, IS_REFERENCE + //| je >7 + dasm_put(Dst, 6587, IS_REFERENCE); +#line 10785 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 10793 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 10795 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ZVAL_ADDR FCARG1a, arg_addr + if (Z_MODE(arg_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(arg_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(arg_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(arg_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(arg_addr)))>>32)); + } + } else if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(arg_addr)) { + dasm_put(Dst, 2341, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10796 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_only_vars_by_reference, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_only_vars_by_reference)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_only_vars_by_reference)); + } else { + if (IS_SIGNED_32BIT(zend_jit_only_vars_by_reference)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_only_vars_by_reference)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_only_vars_by_reference)), (unsigned int)((((ptrdiff_t)zend_jit_only_vars_by_reference))>>32)); + } + dasm_put(Dst, 66); + } +#line 10797 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + } else { + if (op1_info & MAY_BE_REF) { + if (opline->op1_type == IS_CV) { + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 10807 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 10808 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, val_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(val_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10809 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF op1_info, ah, r2 + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2233); + } +#line 10810 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 8); + + //| IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10814 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); +#line 10815 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr); + //| GET_ZVAL_PTR FCARG1a, op1_addr + dasm_put(Dst, 70); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 10818 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // ZVAL_COPY_VALUE(return_value, &ref->value); + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_R0, ZREG_R2 + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(ref_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(ref_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(ref_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(ref_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(ref_addr) != IS_REG || ZREG_XMM0 != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10820 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF FCARG1a + //| je >1 + //| IF_NOT_REFCOUNTED ah, >2 + //| GC_ADDREF r2 + //| jmp >2 + //|1: + //| EFREE_REG_REFERENCE + dasm_put(Dst, 6634); + #if ZEND_DEBUG + dasm_put(Dst, 4094); + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + #else + #ifdef HAVE_BUILTIN_CONSTANT_P + if (MAY_USE_32BIT_ADDR(_efree_32)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree_32)); + } else { + if (IS_SIGNED_32BIT(_efree_32)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree_32)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree_32)), (unsigned int)((((ptrdiff_t)_efree_32))>>32)); + } + dasm_put(Dst, 66); + } + #else + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + #endif + #endif +#line 10827 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >2 + //|.code + dasm_put(Dst, 2938); +#line 10829 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10830 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 10831 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (op1_addr != op1_def_addr) { + if (!zend_jit_update_regs(Dst, opline->op1.var, op1_addr, op1_def_addr, op1_info)) { + return 0; + } + if (Z_MODE(op1_def_addr) == IS_REG && Z_MODE(op1_addr) != IS_REG) { + op1_addr= op1_def_addr; + } + } + //| ZVAL_COPY_VALUE arg_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(arg_addr)), (Z_REG(arg_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(arg_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(arg_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(arg_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(arg_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(arg_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(arg_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(arg_addr))); + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(arg_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } else if (Z_MODE(arg_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(arg_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(arg_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(arg_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(arg_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(arg_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(arg_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(arg_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(arg_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(arg_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(arg_addr)), Z_OFFSET(arg_addr)+offsetof(zval,u1.type_info)); + } +#line 10842 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type == IS_CV) { + //| TRY_ADDREF op1_info, ah, r2 + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2233); + } +#line 10844 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + //|7: + dasm_put(Dst, 4482); +#line 10848 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_check_func_arg(dasm_State **Dst, const zend_op *opline) +{ + uint32_t arg_num = opline->op2.num; + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && JIT_G(current_frame) + && JIT_G(current_frame)->call + && JIT_G(current_frame)->call->func) { + if (ARG_SHOULD_BE_SENT_BY_REF(JIT_G(current_frame)->call->func, arg_num)) { + if (!TRACE_FRAME_IS_LAST_SEND_BY_REF(JIT_G(current_frame)->call)) { + TRACE_FRAME_SET_LAST_SEND_BY_REF(JIT_G(current_frame)->call); + //| // ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF); + if (reuse_ip) { + //| or dword [RX + offsetof(zend_execute_data, This.u1.type_info)], ZEND_CALL_SEND_ARG_BY_REF + dasm_put(Dst, 5745, offsetof(zend_execute_data, This.u1.type_info), ZEND_CALL_SEND_ARG_BY_REF); + } else { +#line 10867 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX->call + //| or dword [r0 + offsetof(zend_execute_data, This.u1.type_info)], ZEND_CALL_SEND_ARG_BY_REF + dasm_put(Dst, 6657, Dt1(->call), offsetof(zend_execute_data, This.u1.type_info), ZEND_CALL_SEND_ARG_BY_REF); + } +#line 10870 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (!TRACE_FRAME_IS_LAST_SEND_BY_VAL(JIT_G(current_frame)->call)) { + TRACE_FRAME_SET_LAST_SEND_BY_VAL(JIT_G(current_frame)->call); + //| // ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF); + if (reuse_ip) { + //| and dword [RX + offsetof(zend_execute_data, This.u1.type_info)], ~ZEND_CALL_SEND_ARG_BY_REF + dasm_put(Dst, 6666, offsetof(zend_execute_data, This.u1.type_info), ~ZEND_CALL_SEND_ARG_BY_REF); + } else { +#line 10878 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX->call + //| and dword [r0 + offsetof(zend_execute_data, This.u1.type_info)], ~ZEND_CALL_SEND_ARG_BY_REF + dasm_put(Dst, 6672, Dt1(->call), offsetof(zend_execute_data, This.u1.type_info), ~ZEND_CALL_SEND_ARG_BY_REF); + } +#line 10881 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + // if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) { + uint32_t mask = (ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF) << ((arg_num + 3) * 2); + + if (!zend_jit_reuse_ip(Dst)) { + return 0; + } + + //| mov r0, EX:RX->func + //| test dword [r0 + offsetof(zend_function, quick_arg_flags)], mask + //| jnz >1 + //|.cold_code + dasm_put(Dst, 6408, Dt1(->func), offsetof(zend_function, quick_arg_flags), mask); +#line 10895 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF); + //| or dword [RX + offsetof(zend_execute_data, This.u1.type_info)], ZEND_CALL_SEND_ARG_BY_REF + //| jmp >1 + //|.code + dasm_put(Dst, 6681, offsetof(zend_execute_data, This.u1.type_info), ZEND_CALL_SEND_ARG_BY_REF); +#line 10900 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF); + //| and dword [RX + offsetof(zend_execute_data, This.u1.type_info)], ~ZEND_CALL_SEND_ARG_BY_REF + //|1: + dasm_put(Dst, 6694, offsetof(zend_execute_data, This.u1.type_info), ~ZEND_CALL_SEND_ARG_BY_REF); +#line 10903 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_smart_true(dasm_State **Dst, const zend_op *opline, int jmp, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2) +{ + if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + if (jmp) { + //| jmp >7 + dasm_put(Dst, 3757); +#line 10914 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 10917 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 10924 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (jmp) { + //| jmp >7 + dasm_put(Dst, 3757); +#line 10926 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + return 1; +} + +static int zend_jit_smart_false(dasm_State **Dst, const zend_op *opline, int jmp, uint8_t smart_branch_opcode, uint32_t target_label) +{ + if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 10937 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + if (jmp) { + //| jmp >7 + dasm_put(Dst, 3757); +#line 10940 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + ZEND_UNREACHABLE(); + } + } else { + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 10948 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (jmp) { + //| jmp >7 + dasm_put(Dst, 3757); +#line 10950 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + return 1; +} + +static int zend_jit_defined(dasm_State **Dst, const zend_op *opline, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + uint32_t defined_label = (uint32_t)-1; + uint32_t undefined_label = (uint32_t)-1; + zval *zv = RT_CONSTANT(opline, opline->op1); + zend_jit_addr res_addr = 0; + + if (smart_branch_opcode && !exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + undefined_label = target_label; + } else if (smart_branch_opcode == ZEND_JMPNZ) { + defined_label = target_label; + } else { + ZEND_UNREACHABLE(); + } + } + + //| // if (CACHED_PTR(opline->extended_value)) { + //| mov r0, EX->run_time_cache + //| mov r0, aword [r0 + opline->extended_value] + //| test r0, r0 + //| jz >1 + //| test r0, 0x1 + //| jnz >4 + //|.cold_code + dasm_put(Dst, 6702, Dt1(->run_time_cache), opline->extended_value); +#line 10981 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + //| MEM_LOAD_ZTS FCARG1a, aword, executor_globals, zend_constants, FCARG1a + dasm_put(Dst, 6729); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5207, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5213, tsrm_tls_index, tsrm_tls_offset); + } +#line 10983 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| shr r0, 1 + //| cmp dword [FCARG1a + offsetof(HashTable, nNumOfElements)], eax + dasm_put(Dst, 6733, (executor_globals_offset+offsetof(zend_executor_globals, zend_constants)), offsetof(HashTable, nNumOfElements)); +#line 10985 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (smart_branch_opcode) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jz &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 10990 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >3 + dasm_put(Dst, 4027); +#line 10992 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (undefined_label != (uint32_t)-1) { + //| jz =>undefined_label + dasm_put(Dst, 4700, undefined_label); +#line 10995 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >3 + dasm_put(Dst, 4027); +#line 10997 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jz >2 + dasm_put(Dst, 2050); +#line 11000 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 11003 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ADDR FCARG1a, zv + if (IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 798, ((ptrdiff_t)zv)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)zv)), (unsigned int)((((ptrdiff_t)zv))>>32)); + } +#line 11004 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_check_constant, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_check_constant)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_check_constant)); + } else { + if (IS_SIGNED_32BIT(zend_jit_check_constant)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_check_constant)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_check_constant)), (unsigned int)((((ptrdiff_t)zend_jit_check_constant))>>32)); + } + dasm_put(Dst, 66); + } +#line 11005 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + dasm_put(Dst, 3655); +#line 11006 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jz >3 + dasm_put(Dst, 4027); +#line 11009 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jnz >3 + dasm_put(Dst, 303); +#line 11011 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 11013 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode) { + if (undefined_label != (uint32_t)-1) { + //| jz =>undefined_label + dasm_put(Dst, 4700, undefined_label); +#line 11016 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >3 + dasm_put(Dst, 4027); +#line 11018 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (defined_label != (uint32_t)-1) { + //| jmp =>defined_label + dasm_put(Dst, 1614, defined_label); +#line 11021 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >3 + dasm_put(Dst, 3991); +#line 11023 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + //| jnz >1 + //|2: + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + dasm_put(Dst, 6744); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 11029 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >3 + dasm_put(Dst, 6751, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 11030 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 11032 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (smart_branch_opcode) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 11036 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (defined_label != (uint32_t)-1) { + //| jmp =>defined_label + dasm_put(Dst, 1614, defined_label); +#line 11039 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //|1: + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + dasm_put(Dst, 70); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 11043 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 11045 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + uint32_t mask; + zend_jit_addr op1_addr = OP1_ADDR(); + + // TODO: support for is_resource() ??? + ZEND_ASSERT(opline->extended_value != MAY_BE_RESOURCE); + + if (op1_info & MAY_BE_UNDEF) { + if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) { + //| IF_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11060 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 11061 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 11062 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 11064 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 11066 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + zend_jit_check_exception_undef_result(Dst, opline); + if (opline->extended_value & MAY_BE_NULL) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 11071 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) != 0) { + //| jmp >7 + dasm_put(Dst, 3757); +#line 11073 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (!zend_jit_smart_true(Dst, opline, (op1_info & (MAY_BE_ANY|MAY_BE_REF)) != 0, smart_branch_opcode, target_label, target_label2)) { + return 0; + } + } else { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 11081 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) != 0) { + //| jmp >7 + dasm_put(Dst, 3757); +#line 11083 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (!zend_jit_smart_false(Dst, opline, (op1_info & (MAY_BE_ANY|MAY_BE_REF)) != 0, smart_branch_opcode, target_label)) { + return 0; + } + } + if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) { + //|.code + dasm_put(Dst, 373); +#line 11090 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) { + mask = opline->extended_value; + if (!(op1_info & MAY_BE_GUARD) && !(op1_info & (MAY_BE_ANY - mask))) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 11097 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 11100 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (!zend_jit_smart_true(Dst, opline, 0, smart_branch_opcode, target_label, target_label2)) { + return 0; + } + } else if (!(op1_info & MAY_BE_GUARD) && !(op1_info & mask)) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 11106 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 11109 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (!zend_jit_smart_false(Dst, opline, 0, smart_branch_opcode, target_label)) { + return 0; + } + } else { + bool invert = 0; + uint8_t type; + + switch (mask) { + case MAY_BE_NULL: type = IS_NULL; break; + case MAY_BE_FALSE: type = IS_FALSE; break; + case MAY_BE_TRUE: type = IS_TRUE; break; + case MAY_BE_LONG: type = IS_LONG; break; + case MAY_BE_DOUBLE: type = IS_DOUBLE; break; + case MAY_BE_STRING: type = IS_STRING; break; + case MAY_BE_ARRAY: type = IS_ARRAY; break; + case MAY_BE_OBJECT: type = IS_OBJECT; break; + case MAY_BE_ANY - MAY_BE_NULL: type = IS_NULL; invert = 1; break; + case MAY_BE_ANY - MAY_BE_FALSE: type = IS_FALSE; invert = 1; break; + case MAY_BE_ANY - MAY_BE_TRUE: type = IS_TRUE; invert = 1; break; + case MAY_BE_ANY - MAY_BE_LONG: type = IS_LONG; invert = 1; break; + case MAY_BE_ANY - MAY_BE_DOUBLE: type = IS_DOUBLE; invert = 1; break; + case MAY_BE_ANY - MAY_BE_STRING: type = IS_STRING; invert = 1; break; + case MAY_BE_ANY - MAY_BE_ARRAY: type = IS_ARRAY; invert = 1; break; + case MAY_BE_ANY - MAY_BE_OBJECT: type = IS_OBJECT; invert = 1; break; + case MAY_BE_ANY - MAY_BE_RESOURCE: type = IS_OBJECT; invert = 1; break; + default: + type = 0; + } + + if (op1_info & MAY_BE_REF) { + //| LOAD_ZVAL_ADDR r0, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 6465, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 6473, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11141 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF r0, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 3837, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 11142 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (type == 0) { + if (smart_branch_opcode && + (opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if ((op1_info) & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| // if (Z_REFCOUNTED_P(cv)) { + //| IF_ZVAL_REFCOUNTED op1_addr, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11150 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 263, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); +#line 11151 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 11152 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // if (!Z_DELREF_P(cv)) { + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11155 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF FCARG1a + dasm_put(Dst, 292, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 11156 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RC_MAY_BE_1(op1_info)) { + if (RC_MAY_BE_N(op1_info)) { + //| jnz >3 + dasm_put(Dst, 303); +#line 11159 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_REF) { + //| mov al, byte [r0 + 8] + dasm_put(Dst, 6764, 8); +#line 11162 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov al, byte [FP + opline->op1.var + 8] + dasm_put(Dst, 6768, opline->op1.var + 8); +#line 11164 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov byte T1, al // save + //| // zval_dtor_func(r); + //| ZVAL_DTOR_FUNC op1_info, opline + dasm_put(Dst, 6773); + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); +#line 11168 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov cl, byte T1 // restore + //|jmp >2 + dasm_put(Dst, 6777); +#line 11170 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((op1_info) & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (!RC_MAY_BE_1(op1_info)) { + //| jmp >3 + dasm_put(Dst, 3991); +#line 11174 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 11176 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 11178 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_REF) { + //| mov cl, byte [r0 + 8] + dasm_put(Dst, 6785, 8); +#line 11180 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov cl, byte [FP + opline->op1.var + 8] + dasm_put(Dst, 6789, opline->op1.var + 8); +#line 11182 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + dasm_put(Dst, 2065); +#line 11184 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (op1_info & MAY_BE_REF) { + //| mov cl, byte [r0 + 8] + dasm_put(Dst, 6785, 8); +#line 11187 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov cl, byte [FP + opline->op1.var + 8] + dasm_put(Dst, 6789, opline->op1.var + 8); +#line 11189 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| mov eax, 1 + //| shl eax, cl + //| test eax, mask + dasm_put(Dst, 6794, mask); +#line 11194 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 11197 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 11199 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| je =>target_label + dasm_put(Dst, 4700, target_label); +#line 11203 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + //| jne =>target_label + dasm_put(Dst, 1908, target_label); +#line 11205 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + //| setne al + //| movzx eax, al + //| add eax, 2 + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 6804); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 11215 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 11216 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (smart_branch_opcode && + (opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if ((op1_info) & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| // if (Z_REFCOUNTED_P(cv)) { + //| IF_ZVAL_REFCOUNTED op1_addr, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11224 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 263, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); +#line 11225 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 11226 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // if (!Z_DELREF_P(cv)) { + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11229 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF FCARG1a + dasm_put(Dst, 292, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 11230 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RC_MAY_BE_1(op1_info)) { + if (RC_MAY_BE_N(op1_info)) { + //| jnz >3 + dasm_put(Dst, 303); +#line 11233 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_REF) { + //| mov al, byte [r0 + 8] + dasm_put(Dst, 6764, 8); +#line 11236 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov al, byte [FP + opline->op1.var + 8] + dasm_put(Dst, 6768, opline->op1.var + 8); +#line 11238 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov byte T1, al // save + //| // zval_dtor_func(r); + //| ZVAL_DTOR_FUNC op1_info, opline + dasm_put(Dst, 6773); + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); +#line 11242 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov cl, byte T1 // restore + //|jmp >2 + dasm_put(Dst, 6777); +#line 11244 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((op1_info) & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (!RC_MAY_BE_1(op1_info)) { + //| jmp >3 + dasm_put(Dst, 3991); +#line 11248 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 11250 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 11252 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_REF) { + //| mov cl, byte [r0 + 8] + dasm_put(Dst, 6785, 8); +#line 11254 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov cl, byte [FP + opline->op1.var + 8] + dasm_put(Dst, 6789, opline->op1.var + 8); +#line 11256 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + //| cmp cl, type + dasm_put(Dst, 6814, type); +#line 11259 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (op1_info & MAY_BE_REF) { + //| cmp byte [r0 + 8], type + dasm_put(Dst, 3855, 8, type); +#line 11262 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| cmp byte [FP + opline->op1.var + 8], type + dasm_put(Dst, 6821, opline->op1.var + 8, type); +#line 11264 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (exit_addr) { + if (invert) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 11270 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 11272 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| je &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 11276 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 11278 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (smart_branch_opcode) { + if (invert) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| je =>target_label + dasm_put(Dst, 4700, target_label); +#line 11284 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + //| jne =>target_label + dasm_put(Dst, 1908, target_label); +#line 11286 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jne =>target_label + dasm_put(Dst, 1908, target_label); +#line 11292 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + //| je =>target_label + dasm_put(Dst, 4700, target_label); +#line 11294 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } + } else { + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + if (invert) { + //| setne al + dasm_put(Dst, 4665); +#line 11303 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| sete al + dasm_put(Dst, 4661); +#line 11305 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| movzx eax, al + //| add eax, 2 + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 4728); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 11309 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 11310 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + } + + //|7: + dasm_put(Dst, 4482); +#line 11316 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_leave_frame(dasm_State **Dst) +{ + //| // EG(current_execute_data) = EX(prev_execute_data); + //| mov r0, EX->prev_execute_data + //| MEM_STORE_ZTS aword, executor_globals, current_execute_data, r0, r2 + dasm_put(Dst, 6827, Dt1(->prev_execute_data)); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5632, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5638, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 6833, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); +#line 11325 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_free_cvs(dasm_State **Dst) +{ + //| // EG(current_execute_data) = EX(prev_execute_data); + //| mov FCARG1a, EX->prev_execute_data + //| MEM_STORE_ZTS aword, executor_globals, current_execute_data, FCARG1a, r0 + dasm_put(Dst, 6838, Dt1(->prev_execute_data)); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 11333 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // zend_free_compiled_variables(execute_data); + //| mov FCARG1a, FP + //| EXT_CALL zend_free_compiled_variables, r0 + dasm_put(Dst, 6844, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); + if (MAY_USE_32BIT_ADDR(zend_free_compiled_variables)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_free_compiled_variables)); + } else { + if (IS_SIGNED_32BIT(zend_free_compiled_variables)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_free_compiled_variables)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_free_compiled_variables)), (unsigned int)((((ptrdiff_t)zend_free_compiled_variables))>>32)); + } + dasm_put(Dst, 66); + } +#line 11336 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_free_cv(dasm_State **Dst, uint32_t info, uint32_t var) +{ + if (info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) { + uint32_t offset = EX_NUM_TO_VAR(var); + //| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset), info, 1, 1, NULL + if ((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))); + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_1(info)) { + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_N(info)) { + if (1 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((info) & MAY_BE_GUARD) + && has_concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (1 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (1 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, offset))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 11344 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_free_op(dasm_State **Dst, const zend_op *opline, uint32_t info, uint32_t var_offset) +{ + if (info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) { + //| ZVAL_PTR_DTOR ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset), info, 0, 1, opline + if ((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))); + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_1(info)) { + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_N(info)) { + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((info) & MAY_BE_GUARD) + && has_concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, var_offset))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 11352 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_leave_func(dasm_State **Dst, + const zend_op_array *op_array, + const zend_op *opline, + uint32_t op1_info, + bool left_frame, + zend_jit_trace_rec *trace, + zend_jit_trace_info *trace_info, + int indirect_var_access, + int may_throw) +{ + bool may_be_top_frame = + JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + !JIT_G(current_frame) || + !TRACE_FRAME_IS_NESTED(JIT_G(current_frame)); + bool may_need_call_helper = + indirect_var_access || /* may have symbol table */ + !op_array->function_name || /* may have symbol table */ + may_be_top_frame || + (op_array->fn_flags & ZEND_ACC_VARIADIC) || /* may have extra named args */ + JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + !JIT_G(current_frame) || + TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)) == -1 || /* unknown number of args */ + (uint32_t)TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)) > op_array->num_args; /* extra args */ + bool may_need_release_this = + !(op_array->fn_flags & ZEND_ACC_CLOSURE) && + op_array->scope && + !(op_array->fn_flags & ZEND_ACC_STATIC) && + (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + !JIT_G(current_frame) || + !TRACE_FRAME_NO_NEED_RELEASE_THIS(JIT_G(current_frame))); + + if (may_need_release_this) { + //| mov FCARG1d, dword [FP + offsetof(zend_execute_data, This.u1.type_info)] + dasm_put(Dst, 458, offsetof(zend_execute_data, This.u1.type_info)); +#line 11389 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (may_need_call_helper) { + if (!left_frame) { + left_frame = 1; + if (!zend_jit_leave_frame(Dst)) { + return 0; + } + } + /* ZEND_CALL_FAKE_CLOSURE handled on slow path to eliminate check for ZEND_CALL_CLOSURE on fast path */ + if (may_need_release_this) { + //| test FCARG1d, (ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_FAKE_CLOSURE) + dasm_put(Dst, 6853, (ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_FAKE_CLOSURE)); +#line 11400 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test dword [FP + offsetof(zend_execute_data, This.u1.type_info)], (ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_FAKE_CLOSURE) + dasm_put(Dst, 6858, offsetof(zend_execute_data, This.u1.type_info), (ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_FAKE_CLOSURE)); +#line 11402 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (trace && trace->op != ZEND_JIT_TRACE_END) { + //| jnz >1 + //|.cold_code + dasm_put(Dst, 272); +#line 11406 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 11407 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!GCC_GLOBAL_REGS) { + //| mov FCARG1a, FP + dasm_put(Dst, 73); +#line 11409 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_leave_func_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_leave_func_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_leave_func_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_leave_func_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_leave_func_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_leave_func_helper)), (unsigned int)((((ptrdiff_t)zend_jit_leave_func_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 11411 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (may_be_top_frame) { + // TODO: try to avoid this check ??? + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { +#if 0 + /* this check should be handled by the following OPLINE guard */ + //| cmp IP, zend_jit_halt_op + //| je ->trace_halt + dasm_put(Dst, 1846, zend_jit_halt_op); +#line 11419 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#endif + } else if (GCC_GLOBAL_REGS) { + //| test IP, IP + //| je ->trace_halt + dasm_put(Dst, 1856); +#line 11423 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test eax, eax + //| jl ->trace_halt + dasm_put(Dst, 1865); +#line 11426 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!GCC_GLOBAL_REGS) { + //| // execute_data = EG(current_execute_data) + //| MEM_LOAD_ZTS FP, aword, executor_globals, current_execute_data, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 92, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); +#line 11432 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >8 + //|.code + dasm_put(Dst, 6865); +#line 11435 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jnz ->leave_function_handler + dasm_put(Dst, 6871); +#line 11437 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op_array->fn_flags & ZEND_ACC_CLOSURE) { + if (!left_frame) { + left_frame = 1; + if (!zend_jit_leave_frame(Dst)) { + return 0; + } + } + //| // OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); + //| mov FCARG1a, EX->func + //| sub FCARG1a, sizeof(zend_object) + //| OBJ_RELEASE ZREG_FCARG1, >4 + dasm_put(Dst, 6876, Dt1(->func), sizeof(zend_object), (ZREG_FCARG1), 0); + if (ZREG_FCARG1 != ZREG_FCARG1) { + dasm_put(Dst, 2349, (ZREG_FCARG1)); + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + dasm_put(Dst, 6898, (ZREG_FCARG1), (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (ZREG_FCARG1 != ZREG_FCARG1) { + dasm_put(Dst, 2349, (ZREG_FCARG1)); + } + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } +#line 11451 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + dasm_put(Dst, 6917); +#line 11452 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (may_need_release_this) { + if (!left_frame) { + left_frame = 1; + if (!zend_jit_leave_frame(Dst)) { + return 0; + } + } + if (!JIT_G(current_frame) || !TRACE_FRAME_ALWAYS_RELEASE_THIS(JIT_G(current_frame))) { + //| // if (call_info & ZEND_CALL_RELEASE_THIS) + //| test FCARG1d, ZEND_CALL_RELEASE_THIS + //| je >4 + dasm_put(Dst, 6922, ZEND_CALL_RELEASE_THIS); +#line 11463 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // zend_object *object = Z_OBJ(execute_data->This); + //| mov FCARG1a, EX->This.value.obj + //| // OBJ_RELEASE(object); + //| OBJ_RELEASE ZREG_FCARG1, >4 + dasm_put(Dst, 6931, Dt1(->This.value.obj), (ZREG_FCARG1), 0); + if (ZREG_FCARG1 != ZREG_FCARG1) { + dasm_put(Dst, 2349, (ZREG_FCARG1)); + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + dasm_put(Dst, 6898, (ZREG_FCARG1), (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (ZREG_FCARG1 != ZREG_FCARG1) { + dasm_put(Dst, 2349, (ZREG_FCARG1)); + } + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } +#line 11468 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + dasm_put(Dst, 6917); +#line 11469 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + // TODO: avoid EG(excption) check for $this->foo() calls + may_throw = 1; + } + + //| // EG(vm_stack_top) = (zval*)execute_data; + //| MEM_STORE_ZTS aword, executor_globals, vm_stack_top, FP, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 11475 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // execute_data = EX(prev_execute_data); + //| mov FP, EX->prev_execute_data + dasm_put(Dst, 6948, (executor_globals_offset+offsetof(zend_executor_globals, vm_stack_top)), Dt1(->prev_execute_data)); +#line 11477 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (!left_frame) { + //| // EG(current_execute_data) = execute_data; + //| MEM_STORE_ZTS aword, executor_globals, current_execute_data, FP, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } + dasm_put(Dst, 6321, (executor_globals_offset+offsetof(zend_executor_globals, current_execute_data))); +#line 11481 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|9: + dasm_put(Dst, 4230); +#line 11484 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (trace) { + if (trace->op != ZEND_JIT_TRACE_END + && (JIT_G(current_frame) && !TRACE_FRAME_IS_UNKNOWN_RETURN(JIT_G(current_frame)))) { + zend_jit_reset_last_valid_opline(); + } else { + //| LOAD_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 0, Dt1(->opline)); + } +#line 11490 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ADD_IP sizeof(zend_op) + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1558, sizeof(zend_op)); + } else { + dasm_put(Dst, 1563, Dt1(->opline), sizeof(zend_op)); + } +#line 11491 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|8: + dasm_put(Dst, 4331); +#line 11494 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (trace->op == ZEND_JIT_TRACE_BACK + && (!JIT_G(current_frame) || TRACE_FRAME_IS_UNKNOWN_RETURN(JIT_G(current_frame)))) { + const zend_op *next_opline = trace->opline; + + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) + && (op1_info & MAY_BE_RC1) + && (op1_info & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY))) { + /* exception might be thrown during destruction of unused return value */ + //| // if (EG(exception)) + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 11505 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->leave_throw_handler + dasm_put(Dst, 6957, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 11506 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + do { + trace++; + } while (trace->op == ZEND_JIT_TRACE_INIT_CALL); + ZEND_ASSERT(trace->op == ZEND_JIT_TRACE_VM || trace->op == ZEND_JIT_TRACE_END); + next_opline = trace->opline; + ZEND_ASSERT(next_opline != NULL); + + if (trace->op == ZEND_JIT_TRACE_END + && trace->stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET) { + trace_info->flags |= ZEND_JIT_TRACE_LOOP; + //| CMP_IP next_opline + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1877, next_opline); + } else { + dasm_put(Dst, 1883, Dt1(->opline), next_opline); + } +#line 11518 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| je =>0 // LOOP + dasm_put(Dst, 4700, 0); +#line 11519 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 11521 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + //| jmp ->trace_escape + dasm_put(Dst, 1707); +#line 11523 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#endif + } else { + //| CMP_IP next_opline + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1877, next_opline); + } else { + dasm_put(Dst, 1883, Dt1(->opline), next_opline); + } +#line 11526 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->trace_escape + dasm_put(Dst, 6967); +#line 11527 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + zend_jit_set_last_valid_opline(trace->opline); + + return 1; + } else if (may_throw || + (((opline->op1_type & (IS_VAR|IS_TMP_VAR)) + && (op1_info & MAY_BE_RC1) + && (op1_info & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY))) + && (!JIT_G(current_frame) || TRACE_FRAME_IS_RETURN_VALUE_UNUSED(JIT_G(current_frame))))) { + //| // if (EG(exception)) + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 11539 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->leave_throw_handler + dasm_put(Dst, 6957, (executor_globals_offset+offsetof(zend_executor_globals, exception))); +#line 11540 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; + } else { + //| // if (EG(exception)) + //| MEM_CMP_ZTS aword, executor_globals, exception, 0, r0 + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 15, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 21, tsrm_tls_index, tsrm_tls_offset); + } +#line 11546 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_IP + dasm_put(Dst, 6972, (executor_globals_offset+offsetof(zend_executor_globals, exception))); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 0, Dt1(->opline)); + } +#line 11547 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne ->leave_throw_handler + //| // opline = EX(opline) + 1 + //| ADD_IP sizeof(zend_op) + dasm_put(Dst, 6962); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 1558, sizeof(zend_op)); + } else { + dasm_put(Dst, 1563, Dt1(->opline), sizeof(zend_op)); + } +#line 11550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { + //| ADD_HYBRID_SPAD + #ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + dasm_put(Dst, 97); + #endif +#line 11554 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#ifdef CONTEXT_THREADED_JIT + //| push aword [IP] + //| ret + dasm_put(Dst, 6978); +#line 11557 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 11559 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#endif + } else if (GCC_GLOBAL_REGS) { + //| add r4, SPAD // stack alignment + dasm_put(Dst, 115); +#line 11562 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#ifdef CONTEXT_THREADED_JIT + //| push aword [IP] + //| ret + dasm_put(Dst, 6978); +#line 11565 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + //| JMP_IP + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 102); + } else { + dasm_put(Dst, 107, Dt1(->opline)); + } +#line 11567 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#endif + } else { +#ifdef CONTEXT_THREADED_JIT + ZEND_UNREACHABLE(); + // TODO: context threading can't work without GLOBAL REGS because we have to change + // the value of execute_data in execute_ex() + //| mov FCARG1a, FP + //| mov r0, aword [FP] + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| push aword [r0] + //| ret + dasm_put(Dst, 6984); +#line 11580 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#else + //| mov FP, aword T2 // restore FP + //| mov RX, aword T3 // restore IP + //| add r4, NR_SPAD // stack alignment + //| mov r0, 2 // ZEND_VM_LEAVE + //| ret + dasm_put(Dst, 575); +#line 11586 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" +#endif + } + + return 1; +} + +static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info, zend_jit_addr op1_addr) +{ + zend_jit_addr ret_addr; + int8_t return_value_used; + + ZEND_ASSERT(op_array->type != ZEND_EVAL_CODE && op_array->function_name); + ZEND_ASSERT(!(op1_info & MAY_BE_UNDEF)); + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && JIT_G(current_frame)) { + if (TRACE_FRAME_IS_RETURN_VALUE_USED(JIT_G(current_frame))) { + return_value_used = 1; + } else if (TRACE_FRAME_IS_RETURN_VALUE_UNUSED(JIT_G(current_frame))) { + return_value_used = 0; + } else { + return_value_used = -1; + } + } else { + return_value_used = -1; + } + + if (ZEND_OBSERVER_ENABLED) { + if (Z_MODE(op1_addr) == IS_REG) { + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var); + + if (!zend_jit_spill_store(Dst, op1_addr, dst, op1_info, 1)) { + return 0; + } + op1_addr = dst; + } + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11622 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, FP + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 73); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 11624 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_observer_fcall_end, r0 + if (MAY_USE_32BIT_ADDR(zend_observer_fcall_end)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_observer_fcall_end)); + } else { + if (IS_SIGNED_32BIT(zend_observer_fcall_end)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_observer_fcall_end)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_observer_fcall_end)), (unsigned int)((((ptrdiff_t)zend_observer_fcall_end))>>32)); + } + dasm_put(Dst, 66); + } +#line 11625 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + // if (!EX(return_value)) + if (Z_MODE(op1_addr) == IS_REG && Z_REG(op1_addr) == ZREG_R1) { + if (return_value_used != 0) { + //| mov r2, EX->return_value + dasm_put(Dst, 939, Dt1(->return_value)); +#line 11631 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (return_value_used == -1) { + //| test r2, r2 + dasm_put(Dst, 7010); +#line 11634 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + ret_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 0); + } else { + if (return_value_used != 0) { + //| mov r1, EX->return_value + dasm_put(Dst, 5815, Dt1(->return_value)); +#line 11639 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (return_value_used == -1) { + //| test r1, r1 + dasm_put(Dst, 7014); +#line 11642 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + ret_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R1, 0); + } + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (return_value_used == -1) { + //| jz >1 + //|.cold_code + dasm_put(Dst, 3598); +#line 11650 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 11651 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (return_value_used != 1) { + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (jit_return_label >= 0) { + //| IF_NOT_ZVAL_REFCOUNTED op1_addr, =>jit_return_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 7018, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED, jit_return_label); +#line 11656 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_REFCOUNTED op1_addr, >9 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 7031, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); +#line 11658 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11661 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF FCARG1a + dasm_put(Dst, 292, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 11662 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RC_MAY_BE_1(op1_info)) { + if (RC_MAY_BE_N(op1_info)) { + if (jit_return_label >= 0) { + //| jnz =>jit_return_label + dasm_put(Dst, 1908, jit_return_label); +#line 11666 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jnz >9 + dasm_put(Dst, 5151); +#line 11668 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| //SAVE_OPLINE() + //| ZVAL_DTOR_FUNC op1_info, opline + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); +#line 11672 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| //????mov r1, EX->return_value // reload ??? + } + if (return_value_used == -1) { + if (jit_return_label >= 0) { + //| jmp =>jit_return_label + dasm_put(Dst, 1614, jit_return_label); +#line 11677 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 11679 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 11681 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (return_value_used == -1) { + if (jit_return_label >= 0) { + //| jz =>jit_return_label + dasm_put(Dst, 4700, jit_return_label); +#line 11686 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >9 + dasm_put(Dst, 3712); +#line 11688 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (return_value_used == 0) { + //|9: + dasm_put(Dst, 4230); +#line 11693 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; + } + + if (opline->op1_type == IS_CONST) { + zval *zv = RT_CONSTANT(opline, opline->op1); + //| ZVAL_COPY_CONST ret_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_R0 + if (Z_TYPE_P(zv) > IS_TRUE) { + if (Z_TYPE_P(zv) == IS_DOUBLE) { + zend_reg dst_reg = (Z_MODE(ret_addr) == IS_REG) ? Z_REG(ret_addr) : ZREG_XMM0; + if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else if (!IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)zv)), (unsigned int)((((uintptr_t)zv))>>32)); + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } else { + dasm_put(Dst, 2028, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } + } else { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } else { + dasm_put(Dst, 1988, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } + } + if (Z_MODE(ret_addr) == IS_REG) { + if (dst_reg != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_TYPE_P(zv) == IS_LONG && MAY_BE_ANY == MAY_BE_DOUBLE) { + zend_reg dst_reg = (Z_MODE(ret_addr) == IS_REG) ? Z_REG(ret_addr) : ZREG_XMM0; + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(ret_addr) == IS_REG) { + if (dst_reg != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_LVAL_P(zv) == 0 && Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(ret_addr)), (Z_REG(ret_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(ret_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + } else { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R0), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else { + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(ret_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(ret_addr)), Z_OFFSET(ret_addr), Z_LVAL_P(zv)); + } + } + } + } + if (Z_MODE(ret_addr) == IS_MEM_ZVAL) { + if (MAY_BE_ANY == MAY_BE_DOUBLE) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); + } + } else if (((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1<>32)); + } else { + dasm_put(Dst, 3918, Z_LVAL_P(zv)); + } +#line 11701 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opline->op1_type == IS_TMP_VAR) { + //| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ret_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(op1_addr)) { + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(ret_addr)), (Z_REG(ret_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(ret_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(ret_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(ret_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(ret_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ret_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ret_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(ret_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(ret_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(ret_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(ret_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info)); + } +#line 11704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->op1_type == IS_CV) { + if (op1_info & MAY_BE_REF) { + //| LOAD_ZVAL_ADDR r0, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 6465, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 6473, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11707 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF r0, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 3837, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 11708 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + } + //| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ret_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(op1_addr)) { + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(ret_addr)), (Z_REG(ret_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(ret_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(ret_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(ret_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(ret_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ret_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ret_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(ret_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(ret_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(ret_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(ret_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info)); + } +#line 11711 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + (op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) || + !op_array->function_name) { + //| TRY_ADDREF op1_info, ah, r2 + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2233); + } +#line 11716 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (return_value_used != 1) { + //| // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr); + //| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 11719 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if (op1_info & MAY_BE_REF) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, offsetof(zend_reference, val)); + + //| IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11726 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); +#line 11727 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr); + //| GET_ZVAL_PTR r0, op1_addr + dasm_put(Dst, 70); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 11730 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // ZVAL_COPY_VALUE(return_value, &ref->value); + //| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_R2, ZREG_R2 + dasm_put(Dst, 6009, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(ret_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(ref_addr)) { + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(ref_addr)), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(ret_addr)), (Z_REG(ret_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (Z_REG(ret_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(ret_addr)), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(ret_addr)), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (Z_REG(ret_addr) != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (Z_REG(ret_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(ref_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(ref_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(ref_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(ref_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(ref_addr))); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else if (Z_MODE(ref_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(ref_addr)) { + dasm_put(Dst, 1782, (Z_REG(ref_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(ref_addr) == IS_REG) { + if (Z_MODE(ret_addr) == IS_REG) { + if (Z_REG(ref_addr) != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(ref_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(ref_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(ret_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(ret_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(ref_addr) != IS_REG || ZREG_XMM0 != Z_REG(ref_addr)) { + if (Z_MODE(ref_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(ref_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(ref_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(ref_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(ref_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(ref_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(ref_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + } else if (Z_MODE(ref_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ref_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(ret_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(ret_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R2), (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info)); + } +#line 11732 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF r0 + //| je >2 + //| // if (IS_REFCOUNTED()) + dasm_put(Dst, 7045); +#line 11735 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (jit_return_label >= 0) { + //| IF_NOT_REFCOUNTED dh, =>jit_return_label + dasm_put(Dst, 7053, jit_return_label); +#line 11737 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_REFCOUNTED dh, >9 + dasm_put(Dst, 7060); +#line 11739 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ADDREF + //| GET_ZVAL_PTR r2, ret_addr // reload + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); +#line 11742 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_ADDREF r2 + dasm_put(Dst, 7068, (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); +#line 11743 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (jit_return_label >= 0) { + //| jmp =>jit_return_label + dasm_put(Dst, 1614, jit_return_label); +#line 11745 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 11747 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + //| EFREE_REFERENCE r0 + dasm_put(Dst, 4400); + #if ZEND_DEBUG + dasm_put(Dst, 4094); + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + #else + #ifdef HAVE_BUILTIN_CONSTANT_P + if (MAY_USE_32BIT_ADDR(_efree_32)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree_32)); + } else { + if (IS_SIGNED_32BIT(_efree_32)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree_32)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree_32)), (unsigned int)((((ptrdiff_t)_efree_32))>>32)); + } + dasm_put(Dst, 66); + } + #else + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + #endif + #endif +#line 11750 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (jit_return_label >= 0) { + //| jmp =>jit_return_label + dasm_put(Dst, 1614, jit_return_label); +#line 11752 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 11754 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 11756 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ret_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(op1_addr)) { + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(ret_addr)), (Z_REG(ret_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(ret_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(ret_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(ret_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(ret_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(ret_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(ret_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(ret_addr))); + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(ret_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } else if (Z_MODE(ret_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(ret_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(ret_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(ret_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(ret_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(ret_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(ret_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(ret_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(ret_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(ret_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(ret_addr)), Z_OFFSET(ret_addr)+offsetof(zval,u1.type_info)); + } +#line 11758 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|9: + dasm_put(Dst, 4230); +#line 11761 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_zval_copy_deref(dasm_State **Dst, zend_jit_addr res_addr, zend_jit_addr val_addr, zend_reg type_reg) +{ + ZEND_ASSERT(type_reg == ZREG_R2); + + //|.if not(X64) +#line 11770 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_W2 r0, val_addr +#line 11772 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.endif + //| GET_ZVAL_PTR r1, val_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 11774 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) +#line 11776 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_W2 r0, val_addr +#line 11778 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.endif + //| IF_NOT_REFCOUNTED dh, >2 + //| IF_NOT_TYPE dl, IS_REFERENCE, >1 + //| GET_Z_TYPE_INFO edx, r1+offsetof(zend_reference, val) + //|.if not(X64) + //| GET_Z_W2 r0, r1+offsetof(zend_reference, val) + //|.endif + //| GET_Z_PTR r1, r1+offsetof(zend_reference, val) + //| IF_NOT_REFCOUNTED dh, >2 + //|1: + //| GC_ADDREF r1 + //|2: + //| SET_ZVAL_PTR res_addr, r1 + dasm_put(Dst, 7079, (Z_REG(val_addr)), Z_OFFSET(val_addr), IS_REFERENCE, offsetof(zend_reference, val)+offsetof(zval,u1.type_info), offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 11791 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| SET_ZVAL_W2 res_addr, r0 + //|.endif + //| SET_ZVAL_TYPE_INFO res_addr, edx + dasm_put(Dst, 6519, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 7123, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 11795 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_fetch_dim_read(dasm_State **Dst, + const zend_op *opline, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + uint32_t op1_info, + zend_jit_addr op1_addr, + bool op1_avoid_refcounting, + uint32_t op2_info, + uint32_t res_info, + zend_jit_addr res_addr, + uint8_t dim_type) +{ + zend_jit_addr orig_op1_addr, op2_addr; + const void *exit_addr = NULL; + const void *not_found_exit_addr = NULL; + const void *res_exit_addr = NULL; + bool result_avoid_refcounting = 0; + uint32_t may_be_string = (opline->opcode != ZEND_FETCH_LIST_R) ? MAY_BE_STRING : 0; + int may_throw = 0; + + orig_op1_addr = OP1_ADDR(); + op2_addr = OP2_ADDR(); + + if (opline->opcode != ZEND_FETCH_DIM_IS + && JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + } + + if ((res_info & MAY_BE_GUARD) + && JIT_G(current_frame) + && (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY) { + uint32_t flags = 0; + uint32_t old_op1_info = 0; + uint32_t old_info; + zend_jit_trace_stack *stack = JIT_G(current_frame)->stack; + int32_t exit_point; + + if (opline->opcode != ZEND_FETCH_LIST_R + && (opline->op1_type & (IS_VAR|IS_TMP_VAR)) + && !op1_avoid_refcounting) { + flags |= ZEND_JIT_EXIT_FREE_OP1; + } + if ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) + && (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + flags |= ZEND_JIT_EXIT_FREE_OP2; + } + if ((opline->result_type & (IS_VAR|IS_TMP_VAR)) + && !(flags & ZEND_JIT_EXIT_FREE_OP1) + && (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) + && (ssa_op+1)->op1_use == ssa_op->result_def + && !(op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF) - (MAY_BE_STRING|MAY_BE_LONG))) + && zend_jit_may_avoid_refcounting(opline+1, res_info)) { + result_avoid_refcounting = 1; + ssa->var_info[ssa_op->result_def].avoid_refcounting = 1; + } + + if (op1_avoid_refcounting) { + old_op1_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var)); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE); + } + + if (!(op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF) - (MAY_BE_STRING|MAY_BE_LONG)))) { + old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_ZVAL_COPY_GPR0); + exit_point = zend_jit_trace_get_exit_point(opline+1, flags); + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info); + res_exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!res_exit_addr) { + return 0; + } + res_info &= ~MAY_BE_GUARD; + ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; + } + + if (opline->opcode == ZEND_FETCH_DIM_IS + && !(res_info & MAY_BE_NULL)) { + old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_NULL, 0); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_NULL); + exit_point = zend_jit_trace_get_exit_point(opline+1, flags); + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info); + not_found_exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!not_found_exit_addr) { + return 0; + } + } + + if (op1_avoid_refcounting) { + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_op1_info); + } + } + + if (op1_info & MAY_BE_REF) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11898 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 11899 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + + if (op1_info & MAY_BE_ARRAY) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY)) { + if (exit_addr && !(op1_info & (MAY_BE_OBJECT|may_be_string))) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_ARRAY, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_ARRAY, (ptrdiff_t)(exit_addr)); +#line 11906 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_ARRAY, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4379, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_ARRAY); +#line 11908 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11911 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if ((op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_STRING))) || + (opline->opcode != ZEND_FETCH_DIM_IS && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE)) { + may_throw = 1; + } + if (!zend_jit_fetch_dimension_address_inner(Dst, opline, (opline->opcode != ZEND_FETCH_DIM_IS) ? BP_VAR_R : BP_VAR_IS, op1_info, op2_info, dim_type, res_exit_addr, not_found_exit_addr, exit_addr)) { + return 0; + } + } + + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_ARRAY)) { + if (op1_info & MAY_BE_ARRAY) { + //|.cold_code + dasm_put(Dst, 276); +#line 11923 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 11924 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (opline->opcode != ZEND_FETCH_LIST_R && (op1_info & MAY_BE_STRING)) { + may_throw = 1; + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_STRING))) { + if (exit_addr && !(op1_info & MAY_BE_OBJECT)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING, (ptrdiff_t)(exit_addr)); +#line 11931 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING); +#line 11933 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 11936 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11937 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_FETCH_DIM_IS) { + if ((op2_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) == MAY_BE_LONG) { + //| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op2_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op2_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op2_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op2_addr))); + } + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else if (Z_MODE(op2_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op2_addr)) { + dasm_put(Dst, 1782, (Z_REG(op2_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11940 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_fetch_dim_str_offset_r_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_str_offset_r_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_str_offset_r_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_str_offset_r_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_str_offset_r_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_str_offset_r_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_str_offset_r_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 11941 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11943 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_fetch_dim_str_r_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_str_r_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_str_r_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_str_r_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_str_r_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_str_r_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_str_r_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 11944 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_PTR res_addr, r0 + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 11946 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_STRING + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_STRING); +#line 11947 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11949 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11951 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + //| EXT_CALL zend_jit_fetch_dim_str_is_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_str_is_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_str_is_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_str_is_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_str_is_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_str_is_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_str_is_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 11956 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 12 + //|.endif + } + if ((op1_info & MAY_BE_ARRAY) || + (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_STRING)))) { + //| jmp >9 // END + dasm_put(Dst, 3717); +#line 11963 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|6: + dasm_put(Dst, 3411); +#line 11965 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (op1_info & MAY_BE_OBJECT) { + may_throw = 1; + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_OBJECT|may_be_string))) { + if (exit_addr) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT, (ptrdiff_t)(exit_addr)); +#line 11972 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT); +#line 11974 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 11977 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11979 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type == IS_CONST && Z_EXTRA_P(RT_CONSTANT(opline, opline->op2)) == ZEND_EXTRA_VALUE) { + ZEND_ASSERT(Z_MODE(op2_addr) == IS_CONST_ZVAL); + //| LOAD_ADDR FCARG2a, (Z_ZV(op2_addr) + 1) + if (IS_SIGNED_32BIT((Z_ZV(op2_addr) + 1))) { + dasm_put(Dst, 751, ((ptrdiff_t)(Z_ZV(op2_addr) + 1))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)(Z_ZV(op2_addr) + 1))), (unsigned int)((((ptrdiff_t)(Z_ZV(op2_addr) + 1)))>>32)); + } +#line 11983 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11985 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 11988 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + if (opline->opcode != ZEND_FETCH_DIM_IS) { + //| EXT_CALL zend_jit_fetch_dim_obj_r_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_obj_r_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_obj_r_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_obj_r_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_obj_r_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_obj_r_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_obj_r_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 11994 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_fetch_dim_obj_is_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_obj_is_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_obj_is_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_obj_is_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_obj_is_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_obj_is_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_obj_is_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 11996 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + if ((op1_info & MAY_BE_ARRAY) || + (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_OBJECT|may_be_string)))) { + //| jmp >9 // END + dasm_put(Dst, 3717); +#line 12003 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|6: + dasm_put(Dst, 3411); +#line 12005 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if ((op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_ARRAY|MAY_BE_OBJECT|may_be_string))) + && (!exit_addr || !(op1_info & (MAY_BE_ARRAY|MAY_BE_OBJECT|may_be_string)))) { + if ((opline->opcode != ZEND_FETCH_DIM_IS && (op1_info & MAY_BE_UNDEF)) || (op2_info & MAY_BE_UNDEF)) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12011 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_FETCH_DIM_IS && (op1_info & MAY_BE_UNDEF)) { + may_throw = 1; + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12014 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 7131, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12017 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12018 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (op2_info & MAY_BE_UNDEF) { + may_throw = 1; + //| IF_NOT_ZVAL_TYPE op2_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); +#line 12023 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op2.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 7131, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_UNDEF, opline->op2.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12025 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12026 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (opline->opcode != ZEND_FETCH_DIM_IS && opline->opcode != ZEND_FETCH_LIST_R) { + may_throw = 1; + if ((op1_info & MAY_BE_UNDEF) || (op2_info & MAY_BE_UNDEF)) { + //| LOAD_ZVAL_ADDR FCARG1a, orig_op1_addr + if (Z_MODE(orig_op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(orig_op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(orig_op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(orig_op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(orig_op1_addr)))>>32)); + } + } else if (Z_MODE(orig_op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(orig_op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(orig_op1_addr)), Z_OFFSET(orig_op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(orig_op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12033 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12035 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || + Z_REG(op1_addr) != ZREG_FCARG1 || + Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12039 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| EXT_CALL zend_jit_invalid_array_access, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_array_access)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_array_access)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_array_access)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_array_access)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_array_access)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_array_access))>>32)); + } + dasm_put(Dst, 66); + } +#line 12042 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 12044 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_ARRAY) { + //| jmp >9 // END + dasm_put(Dst, 3717); +#line 12046 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & MAY_BE_ARRAY) { + //|.code + dasm_put(Dst, 373); +#line 12051 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & MAY_BE_ARRAY) { + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + + //|8: + dasm_put(Dst, 4331); +#line 12058 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (res_exit_addr) { + uint8_t type = concrete_type(res_info); + + if ((op1_info & MAY_BE_ARRAY_OF_REF) + && dim_type != IS_UNKNOWN + && dim_type != IS_REFERENCE) { + if (type < IS_STRING) { + //| IF_NOT_ZVAL_TYPE val_addr, type, >1 + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 12066 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3386, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), type); +#line 12067 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| IF_NOT_ZVAL_TYPE val_addr, IS_REFERENCE, &res_exit_addr + dasm_put(Dst, 70); + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 12069 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_Z_PTR r0, r0 + //| add r0, offsetof(zend_reference, val) + //| IF_ZVAL_TYPE val_addr, type, >1 + dasm_put(Dst, 7146, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), IS_REFERENCE, (ptrdiff_t)(res_exit_addr), offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 12072 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp &res_exit_addr + //|.code + dasm_put(Dst, 7165, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), type, (ptrdiff_t)(res_exit_addr)); +#line 12074 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12075 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_TYPE_INFO edx, val_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 12077 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_TYPE dl, type, >1 + //|.cold_code + dasm_put(Dst, 7182, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info), type); +#line 12079 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| IF_NOT_TYPE dl, IS_REFERENCE, &res_exit_addr + //| GET_Z_PTR r0, r0 + //| add r0, offsetof(zend_reference, val) + //| GET_ZVAL_TYPE_INFO edx, val_addr + dasm_put(Dst, 7199, IS_REFERENCE, (ptrdiff_t)(res_exit_addr), offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 12084 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_TYPE dl, type, >1 + //| jmp &res_exit_addr + //|.code + dasm_put(Dst, 7216, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info), type, (ptrdiff_t)(res_exit_addr)); +#line 12087 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12088 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (op1_info & MAY_BE_ARRAY_OF_REF) { + //| ZVAL_DEREF r0, MAY_BE_REF + if (MAY_BE_REF & MAY_BE_REF) { + dasm_put(Dst, 3837, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 12092 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (type < IS_STRING) { + //| IF_NOT_ZVAL_TYPE val_addr, type, &res_exit_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), type, (ptrdiff_t)(res_exit_addr)); +#line 12095 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_TYPE_INFO edx, val_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); +#line 12097 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_TYPE dl, type, &res_exit_addr + dasm_put(Dst, 7236, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info), type, (ptrdiff_t)(res_exit_addr)); +#line 12098 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //| // ZVAL_COPY + //|7: + //| ZVAL_COPY_VALUE_V res_addr, -1, val_addr, res_info, ZREG_R0, ZREG_R1 + dasm_put(Dst, 4482); + if (res_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(res_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } +#line 12104 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (type < IS_STRING) { + if (Z_REG(res_addr) != ZREG_FP || + JIT_G(current_frame) == NULL || + STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(Z_OFFSET(res_addr))) != type) { + //| SET_ZVAL_TYPE_INFO res_addr, type + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); +#line 12110 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, edx + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 7123, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 12113 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!result_avoid_refcounting) { + //| TRY_ADDREF res_info, dh, r1 + if (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (res_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 4107); + } + dasm_put(Dst, 2199); + } +#line 12115 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) { + return 0; + } + } else if (op1_info & MAY_BE_ARRAY_OF_REF) { + //| // ZVAL_COPY_DEREF + //| GET_ZVAL_TYPE_INFO Rd(ZREG_R2), val_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); +#line 12123 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_zval_copy_deref(Dst, res_addr, val_addr, ZREG_R2)) { + return 0; + } + } else { + //| // ZVAL_COPY + //| ZVAL_COPY_VALUE res_addr, -1, val_addr, res_info, ZREG_R1, ZREG_R2 + if (res_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(res_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((res_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(res_info & MAY_BE_GUARD) && + has_concrete_type(res_info & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (res_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(res_info); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 12129 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF res_info, ch, r2 + if (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (res_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2225); + } + dasm_put(Dst, 2233); + } +#line 12130 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|9: // END + dasm_put(Dst, 4230); +#line 12133 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + +#ifdef ZEND_JIT_USE_RC_INFERENCE + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) && (op1_info & MAY_BE_OBJECT)) { + /* Magic offsetGet() may increase refcount of the key */ + op2_info |= MAY_BE_RCN; + } +#endif + + if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) { + if ((op2_info & MAY_HAVE_DTOR) && (op2_info & MAY_BE_RC1)) { + may_throw = 1; + } + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 12146 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode != ZEND_FETCH_LIST_R && !op1_avoid_refcounting) { + if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { + if ((op1_info & MAY_HAVE_DTOR) && (op1_info & MAY_BE_RC1)) { + may_throw = 1; + } + //| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 12153 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (may_throw) { + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_fetch_dim(dasm_State **Dst, + const zend_op *opline, + uint32_t op1_info, + zend_jit_addr op1_addr, + uint32_t op2_info, + zend_jit_addr res_addr, + uint8_t dim_type) +{ + zend_jit_addr op2_addr; + int may_throw = 0; + + op2_addr = (opline->op2_type != IS_UNUSED) ? OP2_ADDR() : 0; + + if (opline->opcode == ZEND_FETCH_DIM_RW) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12180 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_REF) { + may_throw = 1; + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12184 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE FCARG1a, IS_REFERENCE, >1 + //| GET_Z_PTR FCARG2a, FCARG1a + //| IF_NOT_TYPE byte [FCARG2a + offsetof(zend_reference, val) + offsetof(zval, u1.v.type)], IS_ARRAY, >2 + //| lea FCARG1a, [FCARG2a + offsetof(zend_reference, val)] + //| jmp >3 + //|.cold_code + dasm_put(Dst, 4334, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val) + offsetof(zval, u1.v.type), IS_ARRAY, offsetof(zend_reference, val)); +#line 12190 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 12191 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_FETCH_DIM_RW) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12193 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_prepare_assign_dim_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_prepare_assign_dim_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_prepare_assign_dim_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_prepare_assign_dim_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_prepare_assign_dim_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_prepare_assign_dim_ref)), (unsigned int)((((ptrdiff_t)zend_jit_prepare_assign_dim_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 12195 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| mov FCARG1a, r0 + //| jne >1 + //| jmp ->exception_handler_undef + //|.code + dasm_put(Dst, 4363); +#line 12200 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12201 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + + if (op1_info & MAY_BE_ARRAY) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_ARRAY, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4379, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_ARRAY); +#line 12207 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + //| SEPARATE_ARRAY op1_addr, op1_info, 1 + dasm_put(Dst, 333); + if (RC_MAY_BE_N(op1_info)) { + if (Z_REG(op1_addr) != ZREG_FP) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R0), (ZREG_R0)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_R0 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_R0)); + } + } else { + ZEND_UNREACHABLE(); + } + if (RC_MAY_BE_1(op1_info)) { + dasm_put(Dst, 4392); + } + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (MAY_USE_32BIT_ADDR(zend_jit_zval_array_dup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_zval_array_dup)); + } else { + if (IS_SIGNED_32BIT(zend_jit_zval_array_dup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_zval_array_dup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_zval_array_dup)), (unsigned int)((((ptrdiff_t)zend_jit_zval_array_dup))>>32)); + } + dasm_put(Dst, 66); + } + dasm_put(Dst, 4400); + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (RC_MAY_BE_1(op1_info)) { + dasm_put(Dst, 4406); + if (1) { + dasm_put(Dst, 4410); + dasm_put(Dst, 70); + } else { + dasm_put(Dst, 3684); + } + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4416, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + if (MAY_USE_32BIT_ADDR(zend_array_dup)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_dup)); + } else { + if (IS_SIGNED_32BIT(zend_array_dup)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_dup)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_dup)), (unsigned int)((((ptrdiff_t)zend_array_dup))>>32)); + } + dasm_put(Dst, 66); + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4435, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); + if (RC_MAY_BE_1(op1_info)) { + if (1) { + dasm_put(Dst, 2938); + } + } + dasm_put(Dst, 2065); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + } +#line 12210 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { + if (op1_info & MAY_BE_ARRAY) { + //|.cold_code + dasm_put(Dst, 276); +#line 12214 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 12215 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + //| CMP_ZVAL_TYPE op1_addr, IS_NULL + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12218 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jg >7 + dasm_put(Dst, 4447, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_NULL); +#line 12219 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov T1, Ra(Z_REG(op1_addr)) // save + dasm_put(Dst, 3552, (Z_REG(op1_addr))); +#line 12222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if ((op1_info & MAY_BE_UNDEF) + && opline->opcode == ZEND_FETCH_DIM_RW) { + may_throw = 1; + if (op1_info & MAY_BE_NULL) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 12228 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG1a, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 798, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12231 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12232 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ZVAL_ARR(container, zend_new_array(8)); + //| EXT_CALL _zend_new_array_0, r0 + if (MAY_USE_32BIT_ADDR(_zend_new_array_0)) { + dasm_put(Dst, 53, (ptrdiff_t)(_zend_new_array_0)); + } else { + if (IS_SIGNED_32BIT(_zend_new_array_0)) { + dasm_put(Dst, 56, ((ptrdiff_t)_zend_new_array_0)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_zend_new_array_0)), (unsigned int)((((ptrdiff_t)_zend_new_array_0))>>32)); + } + dasm_put(Dst, 66); + } +#line 12235 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FP) { + //| mov Ra(Z_REG(op1_addr)), T1 // restore + dasm_put(Dst, 3574, (Z_REG(op1_addr))); +#line 12237 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_LVAL op1_addr, r0 + if (Z_MODE(op1_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(op1_addr))); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } +#line 12239 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_ARRAY_EX + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12240 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, r0 + dasm_put(Dst, 4435, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_ARRAY_EX); +#line 12241 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_ARRAY) { + //| jmp >1 + //|.code + dasm_put(Dst, 3817); +#line 12244 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12245 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + //|6: + dasm_put(Dst, 3411); +#line 12250 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op2_type == IS_UNUSED) { + may_throw = 1; + //| // var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval)); + //| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval + dasm_put(Dst, 13); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 4174, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 4180, tsrm_tls_index, tsrm_tls_offset); + } +#line 12254 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_next_index_insert, r0 + dasm_put(Dst, 4460, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); + if (MAY_USE_32BIT_ADDR(zend_hash_next_index_insert)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_next_index_insert)); + } else { + if (IS_SIGNED_32BIT(zend_hash_next_index_insert)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_next_index_insert)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_next_index_insert)), (unsigned int)((((ptrdiff_t)zend_hash_next_index_insert))>>32)); + } + dasm_put(Dst, 66); + } +#line 12255 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // if (UNEXPECTED(!var_ptr)) { + //| test r0, r0 + //| jz >1 + //|.cold_code + dasm_put(Dst, 4465); +#line 12259 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // zend_throw_error(NULL, "Cannot add element to the array as the next element is already occupied"); + //| CANNOT_ADD_ELEMENT opline + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + dasm_put(Dst, 4474); + } else { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + dasm_put(Dst, 4478); + } +#line 12262 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_UNDEF + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 12263 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| //ZEND_VM_C_GOTO(assign_dim_op_ret_null); + //| jmp >8 + //|.code + dasm_put(Dst, 7251, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_UNDEF); +#line 12266 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_PTR res_addr, r0 + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 12267 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_INDIRECT + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_INDIRECT); +#line 12268 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + uint32_t type; + + switch (opline->opcode) { + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_LIST_W: + type = BP_VAR_W; + break; + case ZEND_FETCH_DIM_RW: + may_throw = 1; + type = BP_VAR_RW; + break; + case ZEND_FETCH_DIM_UNSET: + type = BP_VAR_UNSET; + break; + default: + ZEND_UNREACHABLE(); + } + + if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_STRING))) { + may_throw = 1; + } + if (!zend_jit_fetch_dimension_address_inner(Dst, opline, type, op1_info, op2_info, dim_type, NULL, NULL, NULL)) { + return 0; + } + + //|8: + //| SET_ZVAL_PTR res_addr, r0 + dasm_put(Dst, 4331); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 12296 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_INDIRECT + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_INDIRECT); +#line 12297 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (type == BP_VAR_RW || (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_STRING)))) { + //|.cold_code + dasm_put(Dst, 276); +#line 12300 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + dasm_put(Dst, 4230); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 12302 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >8 + //|.code + dasm_put(Dst, 7251, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 12304 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + may_throw = 1; + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + //|.cold_code + dasm_put(Dst, 276); +#line 12312 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 12313 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (opline->opcode != ZEND_FETCH_DIM_RW) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12317 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12320 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type == IS_UNUSED) { + //| xor FCARG2a, FCARG2a + dasm_put(Dst, 2390); +#line 12323 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->op2_type == IS_CONST && Z_EXTRA_P(RT_CONSTANT(opline, opline->op2)) == ZEND_EXTRA_VALUE) { + ZEND_ASSERT(Z_MODE(op2_addr) == IS_CONST_ZVAL); + //| LOAD_ADDR FCARG2a, (Z_ZV(op2_addr) + 1) + if (IS_SIGNED_32BIT((Z_ZV(op2_addr) + 1))) { + dasm_put(Dst, 751, ((ptrdiff_t)(Z_ZV(op2_addr) + 1))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)(Z_ZV(op2_addr) + 1))), (unsigned int)((((ptrdiff_t)(Z_ZV(op2_addr) + 1)))>>32)); + } +#line 12326 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12328 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12331 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + switch (opline->opcode) { + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_LIST_W: + //| EXT_CALL zend_jit_fetch_dim_obj_w_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_obj_w_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_obj_w_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_obj_w_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_obj_w_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_obj_w_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_obj_w_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12339 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_FETCH_DIM_RW: + //| EXT_CALL zend_jit_fetch_dim_obj_rw_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_dim_obj_rw_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_dim_obj_rw_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_dim_obj_rw_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_dim_obj_rw_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_dim_obj_rw_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_dim_obj_rw_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12342 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; +// case ZEND_FETCH_DIM_UNSET: +// | EXT_CALL zend_jit_fetch_dim_obj_unset_helper, r0 +// break; + default: + ZEND_UNREACHABLE(); + } + //|.if not(X64) + //| add r4, 12 + //|.endif + + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + //| jmp >8 // END + //|.code + dasm_put(Dst, 6865); +#line 12356 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + +#ifdef ZEND_JIT_USE_RC_INFERENCE + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) && (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY|MAY_BE_OBJECT))) { + /* ASSIGN_DIM may increase refcount of the key */ + op2_info |= MAY_BE_RCN; + } +#endif + + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) + && (op2_info & MAY_HAVE_DTOR) + && (op2_info & MAY_BE_RC1)) { + may_throw = 1; + } + //|8: + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + dasm_put(Dst, 4331); + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 12373 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (may_throw) { + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_isset_isempty_dim(dasm_State **Dst, + const zend_op *opline, + uint32_t op1_info, + zend_jit_addr op1_addr, + bool op1_avoid_refcounting, + uint32_t op2_info, + uint8_t dim_type, + int may_throw, + uint8_t smart_branch_opcode, + uint32_t target_label, + uint32_t target_label2, + const void *exit_addr) +{ + zend_jit_addr op2_addr, res_addr; + + // TODO: support for empty() ??? + ZEND_ASSERT(!(opline->extended_value & ZEND_ISEMPTY)); + + op2_addr = OP2_ADDR(); + res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + if (op1_info & MAY_BE_REF) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12406 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 12407 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + + if (op1_info & MAY_BE_ARRAY) { + const void *found_exit_addr = NULL; + const void *not_found_exit_addr = NULL; + + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY)) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_ARRAY, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4379, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_ARRAY); +#line 12416 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12418 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr + && !(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_ARRAY)) + && !may_throw + && (!(opline->op1_type & (IS_TMP_VAR|IS_VAR)) || op1_avoid_refcounting) + && (!(opline->op2_type & (IS_TMP_VAR|IS_VAR)) || !(op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)))) { + if (smart_branch_opcode == ZEND_JMPNZ) { + found_exit_addr = exit_addr; + } else { + not_found_exit_addr = exit_addr; + } + } + if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_JIT_IS, op1_info, op2_info, dim_type, found_exit_addr, not_found_exit_addr, NULL)) { + return 0; + } + + if (found_exit_addr) { + //|9: + dasm_put(Dst, 4230); +#line 12435 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; + } else if (not_found_exit_addr) { + //|8: + dasm_put(Dst, 4331); +#line 12438 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; + } + } + + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_ARRAY)) { + if (op1_info & MAY_BE_ARRAY) { + //|.cold_code + dasm_put(Dst, 276); +#line 12445 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 12446 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (op1_info & (MAY_BE_STRING|MAY_BE_OBJECT)) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12450 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12452 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->op2_type == IS_CONST && Z_EXTRA_P(RT_CONSTANT(opline, opline->op2)) == ZEND_EXTRA_VALUE) { + ZEND_ASSERT(Z_MODE(op2_addr) == IS_CONST_ZVAL); + //| LOAD_ADDR FCARG2a, (Z_ZV(op2_addr) + 1) + if (IS_SIGNED_32BIT((Z_ZV(op2_addr) + 1))) { + dasm_put(Dst, 751, ((ptrdiff_t)(Z_ZV(op2_addr) + 1))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)(Z_ZV(op2_addr) + 1))), (unsigned int)((((ptrdiff_t)(Z_ZV(op2_addr) + 1)))>>32)); + } +#line 12456 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, op2_addr + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op2_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op2_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op2_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op2_addr)))>>32)); + } + } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op2_addr)) { + dasm_put(Dst, 2376, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op2_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12458 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_isset_dim_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_isset_dim_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_isset_dim_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_isset_dim_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_isset_dim_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_isset_dim_helper)), (unsigned int)((((ptrdiff_t)zend_jit_isset_dim_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12460 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| jz >9 + dasm_put(Dst, 7265); +#line 12462 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_ARRAY) { + //| jmp >8 + //|.code + dasm_put(Dst, 6865); +#line 12465 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (op2_info & MAY_BE_UNDEF) { + if (op2_info & MAY_BE_ANY) { + //| IF_NOT_ZVAL_TYPE op2_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 12470 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12472 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op2.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op2.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12474 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12475 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_ARRAY) { + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 12479 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + +#ifdef ZEND_JIT_USE_RC_INFERENCE + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) && (op1_info & MAY_BE_OBJECT)) { + /* Magic offsetExists() may increase refcount of the key */ + op2_info |= MAY_BE_RCN; + } +#endif + + if (op1_info & (MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_OBJECT)) { + //|8: + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + dasm_put(Dst, 4331); + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 12493 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!op1_avoid_refcounting) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 12495 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (may_throw) { + if (!zend_jit_check_exception_undef_result(Dst, opline)) { + return 0; + } + } + if (!(opline->extended_value & ZEND_ISEMPTY)) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 12505 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >8 + dasm_put(Dst, 3802); +#line 12507 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp =>target_label2 + dasm_put(Dst, 1614, target_label2); +#line 12511 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 12513 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 12518 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >8 + dasm_put(Dst, 7273, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 12519 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| NIY // TODO: support for empty() + //ZEND_ASSERT(0); + dasm_put(Dst, 1503); +#line 12522 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //|9: // not found + //| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline + dasm_put(Dst, 4230); + if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + if ((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))); + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op2_info)) { + if (((op2_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op2_info)) { + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op2_info) & MAY_BE_GUARD) + && has_concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op2_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op2_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op2_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op2_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op2_info) && ((op2_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op2_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op2_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 12527 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!op1_avoid_refcounting) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 12529 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (may_throw) { + if (!zend_jit_check_exception_undef_result(Dst, opline)) { + return 0; + } + } + if (!(opline->extended_value & ZEND_ISEMPTY)) { + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 12539 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 12543 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + } else { + ZEND_UNREACHABLE(); + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 12549 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| NIY // TODO: support for empty() + //ZEND_ASSERT(0); + dasm_put(Dst, 1503); +#line 12552 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|8: + dasm_put(Dst, 4331); +#line 12555 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_bind_global(dasm_State **Dst, const zend_op *opline, uint32_t op1_info) +{ + zend_jit_addr op1_addr = OP1_ADDR(); + zend_string *varname = Z_STR_P(RT_CONSTANT(opline, opline->op2)); + + //| // idx = (uint32_t)(uintptr_t)CACHED_PTR(opline->extended_value) - 1; + //| mov FCARG2a, EX->run_time_cache + //| mov r0, aword [FCARG2a + opline->extended_value] + //| sub r0, 1 + //| // if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) + //| MEM_LOAD_ZTS ecx, dword, executor_globals, symbol_table.nNumUsed, r1 + dasm_put(Dst, 7286, Dt1(->run_time_cache), opline->extended_value); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } +#line 12570 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| shl r1, 5 + //|.else + //| imul r1, sizeof(Bucket) + //|.endif + //| cmp r0, r1 + //| jae >9 + //| // Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx); + //| MEM_LOAD_OP_ZTS add, r0, aword, executor_globals, symbol_table.arData, r1 + dasm_put(Dst, 7300, (executor_globals_offset+offsetof(zend_executor_globals, symbol_table.nNumUsed))); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 1808, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 1814, tsrm_tls_index, tsrm_tls_offset); + } +#line 12579 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE r0, IS_REFERENCE, >9 + //| // (EXPECTED(p->key == varname)) + //| ADDR_CMP aword [r0 + offsetof(Bucket, key)], varname, r1 + dasm_put(Dst, 7316, (executor_globals_offset+offsetof(zend_executor_globals, symbol_table.arData)), offsetof(zval, u1.v.type), IS_REFERENCE); + if (IS_SIGNED_32BIT(varname)) { + dasm_put(Dst, 5892, offsetof(Bucket, key), ((ptrdiff_t)varname)); + } else { + dasm_put(Dst, 5883, (unsigned int)(((ptrdiff_t)varname)), (unsigned int)((((ptrdiff_t)varname))>>32), offsetof(Bucket, key)); + } +#line 12582 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jne >9 + //| GET_Z_PTR r0, r0 + //| GC_ADDREF r0 + //|1: + dasm_put(Dst, 7329); +#line 12586 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| // if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) + //| IF_ZVAL_REFCOUNTED op1_addr, >2 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12590 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 7342, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); +#line 12591 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 12592 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // zend_refcounted *garbage = Z_COUNTED_P(variable_ptr); + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12595 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // ZVAL_REF(variable_ptr, ref) + //| SET_ZVAL_PTR op1_addr, r0 + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12597 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_REFERENCE_EX + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12598 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // if (GC_DELREF(garbage) == 0) + //| GC_DELREF FCARG1a + dasm_put(Dst, 7357, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_REFERENCE_EX); +#line 12600 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) { + //| jnz >3 + dasm_put(Dst, 303); +#line 12602 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jnz >5 + dasm_put(Dst, 4308); +#line 12604 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DTOR_FUNC op1_info, opline + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); +#line 12606 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >5 + dasm_put(Dst, 3406); +#line 12607 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) { + //|3: + //| // GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) + //| IF_GC_MAY_NOT_LEAK FCARG1a, >5 + //| EXT_CALL gc_possible_root, r1 + dasm_put(Dst, 7369, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 4520, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 4525, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 7381); + } +#line 12612 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >5 + dasm_put(Dst, 3406); +#line 12613 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //|.code + dasm_put(Dst, 373); +#line 12616 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| // ZVAL_REF(variable_ptr, ref) + //| SET_ZVAL_PTR op1_addr, r0 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 12622 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO op1_addr, IS_REFERENCE_EX + dasm_put(Dst, 2312, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info), IS_REFERENCE_EX); +#line 12623 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|5: + dasm_put(Dst, 509); +#line 12625 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //END of handler + + //|.cold_code + dasm_put(Dst, 276); +#line 12628 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| LOAD_ADDR FCARG1a, (ptrdiff_t)varname + dasm_put(Dst, 4230); + if (IS_SIGNED_32BIT((ptrdiff_t)varname)) { + dasm_put(Dst, 798, ((ptrdiff_t)(ptrdiff_t)varname)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)(ptrdiff_t)varname)), (unsigned int)((((ptrdiff_t)(ptrdiff_t)varname))>>32)); + } +#line 12630 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->extended_value) { + //| add FCARG2a, opline->extended_value + dasm_put(Dst, 7385, opline->extended_value); +#line 12632 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_fetch_global_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_global_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_global_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_global_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_global_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_global_helper)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_global_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 12634 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp <1 + //|.code + dasm_put(Dst, 7390); +#line 12636 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_verify_arg_type(dasm_State **Dst, const zend_op *opline, zend_arg_info *arg_info, bool check_exception) +{ + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + bool in_cold = 0; + uint32_t type_mask = ZEND_TYPE_PURE_MASK(arg_info->type) & MAY_BE_ANY; + zend_reg tmp_reg = (type_mask == 0 || is_power_of_two(type_mask)) ? ZREG_FCARG1 : ZREG_R0; + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && JIT_G(current_frame) + && JIT_G(current_frame)->prev) { + zend_jit_trace_stack *stack = JIT_G(current_frame)->stack; + uint8_t type = STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var)); + + if (type != IS_UNKNOWN && (type_mask & (1u << type))) { + return 1; + } + } + + if (ZEND_ARG_SEND_MODE(arg_info)) { + if (opline->opcode == ZEND_RECV_INIT) { + //| LOAD_ZVAL_ADDR Ra(tmp_reg), res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 1775, (tmp_reg), ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 1768, (tmp_reg), (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2496, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1782, (Z_REG(res_addr)), (tmp_reg)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12661 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF Ra(tmp_reg), MAY_BE_REF + if (MAY_BE_REF & MAY_BE_REF) { + dasm_put(Dst, 7396, (tmp_reg), offsetof(zval, u1.v.type), IS_REFERENCE, (tmp_reg), (tmp_reg), 0, (tmp_reg), offsetof(zend_reference, val)); + } +#line 12662 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + res_addr = ZEND_ADDR_MEM_ZVAL(tmp_reg, 0); + } else { + //| GET_ZVAL_PTR Ra(tmp_reg), res_addr + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (tmp_reg), (Z_REG(res_addr)), Z_OFFSET(res_addr)); +#line 12665 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + res_addr = ZEND_ADDR_MEM_ZVAL(tmp_reg, offsetof(zend_reference, val)); + } + } + + if (type_mask != 0) { + if (is_power_of_two(type_mask)) { + uint32_t type_code = concrete_type(type_mask); + //| IF_NOT_ZVAL_TYPE res_addr, type_code, >1 + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type), type_code); +#line 12673 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov edx, 1 + //| mov cl, byte [Ra(Z_REG(res_addr))+Z_OFFSET(res_addr)+offsetof(zval, u1.v.type)] + //| shl edx, cl + //| test edx, type_mask + //| je >1 + dasm_put(Dst, 7426, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type), type_mask); +#line 12679 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|.cold_code + dasm_put(Dst, 276); +#line 12682 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12683 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + in_cold = 1; + } + + if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12689 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12692 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ADDR_STORE aword EX->opline, opline, r0 + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } +#line 12694 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG2a, (ptrdiff_t)arg_info + if (IS_SIGNED_32BIT((ptrdiff_t)arg_info)) { + dasm_put(Dst, 751, ((ptrdiff_t)(ptrdiff_t)arg_info)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)(ptrdiff_t)arg_info)), (unsigned int)((((ptrdiff_t)(ptrdiff_t)arg_info))>>32)); + } +#line 12696 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_verify_arg_slow, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_verify_arg_slow)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_verify_arg_slow)); + } else { + if (IS_SIGNED_32BIT(zend_jit_verify_arg_slow)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_verify_arg_slow)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_verify_arg_slow)), (unsigned int)((((ptrdiff_t)zend_jit_verify_arg_slow))>>32)); + } + dasm_put(Dst, 66); + } +#line 12697 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (check_exception) { + //| test al, al + dasm_put(Dst, 5368); +#line 12700 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (in_cold) { + //| jnz >1 + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 6073); +#line 12704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12705 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz ->exception_handler + dasm_put(Dst, 6000); +#line 12707 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (in_cold) { + //| jmp >1 + //|.code + dasm_put(Dst, 3817); +#line 12711 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12712 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_recv(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array) +{ + uint32_t arg_num = opline->op1.num; + zend_arg_info *arg_info = NULL; + + if (op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) { + if (EXPECTED(arg_num <= op_array->num_args)) { + arg_info = &op_array->arg_info[arg_num-1]; + } else if (UNEXPECTED(op_array->fn_flags & ZEND_ACC_VARIADIC)) { + arg_info = &op_array->arg_info[op_array->num_args]; + } + if (arg_info && !ZEND_TYPE_IS_SET(arg_info->type)) { + arg_info = NULL; + } + } + + if (arg_info || (opline+1)->opcode != ZEND_RECV) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + if (!JIT_G(current_frame) || + TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)) < 0 || + arg_num > TRACE_FRAME_NUM_ARGS(JIT_G(current_frame))) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| cmp dword EX->This.u2.num_args, arg_num + //| jb &exit_addr + dasm_put(Dst, 7449, Dt1(->This.u2.num_args), arg_num, (ptrdiff_t)(exit_addr)); +#line 12746 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| cmp dword EX->This.u2.num_args, arg_num + //| jb >1 + //|.cold_code + dasm_put(Dst, 7458, Dt1(->This.u2.num_args), arg_num); +#line 12751 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 12752 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12754 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ADDR_STORE aword EX->opline, opline, r0 + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } +#line 12756 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG1a, FP + //| EXT_CALL zend_missing_arg_error, r0 + dasm_put(Dst, 73); + if (MAY_USE_32BIT_ADDR(zend_missing_arg_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_missing_arg_error)); + } else { + if (IS_SIGNED_32BIT(zend_missing_arg_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_missing_arg_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_missing_arg_error)), (unsigned int)((((ptrdiff_t)zend_missing_arg_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 12759 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 5915); +#line 12761 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (arg_info) { + if (!zend_jit_verify_arg_type(Dst, opline, arg_info, 1)) { + return 0; + } + } + + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { + if ((opline+1)->opcode != ZEND_RECV && (opline+1)->opcode != ZEND_RECV_INIT) { + //| LOAD_IP_ADDR (opline + 1) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32), Dt1(->opline)); + } + } +#line 12773 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + zend_jit_set_last_valid_opline(opline + 1); + } + } + + return 1; +} + +static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, bool is_last, int may_throw) +{ + uint32_t arg_num = opline->op1.num; + zval *zv = RT_CONSTANT(opline, opline->op2); + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && JIT_G(current_frame) + && TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)) >= 0) { + if (arg_num > TRACE_FRAME_NUM_ARGS(JIT_G(current_frame))) { + //| ZVAL_COPY_CONST res_addr, -1, -1, zv, ZREG_R0 + if (Z_TYPE_P(zv) > IS_TRUE) { + if (Z_TYPE_P(zv) == IS_DOUBLE) { + zend_reg dst_reg = (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else if (!IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)zv)), (unsigned int)((((uintptr_t)zv))>>32)); + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } else { + dasm_put(Dst, 2028, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } + } else { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } else { + dasm_put(Dst, 1988, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (dst_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_TYPE_P(zv) == IS_LONG && -1 == MAY_BE_DOUBLE) { + zend_reg dst_reg = (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (dst_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_LVAL_P(zv) == 0 && Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + } else { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R0), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(res_addr)), Z_OFFSET(res_addr), Z_LVAL_P(zv)); + } + } + } + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (-1 == MAY_BE_DOUBLE) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); + } + } else if (((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1<>32)); + } else { + dasm_put(Dst, 3918, Z_LVAL_P(zv)); + } +#line 12793 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || + (op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + //| cmp dword EX->This.u2.num_args, arg_num + //| jae >5 + dasm_put(Dst, 7469, Dt1(->This.u2.num_args), arg_num); +#line 12800 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_COPY_CONST res_addr, -1, -1, zv, ZREG_R0 + if (Z_TYPE_P(zv) > IS_TRUE) { + if (Z_TYPE_P(zv) == IS_DOUBLE) { + zend_reg dst_reg = (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else if (!IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)zv)), (unsigned int)((((uintptr_t)zv))>>32)); + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } else { + dasm_put(Dst, 2028, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } + } else { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } else { + dasm_put(Dst, 1988, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (dst_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_TYPE_P(zv) == IS_LONG && -1 == MAY_BE_DOUBLE) { + zend_reg dst_reg = (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (dst_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_LVAL_P(zv) == 0 && Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + } else { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R0), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(res_addr)), Z_OFFSET(res_addr), Z_LVAL_P(zv)); + } + } + } + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (-1 == MAY_BE_DOUBLE) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); + } + } else if (((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1<>32)); + } else { + dasm_put(Dst, 3918, Z_LVAL_P(zv)); + } +#line 12804 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (Z_CONSTANT_P(zv)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 12810 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| ADDR_STORE aword EX->opline, opline, r0 + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } +#line 12812 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG1a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2341, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12814 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX->func + //| mov FCARG2a, [r0 + offsetof(zend_op_array, scope)] + //| .if X64 + //| EXT_CALL zval_update_constant_ex, r0 + dasm_put(Dst, 7479, Dt1(->func), offsetof(zend_op_array, scope)); + if (MAY_USE_32BIT_ADDR(zval_update_constant_ex)) { + dasm_put(Dst, 53, (ptrdiff_t)(zval_update_constant_ex)); + } else { + if (IS_SIGNED_32BIT(zval_update_constant_ex)) { + dasm_put(Dst, 56, ((ptrdiff_t)zval_update_constant_ex)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zval_update_constant_ex)), (unsigned int)((((ptrdiff_t)zval_update_constant_ex))>>32)); + } + dasm_put(Dst, 66); + } +#line 12818 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| .else + //| EXT_CALL zval_update_constant_ex, r0 + //| .endif + //| test al, al + //| jnz >1 + //|.cold_code + dasm_put(Dst, 7488); +#line 12824 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| ZVAL_PTR_DTOR res_addr, MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN, 1, 0, opline + dasm_put(Dst, 70); + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || RC_MAY_BE_1(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN)) { + if (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN)) { + if (1 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) + && has_concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (1 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (1 && (((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & MAY_BE_GUARD) || (RC_MAY_BE_N(MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 12826 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_UNDEF + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 12827 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 7496, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_UNDEF); +#line 12829 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|5: + dasm_put(Dst, 509); +#line 12832 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) { + do { + zend_arg_info *arg_info; + + if (arg_num <= op_array->num_args) { + arg_info = &op_array->arg_info[arg_num-1]; + } else if (op_array->fn_flags & ZEND_ACC_VARIADIC) { + arg_info = &op_array->arg_info[op_array->num_args]; + } else { + break; + } + if (!ZEND_TYPE_IS_SET(arg_info->type)) { + break; + } + if (!zend_jit_verify_arg_type(Dst, opline, arg_info, may_throw)) { + return 0; + } + } while (0); + } + + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { + if (is_last) { + //| LOAD_IP_ADDR (opline + 1) + if (GCC_GLOBAL_REGS) { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 1569, ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1574, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32)); + } + } else { + if (IS_SIGNED_32BIT((opline + 1))) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)(opline + 1))); + } else { + dasm_put(Dst, 1579, (unsigned int)(((ptrdiff_t)(opline + 1))), (unsigned int)((((ptrdiff_t)(opline + 1)))>>32), Dt1(->opline)); + } + } +#line 12856 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + zend_jit_set_last_valid_opline(opline + 1); + } + } + + return 1; +} + +static int zend_jit_class_guard(dasm_State **Dst, const zend_op *opline, zend_class_entry *ce) +{ + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //|.if X64 + if (!IS_SIGNED_32BIT(ce)) { + //| mov64 r0, ((ptrdiff_t)ce) + //| cmp aword [FCARG1a + offsetof(zend_object, ce)], r0 + dasm_put(Dst, 7510, (unsigned int)(((ptrdiff_t)ce)), (unsigned int)((((ptrdiff_t)ce))>>32), offsetof(zend_object, ce)); + } else { +#line 12877 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [FCARG1a + offsetof(zend_object, ce)], ce + dasm_put(Dst, 7519, offsetof(zend_object, ce), ce); + } +#line 12879 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| cmp aword [FCARG1a + offsetof(zend_object, ce)], ce + //|.endif + //| jne &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 12883 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_fetch_obj(dasm_State **Dst, + const zend_op *opline, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + uint32_t op1_info, + zend_jit_addr op1_addr, + bool op1_indirect, + zend_class_entry *ce, + bool ce_is_instanceof, + bool on_this, + bool delayed_fetch_this, + bool op1_avoid_refcounting, + zend_class_entry *trace_ce, + uint8_t prop_type, + int may_throw) +{ + zval *member; + zend_property_info *prop_info; + bool may_be_dynamic = 1; + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); + zend_jit_addr prop_addr; + uint32_t res_info = RES_INFO(); + bool type_loaded = 0; + + ZEND_ASSERT(opline->op2_type == IS_CONST); + ZEND_ASSERT(op1_info & MAY_BE_OBJECT); + + member = RT_CONSTANT(opline, opline->op2); + ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0'); + prop_info = zend_get_known_property_info(op_array, ce, Z_STR_P(member), on_this, op_array->filename); + + if (on_this) { + //| GET_ZVAL_PTR FCARG1a, this_addr + ZEND_ASSERT(Z_MODE(this_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(this_addr)), Z_OFFSET(this_addr)); +#line 12922 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (opline->op1_type == IS_VAR + && opline->opcode == ZEND_FETCH_OBJ_W + && (op1_info & MAY_BE_INDIRECT) + && Z_REG(op1_addr) == ZREG_FP) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12928 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE FCARG1a, IS_INDIRECT, >1 + //| GET_Z_PTR FCARG1a, FCARG1a + //|1: + dasm_put(Dst, 7525, offsetof(zval, u1.v.type), IS_INDIRECT); +#line 12931 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & MAY_BE_REF) { + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 12936 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 12938 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT, (ptrdiff_t)(exit_addr)); +#line 12949 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4379, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT); +#line 12951 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 12954 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) { + prop_info = zend_get_known_property_info(op_array, trace_ce, Z_STR_P(member), on_this, op_array->filename); + if (prop_info) { + ce = trace_ce; + ce_is_instanceof = 0; + if (!(op1_info & MAY_BE_CLASS_GUARD)) { + if (on_this && JIT_G(current_frame) + && TRACE_FRAME_IS_THIS_CLASS_CHECKED(JIT_G(current_frame))) { + ZEND_ASSERT(JIT_G(current_frame)->ce == ce); + } else if (zend_jit_class_guard(Dst, opline, ce)) { + if (on_this && JIT_G(current_frame)) { + JIT_G(current_frame)->ce = ce; + TRACE_FRAME_SET_THIS_CLASS_CHECKED(JIT_G(current_frame)); + } + } else { + return 0; + } + if (ssa->var_info && ssa_op->op1_use >= 0) { + ssa->var_info[ssa_op->op1_use].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op1_use].ce = ce; + ssa->var_info[ssa_op->op1_use].is_instanceof = ce_is_instanceof; + } + } + } + } + + if (!prop_info) { + //| mov r0, EX->run_time_cache + //| mov r2, aword [r0 + (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)] + //| cmp r2, aword [FCARG1a + offsetof(zend_object, ce)] + //| jne >5 + //| mov r0, aword [r0 + (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*)] + dasm_put(Dst, 7539, Dt1(->run_time_cache), (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS), offsetof(zend_object, ce), (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*)); +#line 12988 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + may_be_dynamic = zend_may_be_dynamic_property(ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename); + if (may_be_dynamic) { + //| test r0, r0 + dasm_put(Dst, 3655); +#line 12991 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_FETCH_OBJ_W) { + //| jl >5 + dasm_put(Dst, 7560); +#line 12993 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jl >8 // dynamic property + dasm_put(Dst, 7565); +#line 12995 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| mov edx, dword [FCARG1a + r0 + 8] + //| IF_UNDEF dl, >5 + //| add FCARG1a, r0 + dasm_put(Dst, 7570, 8); +#line 13000 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + type_loaded = 1; + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + if (opline->opcode == ZEND_FETCH_OBJ_W + && (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT)))) { + uint32_t flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS; + + //| mov r0, EX->run_time_cache + //| mov FCARG2a, aword [r0 + (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*) * 2] + //| test FCARG2a, FCARG2a + //| jnz >1 + //|.cold_code + dasm_put(Dst, 7585, Dt1(->run_time_cache), (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*) * 2); +#line 13011 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| test dword [FCARG2a + offsetof(zend_property_info, flags)], ZEND_ACC_READONLY + dasm_put(Dst, 7603, offsetof(zend_property_info, flags), ZEND_ACC_READONLY); +#line 13013 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (flags) { + //| jz >3 + dasm_put(Dst, 4027); +#line 13015 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz >4 + dasm_put(Dst, 287); +#line 13017 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| IF_NOT_Z_TYPE FCARG1a, IS_OBJECT, >2 + //| GET_Z_PTR r0, FCARG1a + //| GC_ADDREF r0 + //| SET_ZVAL_PTR res_addr, r0 + dasm_put(Dst, 7611, offsetof(zval, u1.v.type), IS_OBJECT); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13022 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_OBJECT_EX + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13023 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|2: + //| mov eax, dword [FCARG1a + offsetof(zval, u2.extra)] + //| test eax, IS_PROP_REINITABLE + //| jz >6 + //| and eax, ~IS_PROP_REINITABLE + //| mov dword [FCARG1a + offsetof(zval, u2.extra)], eax + dasm_put(Dst, 7626, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_OBJECT_EX, offsetof(zval, u2.extra), IS_PROP_REINITABLE, ~IS_PROP_REINITABLE, offsetof(zval, u2.extra)); +#line 13030 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (flags) { + //| jmp >3 + dasm_put(Dst, 3991); +#line 13032 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >4 + dasm_put(Dst, 328); +#line 13034 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|6: + //| mov FCARG1a, FCARG2a + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 7656); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13038 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_readonly_property_modification_error, r0 + if (MAY_USE_32BIT_ADDR(zend_readonly_property_modification_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_readonly_property_modification_error)); + } else { + if (IS_SIGNED_32BIT(zend_readonly_property_modification_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_readonly_property_modification_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_readonly_property_modification_error)), (unsigned int)((((ptrdiff_t)zend_readonly_property_modification_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 13039 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, _IS_ERROR + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13040 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|3: + dasm_put(Dst, 7663, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), _IS_ERROR); +#line 13042 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (flags == ZEND_FETCH_DIM_WRITE) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13044 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_check_array_promotion, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_check_array_promotion)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_check_array_promotion)); + } else { + if (IS_SIGNED_32BIT(zend_jit_check_array_promotion)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_check_array_promotion)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_check_array_promotion)), (unsigned int)((((ptrdiff_t)zend_jit_check_array_promotion))>>32)); + } + dasm_put(Dst, 66); + } +#line 13045 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + dasm_put(Dst, 3717); +#line 13046 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (flags == ZEND_FETCH_REF) { + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13049 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + //| EXT_CALL zend_jit_create_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_create_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_create_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_create_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_create_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_create_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_create_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 13054 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 12 + //|.endif + //| jmp >9 + dasm_put(Dst, 3717); +#line 13058 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_ASSERT(flags == 0); + } + //|.code + dasm_put(Dst, 373); +#line 13062 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + dasm_put(Dst, 375); +#line 13063 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, prop_info->offset); + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + if (opline->opcode == ZEND_FETCH_OBJ_W || !(res_info & MAY_BE_GUARD) || !JIT_G(current_frame)) { + /* perform IS_UNDEF check only after result type guard (during deoptimization) */ + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + type_loaded = 1; + //| mov edx, dword [FCARG1a + prop_info->offset + 8] + //| IF_UNDEF dl, &exit_addr + dasm_put(Dst, 7678, prop_info->offset + 8, (ptrdiff_t)(exit_addr)); +#line 13078 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + type_loaded = 1; + //| mov edx, dword [FCARG1a + prop_info->offset + 8] + //| IF_UNDEF dl, >5 + dasm_put(Dst, 7687, prop_info->offset + 8); +#line 13083 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_FETCH_OBJ_W && (prop_info->flags & ZEND_ACC_READONLY)) { + if (!type_loaded) { + type_loaded = 1; + //| mov edx, dword [FCARG1a + prop_info->offset + offsetof(zval, u1.type_info)] + dasm_put(Dst, 7697, prop_info->offset + offsetof(zval, u1.type_info)); +#line 13088 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| IF_NOT_TYPE dl, IS_OBJECT, >4 + //| GET_ZVAL_PTR r0, prop_addr + dasm_put(Dst, 7701, IS_OBJECT); + ZEND_ASSERT(Z_MODE(prop_addr) == IS_MEM_ZVAL); +#line 13091 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_ADDREF r0 + //| SET_ZVAL_PTR res_addr, r0 + dasm_put(Dst, 7710, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13093 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_OBJECT_EX + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13094 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|.cold_code + dasm_put(Dst, 7721, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_OBJECT_EX); +#line 13096 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + //| mov eax, dword [FCARG1a + prop_info->offset + offsetof(zval, u2.extra)] + //| test eax, IS_PROP_REINITABLE + //| jz >6 + //| and eax, ~IS_PROP_REINITABLE + //| mov dword [FCARG1a + prop_info->offset + offsetof(zval, u2.extra)], eax + //| jmp >4 + //|6: + //| LOAD_ADDR FCARG1a, prop_info + dasm_put(Dst, 7735, prop_info->offset + offsetof(zval, u2.extra), IS_PROP_REINITABLE, ~IS_PROP_REINITABLE, prop_info->offset + offsetof(zval, u2.extra)); + if (IS_SIGNED_32BIT(prop_info)) { + dasm_put(Dst, 798, ((ptrdiff_t)prop_info)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)prop_info)), (unsigned int)((((ptrdiff_t)prop_info))>>32)); + } +#line 13105 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13106 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_readonly_property_modification_error, r0 + if (MAY_USE_32BIT_ADDR(zend_readonly_property_modification_error)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_readonly_property_modification_error)); + } else { + if (IS_SIGNED_32BIT(zend_readonly_property_modification_error)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_readonly_property_modification_error)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_readonly_property_modification_error)), (unsigned int)((((ptrdiff_t)zend_readonly_property_modification_error))>>32)); + } + dasm_put(Dst, 66); + } +#line 13107 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, _IS_ERROR + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13108 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|.code + dasm_put(Dst, 7759, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), _IS_ERROR); +#line 13110 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + dasm_put(Dst, 375); +#line 13111 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_FETCH_OBJ_W + && (opline->extended_value & ZEND_FETCH_OBJ_FLAGS) + && ZEND_TYPE_IS_SET(prop_info->type)) { + uint32_t flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS; + + if (flags == ZEND_FETCH_DIM_WRITE) { + if ((ZEND_TYPE_FULL_MASK(prop_info->type) & MAY_BE_ARRAY) == 0) { + if (!type_loaded) { + type_loaded = 1; + //| mov edx, dword [FCARG1a + prop_info->offset + 8] + dasm_put(Dst, 7697, prop_info->offset + 8); +#line 13122 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| cmp dl, IS_FALSE + //| jle >1 + //|.cold_code + dasm_put(Dst, 7773, IS_FALSE); +#line 13126 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 13127 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(prop_addr) != ZREG_FCARG1 || Z_OFFSET(prop_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13129 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG2a, prop_info + if (IS_SIGNED_32BIT(prop_info)) { + dasm_put(Dst, 751, ((ptrdiff_t)prop_info)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)prop_info)), (unsigned int)((((ptrdiff_t)prop_info))>>32)); + } +#line 13131 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13132 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_check_array_promotion, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_check_array_promotion)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_check_array_promotion)); + } else { + if (IS_SIGNED_32BIT(zend_jit_check_array_promotion)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_check_array_promotion)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_check_array_promotion)), (unsigned int)((((ptrdiff_t)zend_jit_check_array_promotion))>>32)); + } + dasm_put(Dst, 66); + } +#line 13133 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 13135 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (flags == ZEND_FETCH_REF) { + if (!type_loaded) { + type_loaded = 1; + //| mov edx, dword [FCARG1a + prop_info->offset + 8] + dasm_put(Dst, 7697, prop_info->offset + 8); +#line 13140 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| IF_TYPE dl, IS_REFERENCE, >1 + dasm_put(Dst, 7783, IS_REFERENCE); +#line 13142 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) { + //| LOAD_ADDR FCARG2a, prop_info + if (IS_SIGNED_32BIT(prop_info)) { + dasm_put(Dst, 751, ((ptrdiff_t)prop_info)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)prop_info)), (unsigned int)((((ptrdiff_t)prop_info))>>32)); + } +#line 13144 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + int prop_info_offset = + (((prop_info->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*)); + + //| mov r0, aword [FCARG1a + offsetof(zend_object, ce)] + //| mov r0, aword [r0 + offsetof(zend_class_entry, properties_info_table)] + //| mov FCARG2a, aword[r0 + prop_info_offset] + dasm_put(Dst, 7792, offsetof(zend_object, ce), offsetof(zend_class_entry, properties_info_table), prop_info_offset); +#line 13151 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_REG(prop_addr) != ZREG_FCARG1 || Z_OFFSET(prop_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13154 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13157 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + //| EXT_CALL zend_jit_create_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_create_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_create_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_create_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_create_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_create_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_create_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 13162 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if not(X64) + //| add r4, 12 + //|.endif + //| jmp >9 + //|1: + dasm_put(Dst, 7805); +#line 13167 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } + } + if (opline->opcode == ZEND_FETCH_OBJ_W) { + if (Z_REG(prop_addr) != ZREG_FCARG1 || Z_OFFSET(prop_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13175 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_ZVAL_PTR res_addr, FCARG1a + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13177 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_INDIRECT + dasm_put(Dst, 7812, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_INDIRECT); +#line 13178 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && prop_info) { + ssa->var_info[ssa_op->result_def].indirect_reference = 1; + } + } else { + bool result_avoid_refcounting = 0; + + if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame) && prop_info) { + uint32_t flags = 0; + uint32_t old_info; + zend_jit_trace_stack *stack = JIT_G(current_frame)->stack; + int32_t exit_point; + const void *exit_addr; + uint8_t type; + zend_jit_addr val_addr = prop_addr; + + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) + && !delayed_fetch_this + && !op1_avoid_refcounting) { + flags = ZEND_JIT_EXIT_FREE_OP1; + } + + if ((opline->result_type & (IS_VAR|IS_TMP_VAR)) + && !(flags & ZEND_JIT_EXIT_FREE_OP1) + && (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) + && (ssa_op+1)->op1_use == ssa_op->result_def + && zend_jit_may_avoid_refcounting(opline+1, res_info)) { + result_avoid_refcounting = 1; + ssa->var_info[ssa_op->result_def].avoid_refcounting = 1; + } + + type = concrete_type(res_info); + + if (prop_type != IS_UNKNOWN + && prop_type != IS_UNDEF + && prop_type != IS_REFERENCE + && (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_OBJECT) { + exit_point = zend_jit_trace_get_exit_point(opline, 0); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + } else { + val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + //| LOAD_ZVAL_ADDR r0, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 6465, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 6473, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_avoid_refcounting) { + SET_STACK_REG(JIT_G(current_frame)->stack, + EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE); + } + old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_ZVAL_COPY_GPR0); + exit_point = zend_jit_trace_get_exit_point(opline+1, flags); + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + + if (!type_loaded) { + type_loaded = 1; + //| mov edx, dword [FCARG1a + prop_info->offset + 8] + dasm_put(Dst, 7697, prop_info->offset + 8); +#line 13239 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ZVAL_DEREF() + //| IF_NOT_TYPE dl, IS_REFERENCE, >1 + //| GET_Z_PTR r0, r0 + //| add r0, offsetof(zend_reference, val) + //| GET_ZVAL_TYPE_INFO edx, val_addr + dasm_put(Dst, 7820, IS_REFERENCE, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 7836, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); +#line 13245 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + res_info &= ~MAY_BE_GUARD; + ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; + if (type < IS_STRING) { + //|1: + dasm_put(Dst, 70); +#line 13250 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (type_loaded) { + //| IF_NOT_TYPE dl, type, &exit_addr + dasm_put(Dst, 7243, type, (ptrdiff_t)(exit_addr)); +#line 13252 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE val_addr, type, &exit_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval, u1.v.type), type, (ptrdiff_t)(exit_addr)); +#line 13254 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (!type_loaded) { + type_loaded = 1; + //| GET_ZVAL_TYPE_INFO edx, val_addr + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 7836, (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); +#line 13259 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|1: + //| IF_NOT_TYPE dl, type, &exit_addr + dasm_put(Dst, 7844, type, (ptrdiff_t)(exit_addr)); +#line 13262 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // ZVAL_COPY + //| ZVAL_COPY_VALUE_V res_addr, -1, val_addr, res_info, ZREG_R0, ZREG_R1 + if (res_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(res_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(res_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } +#line 13265 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (type < IS_STRING) { + if (Z_REG(res_addr) != ZREG_FP || + JIT_G(current_frame) == NULL || + STACK_MEM_TYPE(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(Z_OFFSET(res_addr))) != type) { + //| SET_ZVAL_TYPE_INFO res_addr, type + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); +#line 13270 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, edx + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 7123, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 13273 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!result_avoid_refcounting) { + //| TRY_ADDREF res_info, dh, r1 + if (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (res_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 4107); + } + dasm_put(Dst, 2199); + } +#line 13275 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else { + if (!zend_jit_zval_copy_deref(Dst, res_addr, prop_addr, ZREG_R2)) { + return 0; + } + } + } + + if (op1_avoid_refcounting) { + SET_STACK_REG(JIT_G(current_frame)->stack, + EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE); + } + + //|.cold_code + dasm_put(Dst, 276); +#line 13290 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || !prop_info) { + //|5: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 509); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13294 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_FETCH_OBJ_W) { + //| EXT_CALL zend_jit_fetch_obj_w_slow, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_obj_w_slow)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_obj_w_slow)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_obj_w_slow)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_obj_w_slow)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_obj_w_slow)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_obj_w_slow))>>32)); + } + dasm_put(Dst, 66); + } +#line 13296 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (opline->opcode != ZEND_FETCH_OBJ_IS) { + //| EXT_CALL zend_jit_fetch_obj_r_slow, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_obj_r_slow)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_obj_r_slow)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_obj_r_slow)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_obj_r_slow)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_obj_r_slow)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_obj_r_slow))>>32)); + } + dasm_put(Dst, 66); + } +#line 13298 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_fetch_obj_is_slow, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_obj_is_slow)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_obj_is_slow)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_obj_is_slow)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_obj_is_slow)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_obj_is_slow)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_obj_is_slow))>>32)); + } + dasm_put(Dst, 66); + } +#line 13300 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >9 + dasm_put(Dst, 3717); +#line 13302 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { + //|7: + dasm_put(Dst, 4482); +#line 13306 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_FETCH_OBJ_IS) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13308 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_FETCH_OBJ_W + && (op1_info & MAY_BE_UNDEF)) { + zend_jit_addr orig_op1_addr = OP1_ADDR(); + + if (op1_info & MAY_BE_ANY) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 13314 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 13317 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| LOAD_ZVAL_ADDR FCARG1a, orig_op1_addr + dasm_put(Dst, 70); + if (Z_MODE(orig_op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(orig_op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(orig_op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(orig_op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(orig_op1_addr)))>>32)); + } + } else if (Z_MODE(orig_op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(orig_op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(orig_op1_addr)), Z_OFFSET(orig_op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(orig_op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13319 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13321 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG2a, Z_STRVAL_P(member) + if (IS_SIGNED_32BIT(Z_STRVAL_P(member))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_STRVAL_P(member))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_STRVAL_P(member))), (unsigned int)((((ptrdiff_t)Z_STRVAL_P(member)))>>32)); + } +#line 13323 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_FETCH_OBJ_W) { + //| EXT_CALL zend_jit_invalid_property_write, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_property_write)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_property_write)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_property_write)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_property_write)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_property_write)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_property_write))>>32)); + } + dasm_put(Dst, 66); + } +#line 13325 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, _IS_ERROR + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), _IS_ERROR); +#line 13326 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_invalid_property_read, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_property_read)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_property_read)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_property_read)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_property_read)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_property_read)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_property_read))>>32)); + } + dasm_put(Dst, 66); + } +#line 13328 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 13329 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >9 + dasm_put(Dst, 3717); +#line 13331 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 13333 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + dasm_put(Dst, 3775, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 13334 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!prop_info + && may_be_dynamic + && opline->opcode != ZEND_FETCH_OBJ_W) { + //|8: + //| mov FCARG2a, r0 + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 7854); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13343 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode != ZEND_FETCH_OBJ_IS) { + //| EXT_CALL zend_jit_fetch_obj_r_dynamic, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_obj_r_dynamic)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_obj_r_dynamic)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_obj_r_dynamic)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_obj_r_dynamic)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_obj_r_dynamic)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_obj_r_dynamic))>>32)); + } + dasm_put(Dst, 66); + } +#line 13345 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_fetch_obj_is_dynamic, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_fetch_obj_is_dynamic)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_fetch_obj_is_dynamic)); + } else { + if (IS_SIGNED_32BIT(zend_jit_fetch_obj_is_dynamic)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_fetch_obj_is_dynamic)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_fetch_obj_is_dynamic)), (unsigned int)((((ptrdiff_t)zend_jit_fetch_obj_is_dynamic))>>32)); + } + dasm_put(Dst, 66); + } +#line 13347 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jmp >9 + dasm_put(Dst, 3717); +#line 13349 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|.code; + dasm_put(Dst, 373); +#line 13352 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: // END + dasm_put(Dst, 4230); +#line 13353 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type != IS_UNUSED && !delayed_fetch_this && !op1_indirect) { + if (opline->op1_type == IS_VAR + && opline->opcode == ZEND_FETCH_OBJ_W + && (op1_info & MAY_BE_RC1)) { + zend_jit_addr orig_op1_addr = OP1_ADDR(); + + //| IF_NOT_ZVAL_REFCOUNTED orig_op1_addr, >1 + ZEND_ASSERT(Z_MODE(orig_op1_addr) == IS_MEM_ZVAL); +#line 13360 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR FCARG1a, orig_op1_addr + dasm_put(Dst, 2178, (Z_REG(orig_op1_addr)), Z_OFFSET(orig_op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + ZEND_ASSERT(Z_MODE(orig_op1_addr) == IS_MEM_ZVAL); +#line 13361 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_DELREF FCARG1a + //| jnz >1 + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 7860, (Z_REG(orig_op1_addr)), Z_OFFSET(orig_op1_addr)); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13364 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_extract_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_extract_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_extract_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_extract_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_extract_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_extract_helper)), (unsigned int)((((ptrdiff_t)zend_jit_extract_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 13365 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 13366 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (!op1_avoid_refcounting) { + if (on_this) { + op1_info &= ~MAY_BE_RC1; + } + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 13371 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && prop_info + && (opline->opcode != ZEND_FETCH_OBJ_W || + !(opline->extended_value & ZEND_FETCH_OBJ_FLAGS) || + !ZEND_TYPE_IS_SET(prop_info->type)) + && (!(opline->op1_type & (IS_VAR|IS_TMP_VAR)) || on_this || op1_indirect)) { + may_throw = 0; + } + + if (may_throw) { + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_incdec_obj(dasm_State **Dst, + const zend_op *opline, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + uint32_t op1_info, + zend_jit_addr op1_addr, + bool op1_indirect, + zend_class_entry *ce, + bool ce_is_instanceof, + bool on_this, + bool delayed_fetch_this, + zend_class_entry *trace_ce, + uint8_t prop_type) +{ + zval *member; + zend_string *name; + zend_property_info *prop_info; + zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); + zend_jit_addr res_addr = 0; + zend_jit_addr prop_addr; + bool needs_slow_path = 0; + bool use_prop_guard = 0; + bool may_throw = 0; + uint32_t res_info = (opline->result_type != IS_UNDEF) ? RES_INFO() : 0; + + ZEND_ASSERT(opline->op2_type == IS_CONST); + ZEND_ASSERT(op1_info & MAY_BE_OBJECT); + + if (opline->result_type != IS_UNUSED) { + res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + } + + member = RT_CONSTANT(opline, opline->op2); + ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0'); + name = Z_STR_P(member); + prop_info = zend_get_known_property_info(op_array, ce, name, on_this, op_array->filename); + + if (on_this) { + //| GET_ZVAL_PTR FCARG1a, this_addr + ZEND_ASSERT(Z_MODE(this_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(this_addr)), Z_OFFSET(this_addr)); +#line 13432 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (opline->op1_type == IS_VAR + && (op1_info & MAY_BE_INDIRECT) + && Z_REG(op1_addr) == ZREG_FP) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13437 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE FCARG1a, IS_INDIRECT, >1 + //| GET_Z_PTR FCARG1a, FCARG1a + //|1: + dasm_put(Dst, 7525, offsetof(zval, u1.v.type), IS_INDIRECT); +#line 13440 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & MAY_BE_REF) { + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13445 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 13447 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT, (ptrdiff_t)(exit_addr)); +#line 13458 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 13460 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3386, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT); +#line 13461 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13463 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13465 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG2a, ZSTR_VAL(name) + if (IS_SIGNED_32BIT(ZSTR_VAL(name))) { + dasm_put(Dst, 751, ((ptrdiff_t)ZSTR_VAL(name))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)ZSTR_VAL(name))), (unsigned int)((((ptrdiff_t)ZSTR_VAL(name)))>>32)); + } +#line 13467 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_invalid_property_incdec, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_property_incdec)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_property_incdec)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_property_incdec)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_property_incdec)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_property_incdec)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_property_incdec))>>32)); + } + dasm_put(Dst, 66); + } +#line 13468 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 5915); +#line 13470 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 13473 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) { + prop_info = zend_get_known_property_info(op_array, trace_ce, name, on_this, op_array->filename); + if (prop_info) { + ce = trace_ce; + ce_is_instanceof = 0; + if (!(op1_info & MAY_BE_CLASS_GUARD)) { + if (on_this && JIT_G(current_frame) + && TRACE_FRAME_IS_THIS_CLASS_CHECKED(JIT_G(current_frame))) { + ZEND_ASSERT(JIT_G(current_frame)->ce == ce); + } else if (zend_jit_class_guard(Dst, opline, ce)) { + if (on_this && JIT_G(current_frame)) { + JIT_G(current_frame)->ce = ce; + TRACE_FRAME_SET_THIS_CLASS_CHECKED(JIT_G(current_frame)); + } + } else { + return 0; + } + if (ssa->var_info && ssa_op->op1_use >= 0) { + ssa->var_info[ssa_op->op1_use].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op1_use].ce = ce; + ssa->var_info[ssa_op->op1_use].is_instanceof = ce_is_instanceof; + } + if (ssa->var_info && ssa_op->op1_def >= 0) { + ssa->var_info[ssa_op->op1_def].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op1_def].ce = ce; + ssa->var_info[ssa_op->op1_def].is_instanceof = ce_is_instanceof; + } + } + } + } + + use_prop_guard = (prop_type != IS_UNKNOWN + && prop_type != IS_UNDEF + && prop_type != IS_REFERENCE + && (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_OBJECT); + + if (!prop_info) { + needs_slow_path = 1; + + //| mov r0, EX->run_time_cache + //| mov r2, aword [r0 + opline->extended_value] + //| cmp r2, aword [FCARG1a + offsetof(zend_object, ce)] + //| jne >7 + dasm_put(Dst, 7875, Dt1(->run_time_cache), opline->extended_value, offsetof(zend_object, ce)); +#line 13518 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) { + //| cmp aword [r0 + opline->extended_value + sizeof(void*) * 2], 0 + //| jnz >7 + dasm_put(Dst, 7892, opline->extended_value + sizeof(void*) * 2); +#line 13521 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov r0, aword [r0 + opline->extended_value + sizeof(void*)] + //| test r0, r0 + //| jl >7 + dasm_put(Dst, 7902, opline->extended_value + sizeof(void*)); +#line 13525 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!use_prop_guard) { + //| IF_TYPE byte [FCARG1a + r0 + 8], IS_UNDEF, >7 + dasm_put(Dst, 7914, 8, IS_UNDEF); +#line 13527 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| add FCARG1a, r0 + dasm_put(Dst, 7581); +#line 13529 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } else { + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, prop_info->offset); + if (ZEND_TYPE_IS_SET(prop_info->type) || !use_prop_guard) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_TYPE byte [FCARG1a + prop_info->offset + 8], IS_UNDEF, &exit_addr + dasm_put(Dst, 7925, prop_info->offset + 8, IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 13541 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_TYPE byte [FCARG1a + prop_info->offset + 8], IS_UNDEF, >7 + dasm_put(Dst, 7933, prop_info->offset + 8, IS_UNDEF); +#line 13543 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + needs_slow_path = 1; + } + } + if (ZEND_TYPE_IS_SET(prop_info->type)) { + may_throw = 1; + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13549 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) { + //| LOAD_ADDR FCARG2a, prop_info + if (IS_SIGNED_32BIT(prop_info)) { + dasm_put(Dst, 751, ((ptrdiff_t)prop_info)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)prop_info)), (unsigned int)((((ptrdiff_t)prop_info))>>32)); + } +#line 13551 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + int prop_info_offset = + (((prop_info->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*)); + + //| mov r0, aword [FCARG1a + offsetof(zend_object, ce)] + //| mov r0, aword [r0 + offsetof(zend_class_entry, properties_info_table)] + //| mov FCARG2a, aword[r0 + prop_info_offset] + dasm_put(Dst, 7792, offsetof(zend_object, ce), offsetof(zend_class_entry, properties_info_table), prop_info_offset); +#line 13558 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13560 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->result_type == IS_UNUSED) { + switch (opline->opcode) { + case ZEND_PRE_INC_OBJ: + case ZEND_POST_INC_OBJ: + //| EXT_CALL zend_jit_inc_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_inc_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_inc_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_inc_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_inc_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_inc_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_inc_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 13565 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_PRE_DEC_OBJ: + case ZEND_POST_DEC_OBJ: + //| EXT_CALL zend_jit_dec_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_dec_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_dec_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_dec_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_dec_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_dec_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_dec_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 13569 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + } else { + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 3424, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13576 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ZVAL_ADDR res_addr, r0 + //|.endif + switch (opline->opcode) { + case ZEND_PRE_INC_OBJ: + //| EXT_CALL zend_jit_pre_inc_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_inc_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_inc_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_inc_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_inc_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_inc_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_pre_inc_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 13583 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_PRE_DEC_OBJ: + //| EXT_CALL zend_jit_pre_dec_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_dec_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_dec_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_dec_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_dec_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_dec_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_pre_dec_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 13586 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_POST_INC_OBJ: + //| EXT_CALL zend_jit_post_inc_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_inc_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_inc_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_inc_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_inc_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_inc_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_post_inc_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 13589 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_POST_DEC_OBJ: + //| EXT_CALL zend_jit_post_dec_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_dec_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_dec_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_dec_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_dec_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_dec_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_post_dec_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 13592 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + //|.if not(X64) + //| add r4, 12 + //|.endif + } + } + } + + if (!prop_info || !ZEND_TYPE_IS_SET(prop_info->type)) { + uint32_t var_info = MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN; + zend_jit_addr var_addr = prop_addr; + + if (use_prop_guard) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + + //| IF_NOT_ZVAL_TYPE var_addr, prop_type, &exit_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), prop_type, (ptrdiff_t)(exit_addr)); +#line 13615 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + var_info = (1 << prop_type) | (var_info & ~(MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)); + } + + if (var_info & MAY_BE_REF) { + may_throw = 1; + var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + if (Z_REG(prop_addr) != ZREG_FCARG1 || Z_OFFSET(prop_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13623 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| IF_NOT_ZVAL_TYPE var_addr, IS_REFERENCE, >2 + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 13625 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR FCARG1a, var_addr + dasm_put(Dst, 2252, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 13626 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0 + //| jnz >1 + //| lea FCARG1a, aword [FCARG1a + offsetof(zend_reference, val)] + //|.cold_code + dasm_put(Dst, 7942, (Z_REG(var_addr)), Z_OFFSET(var_addr), offsetof(zend_reference, sources.ptr), offsetof(zend_reference, val)); +#line 13630 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 13631 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13633 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->result_type == IS_UNUSED) { + //| xor FCARG2a, FCARG2a + dasm_put(Dst, 2390); +#line 13636 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13638 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + switch (opline->opcode) { + case ZEND_PRE_INC_OBJ: + //| EXT_CALL zend_jit_pre_inc_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_inc_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_inc_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_inc_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_inc_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_inc_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_pre_inc_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 13642 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_PRE_DEC_OBJ: + //| EXT_CALL zend_jit_pre_dec_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_dec_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_dec_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_dec_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_dec_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_dec_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_pre_dec_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 13645 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_POST_INC_OBJ: + //| EXT_CALL zend_jit_post_inc_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_inc_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_inc_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_inc_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_inc_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_inc_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_post_inc_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 13648 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_POST_DEC_OBJ: + //| EXT_CALL zend_jit_post_dec_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_dec_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_dec_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_dec_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_dec_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_dec_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_post_dec_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 13651 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 13657 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 13658 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (var_info & MAY_BE_LONG) { + if (var_info & (MAY_BE_ANY - MAY_BE_LONG)) { + //| IF_NOT_ZVAL_TYPE var_addr, IS_LONG, >2 + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2252, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 13663 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_POST_INC_OBJ || opline->opcode == ZEND_POST_DEC_OBJ) { + if (opline->result_type != IS_UNUSED) { + //| ZVAL_COPY_VALUE res_addr, -1, var_addr, MAY_BE_LONG, ZREG_R1, ZREG_R2 + if (MAY_BE_LONG & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(var_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(var_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(var_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(var_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(var_addr))); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(var_addr)) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(var_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(var_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(var_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(var_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(var_addr))); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(var_addr)) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(var_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(var_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(var_addr) != IS_REG || ZREG_XMM0 != Z_REG(var_addr)) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(var_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(var_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_LONG & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_LONG & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_LONG & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_LONG & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_LONG); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R1), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 13667 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_POST_INC_OBJ) { + //| LONG_OP_WITH_32BIT_CONST add, var_addr, Z_L(1) + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2265, (Z_REG(var_addr)), Z_OFFSET(var_addr), Z_L(1)); + } else if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 2274, (Z_REG(var_addr)), Z_L(1)); + } else { + ZEND_UNREACHABLE(); + } +#line 13671 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LONG_OP_WITH_32BIT_CONST sub, var_addr, Z_L(1) + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 2281, (Z_REG(var_addr)), Z_OFFSET(var_addr), Z_L(1)); + } else if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 2290, (Z_REG(var_addr)), Z_L(1)); + } else { + ZEND_UNREACHABLE(); + } +#line 13673 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| jo >3 + dasm_put(Dst, 7964); +#line 13675 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_PRE_DEC_OBJ) { + if (opline->result_type != IS_UNUSED) { + //| ZVAL_COPY_VALUE res_addr, -1, var_addr, MAY_BE_LONG, ZREG_R0, ZREG_R2 + if (MAY_BE_LONG & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(var_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(var_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(var_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(var_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(var_addr))); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(var_addr)) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(var_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(var_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(var_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(var_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(var_addr))); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(var_addr)) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(var_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(var_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(var_addr) != IS_REG || ZREG_XMM0 != Z_REG(var_addr)) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(var_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(var_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_LONG & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_LONG & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_LONG & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_LONG & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_LONG & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_LONG); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 13678 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|.cold_code + dasm_put(Dst, 276); +#line 13681 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (var_info & (MAY_BE_ANY - MAY_BE_LONG)) { + if (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + may_throw = 1; + } + if (var_info & MAY_BE_LONG) { + //|2: + dasm_put(Dst, 2065); +#line 13688 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (Z_REG(var_addr) != ZREG_FCARG1 || Z_OFFSET(var_addr) != 0) { + var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13692 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_POST_INC_OBJ || opline->opcode == ZEND_POST_DEC_OBJ) { + //| ZVAL_COPY_VALUE res_addr, -1, var_addr, MAY_BE_ANY, ZREG_R0, ZREG_R2 + if (MAY_BE_ANY & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(var_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(var_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(var_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(var_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(var_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(var_addr))); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(var_addr)) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(var_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R2), (ZREG_R2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(var_addr)))) { + dasm_put(Dst, 1768, (ZREG_R2), (unsigned int)(Z_LVAL_P(Z_ZV(var_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(var_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R2), Z_LVAL_P(Z_ZV(var_addr))); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_R2 != Z_REG(var_addr)) { + dasm_put(Dst, 1782, (Z_REG(var_addr)), (ZREG_R2)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R2), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(res_addr) != Z_REG(var_addr)) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(var_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(var_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(var_addr) != IS_REG || ZREG_XMM0 != Z_REG(var_addr)) { + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(var_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(var_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_ANY & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R2), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R2), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_ANY & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_ANY & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_ANY & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_ANY); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 13695 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF MAY_BE_ANY, ah, r2 + if (MAY_BE_ANY & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (MAY_BE_ANY & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2233); + } +#line 13696 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_POST_INC_OBJ) { + if (opline->opcode == ZEND_PRE_INC_OBJ && opline->result_type != IS_UNUSED) { + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13700 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_pre_inc, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_inc)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_inc)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_inc)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_inc)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_inc)), (unsigned int)((((ptrdiff_t)zend_jit_pre_inc))>>32)); + } + dasm_put(Dst, 66); + } +#line 13701 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL increment_function, r0 + if (MAY_USE_32BIT_ADDR(increment_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(increment_function)); + } else { + if (IS_SIGNED_32BIT(increment_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)increment_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)increment_function)), (unsigned int)((((ptrdiff_t)increment_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 13703 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + if (opline->opcode == ZEND_PRE_DEC_OBJ && opline->result_type != IS_UNUSED) { + //| LOAD_ZVAL_ADDR FCARG2a, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 2376, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13707 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_pre_dec, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_dec)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_dec)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_dec)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_dec)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_dec)), (unsigned int)((((ptrdiff_t)zend_jit_pre_dec))>>32)); + } + dasm_put(Dst, 66); + } +#line 13708 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL decrement_function, r0 + if (MAY_USE_32BIT_ADDR(decrement_function)) { + dasm_put(Dst, 53, (ptrdiff_t)(decrement_function)); + } else { + if (IS_SIGNED_32BIT(decrement_function)) { + dasm_put(Dst, 56, ((ptrdiff_t)decrement_function)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)decrement_function)), (unsigned int)((((ptrdiff_t)decrement_function))>>32)); + } + dasm_put(Dst, 66); + } +#line 13710 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (var_info & MAY_BE_LONG) { + //| jmp >4 + dasm_put(Dst, 328); +#line 13714 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (var_info & MAY_BE_LONG) { + //|3: + dasm_put(Dst, 333); +#line 13718 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_POST_INC_OBJ) { + //|.if X64 + //| mov64 rax, 0x43e0000000000000 + //| SET_ZVAL_LVAL var_addr, rax + dasm_put(Dst, 61, (unsigned int)(0x43e0000000000000), (unsigned int)((0x43e0000000000000)>>32)); + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } +#line 13722 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO var_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 13723 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_PRE_INC_OBJ && opline->result_type != IS_UNUSED) { + //| SET_ZVAL_LVAL res_addr, rax + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 13725 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 13726 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| SET_ZVAL_LVAL var_addr, 0 + //| SET_ZVAL_W2 var_addr, 0x41e00000 + //| SET_ZVAL_TYPE_INFO var_addr, IS_DOUBLE + if (opline->opcode == ZEND_PRE_INC_OBJ && opline->result_type != IS_UNUSED) { + //| SET_ZVAL_LVAL res_addr, 0 + //| SET_ZVAL_W2 res_addr, 0x41e00000 + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + } + //|.endif + } else { + //|.if X64 + //| mov64 rax, 0xc3e0000000000000 + //| SET_ZVAL_LVAL var_addr, rax + dasm_put(Dst, 61, (unsigned int)(0xc3e0000000000000), (unsigned int)((0xc3e0000000000000)>>32)); + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } +#line 13741 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO var_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 13742 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->opcode == ZEND_PRE_DEC_OBJ && opline->result_type != IS_UNUSED) { + //| SET_ZVAL_LVAL res_addr, rax + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 13744 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); +#line 13745 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| SET_ZVAL_LVAL var_addr, 0x00200000 + //| SET_ZVAL_W2 var_addr, 0xc1e00000 + //| SET_ZVAL_TYPE_INFO var_addr, IS_DOUBLE + if (opline->opcode == ZEND_PRE_DEC_OBJ && opline->result_type != IS_UNUSED) { + //| SET_ZVAL_LVAL res_addr, 0x00200000 + //| SET_ZVAL_W2 res_addr, 0xc1e00000 + //| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE + } + //|.endif + } + if (opline->result_type != IS_UNUSED + && (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_PRE_DEC_OBJ) + && prop_info + && !ZEND_TYPE_IS_SET(prop_info->type) + && (res_info & MAY_BE_GUARD) + && (res_info & MAY_BE_LONG)) { + zend_jit_trace_stack *stack = JIT_G(current_frame)->stack; + uint32_t old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + int32_t exit_point; + const void *exit_addr; + + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_DOUBLE, 0); + exit_point = zend_jit_trace_get_exit_point(opline + 1, 0); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_res_info); + ssa->var_info[ssa_op->result_def].type = res_info & ~MAY_BE_GUARD; + //| jmp &exit_addr + //|.code + dasm_put(Dst, 3797, (ptrdiff_t)(exit_addr)); +#line 13778 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >4 + //|.code + dasm_put(Dst, 369); +#line 13781 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|4: + dasm_put(Dst, 375); +#line 13782 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + + if (needs_slow_path) { + may_throw = 1; + //|.cold_code + dasm_put(Dst, 276); +#line 13789 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 4482); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13791 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // value = zobj->handlers->write_property(zobj, name, value, CACHE_ADDR(opline->extended_value)); + //| LOAD_ADDR FCARG2a, name + if (IS_SIGNED_32BIT(name)) { + dasm_put(Dst, 751, ((ptrdiff_t)name)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)name)), (unsigned int)((((ptrdiff_t)name))>>32)); + } +#line 13793 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| mov CARG3, EX->run_time_cache + //| add CARG3, opline->extended_value + dasm_put(Dst, 7969, Dt1(->run_time_cache), opline->extended_value); +#line 13796 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->result_type == IS_UNUSED) { + //| xor CARG4, CARG4 + dasm_put(Dst, 4516); +#line 13798 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ZVAL_ADDR CARG4, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 4520, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 4525, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 4530, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 4538, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13800 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| sub r4, 8 + if (opline->result_type == IS_UNUSED) { + //| push 0 + } else { + //| PUSH_ZVAL_ADDR res_addr, r0 + } + //| mov r0, EX->run_time_cache + //| add r0, opline->extended_value + //| push r0 + //|.endif + + switch (opline->opcode) { + case ZEND_PRE_INC_OBJ: + //| EXT_CALL zend_jit_pre_inc_obj_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_inc_obj_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_inc_obj_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_inc_obj_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_inc_obj_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_inc_obj_helper)), (unsigned int)((((ptrdiff_t)zend_jit_pre_inc_obj_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 13816 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_PRE_DEC_OBJ: + //| EXT_CALL zend_jit_pre_dec_obj_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_pre_dec_obj_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_pre_dec_obj_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_pre_dec_obj_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_pre_dec_obj_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_pre_dec_obj_helper)), (unsigned int)((((ptrdiff_t)zend_jit_pre_dec_obj_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 13819 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_POST_INC_OBJ: + //| EXT_CALL zend_jit_post_inc_obj_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_inc_obj_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_inc_obj_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_inc_obj_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_inc_obj_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_inc_obj_helper)), (unsigned int)((((ptrdiff_t)zend_jit_post_inc_obj_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 13822 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + case ZEND_POST_DEC_OBJ: + //| EXT_CALL zend_jit_post_dec_obj_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_post_dec_obj_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_post_dec_obj_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_post_dec_obj_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_post_dec_obj_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_post_dec_obj_helper)), (unsigned int)((((ptrdiff_t)zend_jit_post_dec_obj_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 13825 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + break; + default: + ZEND_UNREACHABLE(); + } + + //|.if not(X64) + //| add r4, 8 + //|.endif + + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 13836 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|9: + dasm_put(Dst, 4230); +#line 13839 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type != IS_UNUSED && !delayed_fetch_this && !op1_indirect) { + if ((op1_info & MAY_HAVE_DTOR) && (op1_info & MAY_BE_RC1)) { + may_throw = 1; + } + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 13844 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (may_throw) { + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_assign_obj_op(dasm_State **Dst, + const zend_op *opline, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + uint32_t op1_info, + zend_jit_addr op1_addr, + uint32_t val_info, + zend_ssa_range *val_range, + bool op1_indirect, + zend_class_entry *ce, + bool ce_is_instanceof, + bool on_this, + bool delayed_fetch_this, + zend_class_entry *trace_ce, + uint8_t prop_type) +{ + zval *member; + zend_string *name; + zend_property_info *prop_info; + zend_jit_addr val_addr = OP1_DATA_ADDR(); + zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); + zend_jit_addr prop_addr; + bool needs_slow_path = 0; + bool use_prop_guard = 0; + bool may_throw = 0; + binary_op_type binary_op = get_binary_op(opline->extended_value); + + ZEND_ASSERT(opline->op2_type == IS_CONST); + ZEND_ASSERT(op1_info & MAY_BE_OBJECT); + ZEND_ASSERT(opline->result_type == IS_UNUSED); + + member = RT_CONSTANT(opline, opline->op2); + ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0'); + name = Z_STR_P(member); + prop_info = zend_get_known_property_info(op_array, ce, name, on_this, op_array->filename); + + if (on_this) { + //| GET_ZVAL_PTR FCARG1a, this_addr + ZEND_ASSERT(Z_MODE(this_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(this_addr)), Z_OFFSET(this_addr)); +#line 13894 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (opline->op1_type == IS_VAR + && (op1_info & MAY_BE_INDIRECT) + && Z_REG(op1_addr) == ZREG_FP) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13899 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE FCARG1a, IS_INDIRECT, >1 + //| GET_Z_PTR FCARG1a, FCARG1a + //|1: + dasm_put(Dst, 7525, offsetof(zval, u1.v.type), IS_INDIRECT); +#line 13902 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & MAY_BE_REF) { + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13907 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 13909 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT, (ptrdiff_t)(exit_addr)); +#line 13920 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 13922 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3386, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT); +#line 13923 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 13925 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 13927 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG2a, ZSTR_VAL(name) + if (IS_SIGNED_32BIT(ZSTR_VAL(name))) { + dasm_put(Dst, 751, ((ptrdiff_t)ZSTR_VAL(name))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)ZSTR_VAL(name))), (unsigned int)((((ptrdiff_t)ZSTR_VAL(name)))>>32)); + } +#line 13929 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_UNDEF) { + //| EXT_CALL zend_jit_invalid_property_assign_op, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_property_assign_op)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_property_assign_op)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_property_assign_op)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_property_assign_op)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_property_assign_op)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_property_assign_op))>>32)); + } + dasm_put(Dst, 66); + } +#line 13931 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_invalid_property_assign, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_property_assign)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_property_assign)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_property_assign)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_property_assign)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_property_assign)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_property_assign))>>32)); + } + dasm_put(Dst, 66); + } +#line 13933 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + may_throw = 1; + if (((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) + && (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + may_throw = 1; + //| jmp >8 + dasm_put(Dst, 3802); +#line 13939 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 13941 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 13943 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 13946 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) { + prop_info = zend_get_known_property_info(op_array, trace_ce, name, on_this, op_array->filename); + if (prop_info) { + ce = trace_ce; + ce_is_instanceof = 0; + if (!(op1_info & MAY_BE_CLASS_GUARD)) { + if (on_this && JIT_G(current_frame) + && TRACE_FRAME_IS_THIS_CLASS_CHECKED(JIT_G(current_frame))) { + ZEND_ASSERT(JIT_G(current_frame)->ce == ce); + } else if (zend_jit_class_guard(Dst, opline, ce)) { + if (on_this && JIT_G(current_frame)) { + JIT_G(current_frame)->ce = ce; + TRACE_FRAME_SET_THIS_CLASS_CHECKED(JIT_G(current_frame)); + } + } else { + return 0; + } + if (ssa->var_info && ssa_op->op1_use >= 0) { + ssa->var_info[ssa_op->op1_use].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op1_use].ce = ce; + ssa->var_info[ssa_op->op1_use].is_instanceof = ce_is_instanceof; + } + if (ssa->var_info && ssa_op->op1_def >= 0) { + ssa->var_info[ssa_op->op1_def].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op1_def].ce = ce; + ssa->var_info[ssa_op->op1_def].is_instanceof = ce_is_instanceof; + } + } + } + } + + use_prop_guard = (prop_type != IS_UNKNOWN + && prop_type != IS_UNDEF + && prop_type != IS_REFERENCE + && (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_OBJECT); + + if (!prop_info) { + needs_slow_path = 1; + + //| mov r0, EX->run_time_cache + //| mov r2, aword [r0 + (opline+1)->extended_value] + //| cmp r2, aword [FCARG1a + offsetof(zend_object, ce)] + //| jne >7 + dasm_put(Dst, 7875, Dt1(->run_time_cache), (opline+1)->extended_value, offsetof(zend_object, ce)); +#line 13991 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) { + //| cmp aword [r0 + (opline+1)->extended_value + sizeof(void*) * 2], 0 + //| jnz >7 + dasm_put(Dst, 7892, (opline+1)->extended_value + sizeof(void*) * 2); +#line 13994 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov r0, aword [r0 + (opline+1)->extended_value + sizeof(void*)] + //| test r0, r0 + //| jl >7 + dasm_put(Dst, 7902, (opline+1)->extended_value + sizeof(void*)); +#line 13998 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!use_prop_guard) { + //| IF_TYPE byte [FCARG1a + r0 + 8], IS_UNDEF, >7 + dasm_put(Dst, 7914, 8, IS_UNDEF); +#line 14000 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| add FCARG1a, r0 + dasm_put(Dst, 7581); +#line 14002 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } else { + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, prop_info->offset); + if (ZEND_TYPE_IS_SET(prop_info->type) || !use_prop_guard) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_TYPE byte [FCARG1a + prop_info->offset + 8], IS_UNDEF, &exit_addr + dasm_put(Dst, 7925, prop_info->offset + 8, IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 14014 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_TYPE byte [FCARG1a + prop_info->offset + 8], IS_UNDEF, >7 + dasm_put(Dst, 7933, prop_info->offset + 8, IS_UNDEF); +#line 14016 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + needs_slow_path = 1; + } + } + if (ZEND_TYPE_IS_SET(prop_info->type)) { + uint32_t info = val_info; + + may_throw = 1; + + if (opline) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14026 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //| IF_ZVAL_TYPE prop_addr, IS_REFERENCE, >1 + ZEND_ASSERT(Z_MODE(prop_addr) == IS_MEM_ZVAL); +#line 14029 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3945, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); +#line 14030 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| GET_ZVAL_PTR FCARG1a, prop_addr + dasm_put(Dst, 70); + ZEND_ASSERT(Z_MODE(prop_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); +#line 14032 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2 || Z_OFFSET(val_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG2a, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 2376, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14034 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if X64 + //| LOAD_ADDR CARG3, binary_op + if (IS_SIGNED_32BIT(binary_op)) { + dasm_put(Dst, 3414, ((ptrdiff_t)binary_op)); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)binary_op)), (unsigned int)((((ptrdiff_t)binary_op))>>32)); + } +#line 14037 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ADDR binary_op, r0 + //|.endif + if (((opline+1)->op1_type & (IS_TMP_VAR|IS_VAR)) + && (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| EXT_CALL zend_jit_assign_op_to_typed_ref_tmp, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref_tmp)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp))>>32)); + } + dasm_put(Dst, 66); + } +#line 14044 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_assign_op_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 14046 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 14052 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //| // value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC); + + if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) { + //| LOAD_ADDR FCARG2a, prop_info + if (IS_SIGNED_32BIT(prop_info)) { + dasm_put(Dst, 751, ((ptrdiff_t)prop_info)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)prop_info)), (unsigned int)((((ptrdiff_t)prop_info))>>32)); + } +#line 14057 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + int prop_info_offset = + (((prop_info->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*)); + + //| mov r0, aword [FCARG1a + offsetof(zend_object, ce)] + //| mov r0, aword [r0 + offsetof(zend_class_entry, properties_info_table)] + //| mov FCARG2a, aword[r0 + prop_info_offset] + dasm_put(Dst, 7792, offsetof(zend_object, ce), offsetof(zend_class_entry, properties_info_table), prop_info_offset); +#line 14064 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14066 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 3424, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14068 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ADDR CARG4, binary_op + if (IS_SIGNED_32BIT(binary_op)) { + dasm_put(Dst, 4520, ((ptrdiff_t)binary_op)); + } else { + dasm_put(Dst, 4525, (unsigned int)(((ptrdiff_t)binary_op)), (unsigned int)((((ptrdiff_t)binary_op))>>32)); + } +#line 14069 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 8 + //| PUSH_ADDR binary_op, r0 + //| PUSH_ZVAL_ADDR val_addr, r0 + //|.endif + + //| EXT_CALL zend_jit_assign_op_to_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 14076 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //|.if not(X64) + //| add r4, 8 + //|.endif + + if (info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + info |= MAY_BE_RC1|MAY_BE_RCN; + } + + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, info, 0, NULL + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_1(info)) { + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_N(info)) { + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((info) & MAY_BE_GUARD) + && has_concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14086 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!prop_info || !ZEND_TYPE_IS_SET(prop_info->type)) { + zend_jit_addr var_addr = prop_addr; + uint32_t var_info = MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN; + uint32_t var_def_info = MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN; + + if (use_prop_guard) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + + //| IF_NOT_ZVAL_TYPE var_addr, prop_type, &exit_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), prop_type, (ptrdiff_t)(exit_addr)); +#line 14102 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + var_info = (1 << prop_type) | (var_info & ~(MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)); + } + + if (var_info & MAY_BE_REF) { + may_throw = 1; + var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + //| LOAD_ZVAL_ADDR r0, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 6465, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 6473, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14109 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_ZVAL_TYPE var_addr, IS_REFERENCE, >2 + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 14110 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR FCARG1a, var_addr + dasm_put(Dst, 2252, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 14111 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0 + //| jnz >1 + //| lea r0, aword [FCARG1a + offsetof(zend_reference, val)] + //|.cold_code + dasm_put(Dst, 7978, (Z_REG(var_addr)), Z_OFFSET(var_addr), offsetof(zend_reference, sources.ptr), offsetof(zend_reference, val)); +#line 14115 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 14116 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2 || Z_OFFSET(val_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG2a, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 2376, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14118 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14121 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if X64 + //| LOAD_ADDR CARG3, binary_op + if (IS_SIGNED_32BIT(binary_op)) { + dasm_put(Dst, 3414, ((ptrdiff_t)binary_op)); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)binary_op)), (unsigned int)((((ptrdiff_t)binary_op))>>32)); + } +#line 14124 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 12 + //| PUSH_ADDR binary_op, r0 + //|.endif + if (((opline+1)->op1_type & (IS_TMP_VAR|IS_VAR)) + && (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| EXT_CALL zend_jit_assign_op_to_typed_ref_tmp, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref_tmp)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref_tmp)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref_tmp))>>32)); + } + dasm_put(Dst, 66); + } +#line 14131 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| EXT_CALL zend_jit_assign_op_to_typed_ref, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_op_to_typed_ref)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_op_to_typed_ref)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_op_to_typed_ref)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_op_to_typed_ref)), (unsigned int)((((ptrdiff_t)zend_jit_assign_op_to_typed_ref))>>32)); + } + dasm_put(Dst, 66); + } +#line 14133 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if not(X64) + //| add r4, 12 + //|.endif + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 14139 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 14140 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + var_info &= ~MAY_BE_REF; + } + + switch (opline->extended_value) { + case ZEND_ADD: + case ZEND_SUB: + case ZEND_MUL: + if ((var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) || + (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (opline->extended_value != ZEND_ADD || + (var_info & MAY_BE_ANY) != MAY_BE_ARRAY || + (val_info & MAY_BE_ANY) == MAY_BE_ARRAY) { + may_throw = 1; + } + } + if (!zend_jit_math_helper(Dst, opline, opline->extended_value, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, val_addr, val_info, 0, var_addr, var_def_info, var_info, + 1 /* may overflow */, 0)) { + return 0; + } + break; + case ZEND_BW_OR: + case ZEND_BW_AND: + case ZEND_BW_XOR: + may_throw = 1; + if ((var_info & (MAY_BE_STRING|MAY_BE_DOUBLE|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) || + (val_info & (MAY_BE_STRING|MAY_BE_DOUBLE|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if ((var_info & MAY_BE_ANY) != MAY_BE_STRING || + (val_info & MAY_BE_ANY) != MAY_BE_STRING) { + may_throw = 1; + } + } + goto long_math; + case ZEND_SL: + case ZEND_SR: + if ((var_info & (MAY_BE_STRING|MAY_BE_DOUBLE|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) || + (val_info & (MAY_BE_STRING|MAY_BE_DOUBLE|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + may_throw = 1; + } + if ((opline+1)->op1_type != IS_CONST || + Z_TYPE_P(RT_CONSTANT((opline+1), (opline+1)->op1)) != IS_LONG || + Z_LVAL_P(RT_CONSTANT((opline+1), (opline+1)->op1)) < 0) { + may_throw = 1; + } + goto long_math; + case ZEND_MOD: + if ((var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) || + (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (opline->extended_value != ZEND_ADD || + (var_info & MAY_BE_ANY) != MAY_BE_ARRAY || + (val_info & MAY_BE_ANY) == MAY_BE_ARRAY) { + may_throw = 1; + } + } + if ((opline+1)->op1_type != IS_CONST || + Z_TYPE_P(RT_CONSTANT((opline+1), (opline+1)->op1)) != IS_LONG || + Z_LVAL_P(RT_CONSTANT((opline+1), (opline+1)->op1)) == 0) { + may_throw = 1; + } +long_math: + if (!zend_jit_long_math_helper(Dst, opline, opline->extended_value, + IS_CV, opline->op1, var_addr, var_info, NULL, + (opline+1)->op1_type, (opline+1)->op1, val_addr, val_info, + val_range, + 0, var_addr, var_def_info, var_info, /* may throw */ 1)) { + return 0; + } + break; + case ZEND_CONCAT: + may_throw = 1; + if (!zend_jit_concat_helper(Dst, opline, IS_CV, opline->op1, var_addr, var_info, (opline+1)->op1_type, (opline+1)->op1, val_addr, val_info, var_addr, + 0)) { + return 0; + } + break; + default: + ZEND_UNREACHABLE(); + } + } + + if (needs_slow_path) { + may_throw = 1; + //|.cold_code + dasm_put(Dst, 276); +#line 14222 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 4482); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14224 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // value = zobj->handlers->write_property(zobj, name, value, CACHE_ADDR(opline->extended_value)); + //| LOAD_ADDR FCARG2a, name + if (IS_SIGNED_32BIT(name)) { + dasm_put(Dst, 751, ((ptrdiff_t)name)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)name)), (unsigned int)((((ptrdiff_t)name))>>32)); + } +#line 14226 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 3424, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14228 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov CARG4, EX->run_time_cache + //| add CARG4, (opline+1)->extended_value + //|.if X64WIN + //| LOAD_ADDR r0, binary_op + //| mov aword A5, r0 + //|.else + //| LOAD_ADDR CARG5, binary_op + dasm_put(Dst, 8000, Dt1(->run_time_cache), (opline+1)->extended_value); + if (IS_SIGNED_32BIT(binary_op)) { + dasm_put(Dst, 8009, ((ptrdiff_t)binary_op)); + } else { + dasm_put(Dst, 8014, (unsigned int)(((ptrdiff_t)binary_op)), (unsigned int)((((ptrdiff_t)binary_op))>>32)); + } +#line 14235 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.endif + //|.else + //| sub r4, 4 + //| PUSH_ADDR binary_op, r0 + //| mov r0, EX->run_time_cache + //| add r0, (opline+1)->extended_value + //| push r0 + //| PUSH_ZVAL_ADDR val_addr, r0 + //|.endif + + //| EXT_CALL zend_jit_assign_obj_op_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_obj_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_obj_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_obj_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_obj_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_obj_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_assign_obj_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 14246 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //|.if not(X64) + //| add r4, 4 + //|.endif + + if (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + val_info |= MAY_BE_RC1|MAY_BE_RCN; + } + + //|8: + //| // FREE_OP_DATA(); + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline + dasm_put(Dst, 4331); + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_1(val_info)) { + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_N(val_info)) { + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((val_info) & MAY_BE_GUARD) + && has_concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((val_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((val_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((val_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14258 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 14260 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|9: + dasm_put(Dst, 4230); +#line 14263 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type != IS_UNUSED && !delayed_fetch_this && !op1_indirect) { + if ((op1_info & MAY_HAVE_DTOR) && (op1_info & MAY_BE_RC1)) { + may_throw = 1; + } + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14268 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (may_throw) { + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_assign_obj(dasm_State **Dst, + const zend_op *opline, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + uint32_t op1_info, + zend_jit_addr op1_addr, + uint32_t val_info, + bool op1_indirect, + zend_class_entry *ce, + bool ce_is_instanceof, + bool on_this, + bool delayed_fetch_this, + zend_class_entry *trace_ce, + uint8_t prop_type, + int may_throw) +{ + zval *member; + zend_string *name; + zend_property_info *prop_info; + zend_jit_addr val_addr = OP1_DATA_ADDR(); + zend_jit_addr res_addr = 0; + zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); + zend_jit_addr prop_addr; + bool needs_slow_path = 0; + bool needs_val_dtor = 0; + + if (RETURN_VALUE_USED(opline)) { + res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + } + + ZEND_ASSERT(opline->op2_type == IS_CONST); + ZEND_ASSERT(op1_info & MAY_BE_OBJECT); + + member = RT_CONSTANT(opline, opline->op2); + ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0'); + name = Z_STR_P(member); + prop_info = zend_get_known_property_info(op_array, ce, name, on_this, op_array->filename); + + if (on_this) { + //| GET_ZVAL_PTR FCARG1a, this_addr + ZEND_ASSERT(Z_MODE(this_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(this_addr)), Z_OFFSET(this_addr)); +#line 14320 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (opline->op1_type == IS_VAR + && (op1_info & MAY_BE_INDIRECT) + && Z_REG(op1_addr) == ZREG_FP) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14325 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_Z_TYPE FCARG1a, IS_INDIRECT, >1 + //| GET_Z_PTR FCARG1a, FCARG1a + //|1: + dasm_put(Dst, 7525, offsetof(zval, u1.v.type), IS_INDIRECT); +#line 14328 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & MAY_BE_REF) { + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14333 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 14335 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT, (ptrdiff_t)(exit_addr)); +#line 14346 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 14348 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 3386, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_OBJECT); +#line 14349 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14351 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14353 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG2a, ZSTR_VAL(name) + if (IS_SIGNED_32BIT(ZSTR_VAL(name))) { + dasm_put(Dst, 751, ((ptrdiff_t)ZSTR_VAL(name))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)ZSTR_VAL(name))), (unsigned int)((((ptrdiff_t)ZSTR_VAL(name)))>>32)); + } +#line 14355 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_jit_invalid_property_assign, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_invalid_property_assign)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_invalid_property_assign)); + } else { + if (IS_SIGNED_32BIT(zend_jit_invalid_property_assign)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_invalid_property_assign)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_invalid_property_assign)), (unsigned int)((((ptrdiff_t)zend_jit_invalid_property_assign))>>32)); + } + dasm_put(Dst, 66); + } +#line 14356 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RETURN_VALUE_USED(opline)) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_NULL + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_NULL); +#line 14358 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) + && (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + needs_val_dtor = 1; + //| jmp >7 + dasm_put(Dst, 3757); +#line 14363 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 14365 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 14367 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 14370 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) { + prop_info = zend_get_known_property_info(op_array, trace_ce, name, on_this, op_array->filename); + if (prop_info) { + ce = trace_ce; + ce_is_instanceof = 0; + if (!(op1_info & MAY_BE_CLASS_GUARD)) { + if (on_this && JIT_G(current_frame) + && TRACE_FRAME_IS_THIS_CLASS_CHECKED(JIT_G(current_frame))) { + ZEND_ASSERT(JIT_G(current_frame)->ce == ce); + } else if (zend_jit_class_guard(Dst, opline, ce)) { + if (on_this && JIT_G(current_frame)) { + JIT_G(current_frame)->ce = ce; + TRACE_FRAME_SET_THIS_CLASS_CHECKED(JIT_G(current_frame)); + } + } else { + return 0; + } + if (ssa->var_info && ssa_op->op1_use >= 0) { + ssa->var_info[ssa_op->op1_use].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op1_use].ce = ce; + ssa->var_info[ssa_op->op1_use].is_instanceof = ce_is_instanceof; + } + if (ssa->var_info && ssa_op->op1_def >= 0) { + ssa->var_info[ssa_op->op1_def].type |= MAY_BE_CLASS_GUARD; + ssa->var_info[ssa_op->op1_def].ce = ce; + ssa->var_info[ssa_op->op1_def].is_instanceof = ce_is_instanceof; + } + } + } + } + + if (!prop_info) { + needs_slow_path = 1; + + //| mov r0, EX->run_time_cache + //| mov r2, aword [r0 + opline->extended_value] + //| cmp r2, aword [FCARG1a + offsetof(zend_object, ce)] + //| jne >5 + dasm_put(Dst, 8019, Dt1(->run_time_cache), opline->extended_value, offsetof(zend_object, ce)); +#line 14410 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) { + //| mov FCARG2a, aword [r0 + opline->extended_value + sizeof(void*) * 2] + dasm_put(Dst, 7483, opline->extended_value + sizeof(void*) * 2); +#line 14412 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov r0, aword [r0 + opline->extended_value + sizeof(void*)] + //| test r0, r0 + //| jl >5 + //| IF_TYPE byte [FCARG1a + r0 + 8], IS_UNDEF, >5 + //| add FCARG1a, r0 + dasm_put(Dst, 8036, opline->extended_value + sizeof(void*), 8, IS_UNDEF); +#line 14418 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + if (!ce || ce_is_instanceof || (ce->ce_flags & (ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_TRAIT))) { + //| test FCARG2a, FCARG2a + //| jnz >1 + //|.cold_code + dasm_put(Dst, 7593); +#line 14423 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC); + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14426 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 3424, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14428 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RETURN_VALUE_USED(opline)) { + //| LOAD_ZVAL_ADDR CARG4, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 4520, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 4525, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 4530, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 4538, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14430 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| xor CARG4, CARG4 + dasm_put(Dst, 4516); +#line 14432 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| sub r4, 8 + if (RETURN_VALUE_USED(opline)) { + //| PUSH_ZVAL_ADDR res_addr, r0 + } else { + //| push 0 + } + //| PUSH_ZVAL_ADDR val_addr, r0 + //|.endif + + //| EXT_CALL zend_jit_assign_to_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_to_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_to_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_to_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_to_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_to_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_assign_to_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 14444 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //|.if not(X64) + //| add r4, 8 + //|.endif + + if ((opline+1)->op1_type == IS_CONST) { + //| // TODO: ??? + //| // if (Z_TYPE_P(value) == orig_type) { + //| // CACHE_PTR_EX(cache_slot + 2, NULL); + } + + if (((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) + && (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + //| jmp >7 + dasm_put(Dst, 3757); +#line 14458 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp >9 + dasm_put(Dst, 3717); +#line 14460 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.code + dasm_put(Dst, 373); +#line 14462 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, prop_info->offset); + if (!ce || ce_is_instanceof || !(ce->ce_flags & ZEND_ACC_IMMUTABLE) || ce->__get || ce->__set || (prop_info->flags & ZEND_ACC_READONLY)) { + // Undefined property with magic __get()/__set() + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_TYPE byte [FCARG1a + prop_info->offset + 8], IS_UNDEF, &exit_addr + dasm_put(Dst, 7925, prop_info->offset + 8, IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 14475 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_TYPE byte [FCARG1a + prop_info->offset + 8], IS_UNDEF, >5 + dasm_put(Dst, 8061, prop_info->offset + 8, IS_UNDEF); +#line 14477 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + needs_slow_path = 1; + } + } + if (ZEND_TYPE_IS_SET(prop_info->type)) { + uint32_t info = val_info; + + //| // value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14485 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) { + //| LOAD_ADDR FCARG2a, prop_info + if (IS_SIGNED_32BIT(prop_info)) { + dasm_put(Dst, 751, ((ptrdiff_t)prop_info)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)prop_info)), (unsigned int)((((ptrdiff_t)prop_info))>>32)); + } +#line 14487 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + int prop_info_offset = + (((prop_info->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*)); + + //| mov r0, aword [FCARG1a + offsetof(zend_object, ce)] + //| mov r0, aword [r0 + offsetof(zend_class_entry, properties_info_table)] + //| mov FCARG2a, aword[r0 + prop_info_offset] + dasm_put(Dst, 7792, offsetof(zend_object, ce), offsetof(zend_class_entry, properties_info_table), prop_info_offset); +#line 14494 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ZVAL_ADDR FCARG1a, prop_addr + if (Z_MODE(prop_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(prop_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(prop_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(prop_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(prop_addr)))>>32)); + } + } else if (Z_MODE(prop_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(prop_addr)) { + dasm_put(Dst, 2341, (Z_REG(prop_addr)), Z_OFFSET(prop_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(prop_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14496 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 3424, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14498 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RETURN_VALUE_USED(opline)) { + //| LOAD_ZVAL_ADDR CARG4, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 4520, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 4525, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 4530, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 4538, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14500 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| xor CARG4, CARG4 + dasm_put(Dst, 4516); +#line 14502 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| sub r4, 8 + if (RETURN_VALUE_USED(opline)) { + //| PUSH_ZVAL_ADDR res_addr, r0 + } else { + //| push 0 + } + //| PUSH_ZVAL_ADDR val_addr, r0 + //|.endif + + //| EXT_CALL zend_jit_assign_to_typed_prop, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_to_typed_prop)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_to_typed_prop)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_to_typed_prop)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_to_typed_prop)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_to_typed_prop)), (unsigned int)((((ptrdiff_t)zend_jit_assign_to_typed_prop))>>32)); + } + dasm_put(Dst, 66); + } +#line 14514 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //|.if not(X64) + //| add r4, 8 + //|.endif + + if (info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + info |= MAY_BE_RC1|MAY_BE_RCN; + } + + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, info, 0, NULL + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_1(info)) { + if (((info) & MAY_BE_GUARD) || RC_MAY_BE_N(info)) { + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((info) & MAY_BE_GUARD) + && has_concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (NULL && ((info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (NULL) { + if (NULL == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(NULL)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)NULL)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)NULL)), (unsigned int)((((ptrdiff_t)NULL))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((info) & MAY_BE_GUARD) || (RC_MAY_BE_N(info) && ((info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14524 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!prop_info || !ZEND_TYPE_IS_SET(prop_info->type)) { + // value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + if (opline->result_type == IS_UNUSED) { + if (!zend_jit_assign_to_variable_call(Dst, opline, prop_addr, prop_addr, -1, -1, (opline+1)->op1_type, val_addr, val_info, res_addr, 0)) { + return 0; + } + } else { + if (!zend_jit_assign_to_variable(Dst, opline, prop_addr, prop_addr, -1, -1, (opline+1)->op1_type, val_addr, val_info, res_addr, 0)) { + return 0; + } + } + } + + if (needs_slow_path) { + //|.cold_code + dasm_put(Dst, 276); +#line 14542 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|5: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 509); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14544 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // value = zobj->handlers->write_property(zobj, name, value, CACHE_ADDR(opline->extended_value)); + //| LOAD_ADDR FCARG2a, name + if (IS_SIGNED_32BIT(name)) { + dasm_put(Dst, 751, ((ptrdiff_t)name)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)name)), (unsigned int)((((ptrdiff_t)name))>>32)); + } +#line 14546 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ZVAL_ADDR CARG3, val_addr + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 3414, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(val_addr)) { + dasm_put(Dst, 3424, (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 3432, (Z_REG(val_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14548 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov CARG4, EX->run_time_cache + //| add CARG4, opline->extended_value + dasm_put(Dst, 8000, Dt1(->run_time_cache), opline->extended_value); +#line 14550 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (RETURN_VALUE_USED(opline)) { + //|.if X64WIN + //| LOAD_ZVAL_ADDR r0, res_addr + //| mov aword A5, r0 + //|.else + //| LOAD_ZVAL_ADDR CARG5, res_addr + if (Z_MODE(res_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(res_addr))) { + dasm_put(Dst, 8009, ((ptrdiff_t)Z_ZV(res_addr))); + } else { + dasm_put(Dst, 8014, (unsigned int)(((ptrdiff_t)Z_ZV(res_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(res_addr)))>>32)); + } + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(res_addr)) { + dasm_put(Dst, 8070, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 8078, (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 14556 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.endif + } else { + //|.if X64WIN + //| mov aword A5, 0 + //|.else + //| xor CARG5, CARG5 + //|.endif + dasm_put(Dst, 4103); +#line 14563 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| sub r4, 4 + if (RETURN_VALUE_USED(opline)) { + //| PUSH_ZVAL_ADDR res_addr, r0 + } else { + //| push 0 + } + //| mov r0, EX->run_time_cache + //| add r0, opline->extended_value + //| push r0 + //| PUSH_ZVAL_ADDR val_addr, r0 + //|.endif + + //| EXT_CALL zend_jit_assign_obj_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_assign_obj_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_assign_obj_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_assign_obj_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_assign_obj_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_assign_obj_helper)), (unsigned int)((((ptrdiff_t)zend_jit_assign_obj_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 14578 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //|.if not(X64) + //| add r4, 4 + //|.endif + + if (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + val_info |= MAY_BE_RC1|MAY_BE_RCN; + } + + //|7: + //| // FREE_OP_DATA(); + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline + dasm_put(Dst, 4482); + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_1(val_info)) { + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_N(val_info)) { + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((val_info) & MAY_BE_GUARD) + && has_concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((val_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((val_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((val_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14590 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 14592 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (needs_val_dtor) { + //|.cold_code + dasm_put(Dst, 276); +#line 14594 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + //| // FREE_OP_DATA(); + //| FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline + dasm_put(Dst, 4482); + if ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))); + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_1(val_info)) { + if (((val_info) & MAY_BE_GUARD) || RC_MAY_BE_N(val_info)) { + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((val_info) & MAY_BE_GUARD) + && has_concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((val_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((val_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((val_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((val_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(val_info) && ((val_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((val_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, (opline+1)->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((val_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14597 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 14599 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|9: + dasm_put(Dst, 4230); +#line 14602 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type != IS_UNUSED && !delayed_fetch_this && !op1_indirect) { + //| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (1) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (1 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14604 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (may_throw) { + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_free(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, int may_throw) +{ + zend_jit_addr op1_addr = OP1_ADDR(); + + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) { + if (may_throw) { + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14622 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_FE_FREE && (op1_info & (MAY_BE_OBJECT|MAY_BE_REF))) { + if (op1_info & MAY_BE_ARRAY) { + //| IF_ZVAL_TYPE op1_addr, IS_ARRAY, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 8084, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_ARRAY); +#line 14626 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG1d, dword [FP + opline->op1.var + offsetof(zval, u2.fe_iter_idx)] + //| cmp FCARG1d, -1 + //| je >7 + //| EXT_CALL zend_hash_iterator_del, r0 + dasm_put(Dst, 8097, opline->op1.var + offsetof(zval, u2.fe_iter_idx)); + if (MAY_USE_32BIT_ADDR(zend_hash_iterator_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_iterator_del)); + } else { + if (IS_SIGNED_32BIT(zend_hash_iterator_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_iterator_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_iterator_del)), (unsigned int)((((ptrdiff_t)zend_hash_iterator_del))>>32)); + } + dasm_put(Dst, 66); + } +#line 14631 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|7: + dasm_put(Dst, 4482); +#line 14632 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_PTR_DTOR op1_addr, op1_info, 0, 0, opline + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 14634 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (may_throw) { + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + } + + return 1; +} + +static int zend_jit_echo(dasm_State **Dst, const zend_op *opline, uint32_t op1_info) +{ + if (opline->op1_type == IS_CONST) { + zval *zv; + size_t len; + + zv = RT_CONSTANT(opline, opline->op1); + ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING); + len = Z_STRLEN_P(zv); + + if (len > 0) { + const char *str = Z_STRVAL_P(zv); + + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14658 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| LOAD_ADDR CARG1, str + if (IS_SIGNED_32BIT(str)) { + dasm_put(Dst, 798, ((ptrdiff_t)str)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)str)), (unsigned int)((((ptrdiff_t)str))>>32)); + } +#line 14660 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| LOAD_ADDR CARG2, len + if (IS_SIGNED_32BIT(len)) { + dasm_put(Dst, 751, ((ptrdiff_t)len)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)len)), (unsigned int)((((ptrdiff_t)len))>>32)); + } +#line 14661 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_write, r0 + if (MAY_USE_32BIT_ADDR(zend_write)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_write)); + } else { + if (IS_SIGNED_32BIT(zend_write)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_write)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_write)), (unsigned int)((((ptrdiff_t)zend_write))>>32)); + } + dasm_put(Dst, 66); + } +#line 14662 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| mov aword A2, len + //| mov aword A1, str + //| EXT_CALL zend_write, r0 + //|.endif + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + } else { + zend_jit_addr op1_addr = OP1_ADDR(); + + ZEND_ASSERT((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_STRING); + + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14677 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR r0, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 14678 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.if X64 + //| lea CARG1, aword [r0 + offsetof(zend_string, val)] + //| mov CARG2, aword [r0 + offsetof(zend_string, len)] + //| EXT_CALL zend_write, r0 + dasm_put(Dst, 8111, (Z_REG(op1_addr)), Z_OFFSET(op1_addr), offsetof(zend_string, val), offsetof(zend_string, len)); + if (MAY_USE_32BIT_ADDR(zend_write)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_write)); + } else { + if (IS_SIGNED_32BIT(zend_write)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_write)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_write)), (unsigned int)((((ptrdiff_t)zend_write))>>32)); + } + dasm_put(Dst, 66); + } +#line 14682 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| add r0, offsetof(zend_string, val) + //| mov aword A1, r0 + //| mov r0, aword [r0 + (offsetof(zend_string, len)-offsetof(zend_string, val))] + //| mov aword A2, r0 + //| EXT_CALL zend_write, r0 + //|.endif + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + //| ZVAL_PTR_DTOR op1_addr, op1_info, 0, 0, opline + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } +#line 14691 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (!zend_jit_check_exception(Dst)) { + return 0; + } + } + return 1; +} + +static int zend_jit_strlen(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr res_addr) +{ + if (opline->op1_type == IS_CONST) { + zval *zv; + size_t len; + + zv = RT_CONSTANT(opline, opline->op1); + ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING); + len = Z_STRLEN_P(zv); + + //| SET_ZVAL_LVAL res_addr, len + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(res_addr)), len); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(res_addr)), Z_OFFSET(res_addr), len); + } +#line 14710 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 14712 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, MAY_BE_LONG)) { + return 0; + } + } else { + ZEND_ASSERT((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_STRING); + + if (Z_MODE(res_addr) == IS_REG) { + //| GET_ZVAL_PTR Ra(Z_REG(res_addr)), op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 14720 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov Ra(Z_REG(res_addr)), aword [Ra(Z_REG(res_addr))+offsetof(zend_string, len)] + dasm_put(Dst, 1665, (Z_REG(res_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr), (Z_REG(res_addr)), (Z_REG(res_addr)), offsetof(zend_string, len)); +#line 14721 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, MAY_BE_LONG)) { + return 0; + } + } else { + //| GET_ZVAL_PTR r0, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 14726 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, aword [r0 + offsetof(zend_string, len)] + //| SET_ZVAL_LVAL res_addr, r0 + dasm_put(Dst, 8127, (Z_REG(op1_addr)), Z_OFFSET(op1_addr), offsetof(zend_string, len)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 14728 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 14729 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14731 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; +} + +static int zend_jit_count(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, zend_jit_addr res_addr, int may_throw) +{ + if (opline->op1_type == IS_CONST) { + zval *zv; + zend_long count; + + zv = RT_CONSTANT(opline, opline->op1); + ZEND_ASSERT(Z_TYPE_P(zv) == IS_ARRAY); + count = zend_hash_num_elements(Z_ARRVAL_P(zv)); + + //| SET_ZVAL_LVAL res_addr, count + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(res_addr)), count); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(res_addr)), Z_OFFSET(res_addr), count); + } +#line 14746 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 14748 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, MAY_BE_LONG)) { + return 0; + } + } else { + ZEND_ASSERT((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY); + // Note: See the implementation of ZEND_COUNT in Zend/zend_vm_def.h - arrays do not contain IS_UNDEF starting in php 8.1+. + + if (Z_MODE(res_addr) == IS_REG) { + //| GET_ZVAL_PTR Ra(Z_REG(res_addr)), op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 14757 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + // Sign-extend the 32-bit value to a potentially 64-bit zend_long + //| mov Rd(Z_REG(res_addr)), dword [Ra(Z_REG(res_addr))+offsetof(HashTable, nNumOfElements)] + dasm_put(Dst, 2205, (Z_REG(res_addr)), (Z_REG(res_addr)), offsetof(HashTable, nNumOfElements)); +#line 14759 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, MAY_BE_LONG)) { + return 0; + } + } else { + //| GET_ZVAL_PTR r0, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 6009, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 14764 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + // Sign-extend the 32-bit value to a potentially 64-bit zend_long + //| mov eax, dword [r0 + offsetof(HashTable, nNumOfElements)] + //| SET_ZVAL_LVAL res_addr, r0 + dasm_put(Dst, 34, offsetof(HashTable, nNumOfElements)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 14767 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 14768 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline + if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + if ((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF|MAY_BE_GUARD)) { + if ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + if (0) { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 263, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + dasm_put(Dst, 70); + } else { + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type_flags), IS_TYPE_REFCOUNTED); + } + } + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 292, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))); + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_1(op1_info)) { + if (((op1_info) & MAY_BE_GUARD) || RC_MAY_BE_N(op1_info)) { + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 303); + } else { + dasm_put(Dst, 308); + } + } + do { + if (!((op1_info) & MAY_BE_GUARD) + && has_concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + uint8_t type = concrete_type((op1_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + if (type == IS_STRING && !ZEND_DEBUG) { + if (MAY_USE_32BIT_ADDR(_efree)) { + dasm_put(Dst, 53, (ptrdiff_t)(_efree)); + } else { + if (IS_SIGNED_32BIT(_efree)) { + dasm_put(Dst, 56, ((ptrdiff_t)_efree)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)_efree)), (unsigned int)((((ptrdiff_t)_efree))>>32)); + } + dasm_put(Dst, 66); + } + break; + } else if (type == IS_ARRAY) { + if ((op1_info) & (MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF)) { + if (opline && ((op1_info) & (MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_REF))) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_array_destroy)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_array_destroy)); + } else { + if (IS_SIGNED_32BIT(zend_array_destroy)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_array_destroy)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_array_destroy)), (unsigned int)((((ptrdiff_t)zend_array_destroy))>>32)); + } + dasm_put(Dst, 66); + } + } else { + if (MAY_USE_32BIT_ADDR(zend_jit_array_free)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_array_free)); + } else { + if (IS_SIGNED_32BIT(zend_jit_array_free)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_array_free)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_array_free)), (unsigned int)((((ptrdiff_t)zend_jit_array_free))>>32)); + } + dasm_put(Dst, 66); + } + } + break; + } else if (type == IS_OBJECT) { + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(zend_objects_store_del)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_objects_store_del)); + } else { + if (IS_SIGNED_32BIT(zend_objects_store_del)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_objects_store_del)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_objects_store_del)), (unsigned int)((((ptrdiff_t)zend_objects_store_del))>>32)); + } + dasm_put(Dst, 66); + } + break; + } + } + if (opline) { + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } + } + if (MAY_USE_32BIT_ADDR(rc_dtor_func)) { + dasm_put(Dst, 53, (ptrdiff_t)(rc_dtor_func)); + } else { + if (IS_SIGNED_32BIT(rc_dtor_func)) { + dasm_put(Dst, 56, ((ptrdiff_t)rc_dtor_func)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)rc_dtor_func)), (unsigned int)((((ptrdiff_t)rc_dtor_func))>>32)); + } + dasm_put(Dst, 66); + } + } while(0); + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + dasm_put(Dst, 328); + } + dasm_put(Dst, 333); + } + if (0 && (((op1_info) & MAY_BE_GUARD) || (RC_MAY_BE_N(op1_info) && ((op1_info) & (MAY_BE_REF|MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0))) { + if ((op1_info) & (MAY_BE_REF|MAY_BE_GUARD)) { + zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + ZEND_ASSERT(Z_MODE(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var)) == IS_MEM_ZVAL); + dasm_put(Dst, 336, (Z_REG(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))), Z_OFFSET(ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var))+offsetof(zval, u1.v.type), IS_REFERENCE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 278, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)+offsetof(zval, u1.v.type_flags), IS_TYPE_COLLECTABLE); + ZEND_ASSERT(Z_MODE(ref_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 349, (Z_REG(ref_addr)), Z_OFFSET(ref_addr)); + } + dasm_put(Dst, 359, (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))); + if (MAY_USE_32BIT_ADDR(gc_possible_root)) { + dasm_put(Dst, 53, (ptrdiff_t)(gc_possible_root)); + } else { + if (IS_SIGNED_32BIT(gc_possible_root)) { + dasm_put(Dst, 56, ((ptrdiff_t)gc_possible_root)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)gc_possible_root)), (unsigned int)((((ptrdiff_t)gc_possible_root))>>32)); + } + dasm_put(Dst, 66); + } + } + if (0 && ((op1_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT|MAY_BE_GUARD)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) != 0) { + dasm_put(Dst, 369); + } + dasm_put(Dst, 375); + } + } +#line 14770 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (may_throw) { + return zend_jit_check_exception(Dst); + } + return 1; +} + +static int zend_jit_load_this(dasm_State **Dst, uint32_t var) +{ + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var); + + //| mov FCARG1a, aword EX->This.value.ptr + //| SET_ZVAL_PTR var_addr, FCARG1a + dasm_put(Dst, 563, Dt1(->This.value.ptr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 14784 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO var_addr, IS_OBJECT_EX + dasm_put(Dst, 7812, (Z_REG(var_addr)), Z_OFFSET(var_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 14785 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GC_ADDREF FCARG1a + dasm_put(Dst, 8139, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), IS_OBJECT_EX); +#line 14786 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_fetch_this(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, bool check_only) +{ + if (!op_array->scope || (op_array->fn_flags & ZEND_ACC_STATIC)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + if (!JIT_G(current_frame) || + !TRACE_FRAME_IS_THIS_CHECKED(JIT_G(current_frame))) { + + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //| cmp byte EX->This.u1.v.type, IS_OBJECT + //| jne &exit_addr + dasm_put(Dst, 1742, Dt1(->This.u1.v.type), IS_OBJECT, (ptrdiff_t)(exit_addr)); +#line 14806 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (JIT_G(current_frame)) { + TRACE_FRAME_SET_THIS_CHECKED(JIT_G(current_frame)); + } + } + } else { + + //| cmp byte EX->This.u1.v.type, IS_OBJECT + //| jne >1 + //|.cold_code + dasm_put(Dst, 8151, Dt1(->This.u1.v.type), IS_OBJECT); +#line 14816 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 70); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 14818 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp ->invalid_this + //|.code + dasm_put(Dst, 8162); +#line 14820 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (!check_only) { + if (!zend_jit_load_this(Dst, opline->result.var)) { + return 0; + } + } + + return 1; +} + +static int zend_jit_hash_jmp(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, HashTable *jumptable, int default_b, const void *default_label, const zend_op *next_opline, zend_jit_trace_info *trace_info) +{ + uint32_t count; + Bucket *p; + const zend_op *target; + int b; + int32_t exit_point; + const void *exit_addr; + + //| test r0, r0 + dasm_put(Dst, 3655); +#line 14842 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (default_label) { + //| jz &default_label + dasm_put(Dst, 1795, (ptrdiff_t)(default_label)); +#line 14844 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| jz >3 + dasm_put(Dst, 4027); +#line 14846 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jz =>default_b + dasm_put(Dst, 4700, default_b); +#line 14848 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG1a, jumptable + if (IS_SIGNED_32BIT(jumptable)) { + dasm_put(Dst, 798, ((ptrdiff_t)jumptable)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)jumptable)), (unsigned int)((((ptrdiff_t)jumptable))>>32)); + } +#line 14850 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| sub r0, aword [FCARG1a + offsetof(HashTable, arData)] + dasm_put(Dst, 8168, offsetof(HashTable, arData)); +#line 14851 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (HT_IS_PACKED(jumptable)) { + //| mov FCARG1a, (sizeof(zval) / sizeof(void*)) + dasm_put(Dst, 798, (sizeof(zval) / sizeof(void*))); +#line 14853 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov FCARG1a, (sizeof(Bucket) / sizeof(void*)) + dasm_put(Dst, 798, (sizeof(Bucket) / sizeof(void*))); +#line 14855 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if X64 + //| cqo + //|.else + //| cdq + //|.endif + //| idiv FCARG1a + //|.if X64 + dasm_put(Dst, 8173); +#line 14863 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!IS_32BIT(dasm_end)) { + //| lea FCARG1a, aword [>4] + //| jmp aword [FCARG1a + r0] + dasm_put(Dst, 8181); +#line 14866 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp aword [r0 + >4] + dasm_put(Dst, 8191); +#line 14868 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| jmp aword [r0 + >4] + //|.endif + //|.jmp_table + dasm_put(Dst, 8197); +#line 14873 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.align aword + //|4: + dasm_put(Dst, 8199); +#line 14875 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (trace_info) { + trace_info->jmp_table_size += zend_hash_num_elements(jumptable); + } + + count = jumptable->nNumUsed; + p = jumptable->arData; + do { + if (Z_TYPE(p->val) == IS_UNDEF) { + if (default_label) { + //| .aword &default_label + dasm_put(Dst, 63, (unsigned int)((ptrdiff_t)(default_label)), (unsigned int)((unsigned long long)((ptrdiff_t)(default_label))>>32)); +#line 14885 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| .aword >3 + dasm_put(Dst, 8204); +#line 14887 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| .aword =>default_b + dasm_put(Dst, 51, default_b); +#line 14889 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + target = ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL(p->val)); + if (!next_opline) { + b = ssa->cfg.map[target - op_array->opcodes]; + //| .aword =>b + dasm_put(Dst, 51, b); +#line 14895 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline == target) { + //| .aword >3 + dasm_put(Dst, 8204); +#line 14897 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + exit_point = zend_jit_trace_get_exit_point(target, 0); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| .aword &exit_addr + dasm_put(Dst, 63, (unsigned int)((ptrdiff_t)(exit_addr)), (unsigned int)((unsigned long long)((ptrdiff_t)(exit_addr))>>32)); +#line 14904 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (HT_IS_PACKED(jumptable)) { + p = (Bucket*)(((zval*)p)+1); + } else { + p++; + } + count--; + } while (count); + //|.code + dasm_put(Dst, 373); +#line 14914 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, zend_jit_trace_rec *trace, zend_jit_trace_info *trace_info) +{ + HashTable *jumptable = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2)); + const zend_op *next_opline = NULL; + + if (trace) { + ZEND_ASSERT(trace->op == ZEND_JIT_TRACE_VM || trace->op == ZEND_JIT_TRACE_END); + ZEND_ASSERT(trace->opline != NULL); + next_opline = trace->opline; + } + + if (opline->op1_type == IS_CONST) { + zval *zv = RT_CONSTANT(opline, opline->op1); + zval *jump_zv = NULL; + int b; + + if (opline->opcode == ZEND_SWITCH_LONG) { + if (Z_TYPE_P(zv) == IS_LONG) { + jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(zv)); + } + } else if (opline->opcode == ZEND_SWITCH_STRING) { + if (Z_TYPE_P(zv) == IS_STRING) { + jump_zv = zend_hash_find_known_hash(jumptable, Z_STR_P(zv)); + } + } else if (opline->opcode == ZEND_MATCH) { + if (Z_TYPE_P(zv) == IS_LONG) { + jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(zv)); + } else if (Z_TYPE_P(zv) == IS_STRING) { + jump_zv = zend_hash_find_known_hash(jumptable, Z_STR_P(zv)); + } + } else { + ZEND_UNREACHABLE(); + } + if (next_opline) { + const zend_op *target; + + if (jump_zv != NULL) { + target = ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL_P(jump_zv)); + } else { + target = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); + } + ZEND_ASSERT(target == next_opline); + } else { + if (jump_zv != NULL) { + b = ssa->cfg.map[ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL_P(jump_zv)) - op_array->opcodes]; + } else { + b = ssa->cfg.map[ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) - op_array->opcodes]; + } + //| jmp =>b + dasm_put(Dst, 1614, b); +#line 14967 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; + uint32_t op1_info = OP1_INFO(); + zend_jit_addr op1_addr = OP1_ADDR(); + const zend_op *default_opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); + const zend_op *target; + int default_b = next_opline ? -1 : ssa->cfg.map[default_opline - op_array->opcodes]; + int b; + int32_t exit_point; + const void *fallback_label = NULL; + const void *default_label = NULL; + const void *exit_addr; + + if (next_opline) { + if (next_opline != opline + 1) { + exit_point = zend_jit_trace_get_exit_point(opline + 1, 0); + fallback_label = zend_jit_trace_get_exit_addr(exit_point); + if (!fallback_label) { + return 0; + } + } + if (next_opline != default_opline) { + exit_point = zend_jit_trace_get_exit_point(default_opline, 0); + default_label = zend_jit_trace_get_exit_addr(exit_point); + if (!default_label) { + return 0; + } + } + } + + if (opline->opcode == ZEND_SWITCH_LONG) { + if (op1_info & MAY_BE_LONG) { + if (op1_info & MAY_BE_REF) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 15002 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_LVAL ZREG_FCARG2, op1_addr + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 15003 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 276); +#line 15004 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // ZVAL_DEREF(op) + dasm_put(Dst, 70); +#line 15006 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (fallback_label) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, &fallback_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE, (ptrdiff_t)(fallback_label)); +#line 15008 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); +#line 15010 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_PTR FCARG2a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 8207, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 15012 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (fallback_label) { + //| IF_NOT_Z_TYPE FCARG2a + offsetof(zend_reference, val), IS_LONG, &fallback_label + dasm_put(Dst, 1743, offsetof(zend_reference, val)+offsetof(zval, u1.v.type), IS_LONG, (ptrdiff_t)(fallback_label)); +#line 15014 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_Z_TYPE FCARG2a + offsetof(zend_reference, val), IS_LONG, >3 + dasm_put(Dst, 8215, offsetof(zend_reference, val)+offsetof(zval, u1.v.type), IS_LONG); +#line 15016 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG2a, aword [FCARG2a + offsetof(zend_reference, val.value.lval)] + //| jmp >2 + //|.code + dasm_put(Dst, 8224, offsetof(zend_reference, val.value.lval)); +#line 15020 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 15021 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) { + if (fallback_label) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, &fallback_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG, (ptrdiff_t)(fallback_label)); +#line 15025 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 15027 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_LVAL ZREG_FCARG2, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 15030 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (HT_IS_PACKED(jumptable)) { + uint32_t count = jumptable->nNumUsed; + zval *zv = jumptable->arPacked; + + //| cmp FCARG2a, jumptable->nNumUsed + dasm_put(Dst, 8234, jumptable->nNumUsed); +#line 15036 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (default_label) { + //| jae &default_label + dasm_put(Dst, 1756, (ptrdiff_t)(default_label)); +#line 15038 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| jae >3 + dasm_put(Dst, 8240); +#line 15040 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jae =>default_b + dasm_put(Dst, 4822, default_b); +#line 15042 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.if X64 + if (!IS_32BIT(dasm_end)) { + //| lea r0, aword [>4] + //| jmp aword [r0 + FCARG2a * 8] + dasm_put(Dst, 8245); +#line 15047 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp aword [FCARG2a * 8 + >4] + dasm_put(Dst, 8256); +#line 15049 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|.else + //| jmp aword [FCARG2a * 4 + >4] + //|.endif + //|.jmp_table + dasm_put(Dst, 8197); +#line 15054 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.align aword + //|4: + dasm_put(Dst, 8199); +#line 15056 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (trace_info) { + trace_info->jmp_table_size += count; + } + do { + if (Z_TYPE_P(zv) == IS_UNDEF) { + if (default_label) { + //| .aword &default_label + dasm_put(Dst, 63, (unsigned int)((ptrdiff_t)(default_label)), (unsigned int)((unsigned long long)((ptrdiff_t)(default_label))>>32)); +#line 15063 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| .aword >3 + dasm_put(Dst, 8204); +#line 15065 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| .aword =>default_b + dasm_put(Dst, 51, default_b); +#line 15067 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + target = ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL_P(zv)); + if (!next_opline) { + b = ssa->cfg.map[target - op_array->opcodes]; + //| .aword =>b + dasm_put(Dst, 51, b); +#line 15073 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline == target) { + //| .aword >3 + dasm_put(Dst, 8204); +#line 15075 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + exit_point = zend_jit_trace_get_exit_point(target, 0); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + //| .aword &exit_addr + dasm_put(Dst, 63, (unsigned int)((ptrdiff_t)(exit_addr)), (unsigned int)((unsigned long long)((ptrdiff_t)(exit_addr))>>32)); +#line 15082 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + zv++; + count--; + } while (count); + //|.code + dasm_put(Dst, 373); +#line 15088 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|3: + dasm_put(Dst, 333); +#line 15089 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| LOAD_ADDR FCARG1a, jumptable + if (IS_SIGNED_32BIT(jumptable)) { + dasm_put(Dst, 798, ((ptrdiff_t)jumptable)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)jumptable)), (unsigned int)((((ptrdiff_t)jumptable))>>32)); + } +#line 15091 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_index_find, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_index_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_index_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_index_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_index_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_index_find)), (unsigned int)((((ptrdiff_t)zend_hash_index_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 15092 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_hash_jmp(Dst, opline, op_array, ssa, jumptable, default_b, default_label, next_opline, trace_info)) { + return 0; + } + //|3: + dasm_put(Dst, 333); +#line 15096 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } else if (opline->opcode == ZEND_SWITCH_STRING) { + if (op1_info & MAY_BE_STRING) { + if (op1_info & MAY_BE_REF) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >1 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 15102 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR FCARG2a, op1_addr + dasm_put(Dst, 336, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 15103 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.cold_code + dasm_put(Dst, 8264, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 15104 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + //| // ZVAL_DEREF(op) + dasm_put(Dst, 70); +#line 15106 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (fallback_label) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, &fallback_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE, (ptrdiff_t)(fallback_label)); +#line 15108 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_REFERENCE); +#line 15110 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| GET_ZVAL_PTR FCARG2a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 8207, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 15112 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (fallback_label) { + //| IF_NOT_Z_TYPE FCARG2a + offsetof(zend_reference, val), IS_STRING, &fallback_label + dasm_put(Dst, 1743, offsetof(zend_reference, val)+offsetof(zval, u1.v.type), IS_STRING, (ptrdiff_t)(fallback_label)); +#line 15114 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_Z_TYPE FCARG2a + offsetof(zend_reference, val), IS_STRING, >3 + dasm_put(Dst, 8215, offsetof(zend_reference, val)+offsetof(zval, u1.v.type), IS_STRING); +#line 15116 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| mov FCARG2a, aword [FCARG2a + offsetof(zend_reference, val.value.ptr)] + //| jmp >2 + //|.code + dasm_put(Dst, 8224, offsetof(zend_reference, val.value.ptr)); +#line 15120 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|2: + dasm_put(Dst, 2065); +#line 15121 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_STRING)) { + if (fallback_label) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, &fallback_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING, (ptrdiff_t)(fallback_label)); +#line 15125 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING); +#line 15127 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG2a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 8207, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 15130 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| LOAD_ADDR FCARG1a, jumptable + if (IS_SIGNED_32BIT(jumptable)) { + dasm_put(Dst, 798, ((ptrdiff_t)jumptable)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)jumptable)), (unsigned int)((((ptrdiff_t)jumptable))>>32)); + } +#line 15132 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_find, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find)), (unsigned int)((((ptrdiff_t)zend_hash_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 15133 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_hash_jmp(Dst, opline, op_array, ssa, jumptable, default_b, default_label, next_opline, trace_info)) { + return 0; + } + //|3: + dasm_put(Dst, 333); +#line 15137 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (opline->opcode == ZEND_MATCH) { + if (op1_info & (MAY_BE_LONG|MAY_BE_STRING)) { + if (op1_info & MAY_BE_REF) { + //| LOAD_ZVAL_ADDR FCARG2a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 751, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2376, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2384, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 15142 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| ZVAL_DEREF FCARG2a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5340, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 15143 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); + } + //| LOAD_ADDR FCARG1a, jumptable + if (IS_SIGNED_32BIT(jumptable)) { + dasm_put(Dst, 798, ((ptrdiff_t)jumptable)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)jumptable)), (unsigned int)((((ptrdiff_t)jumptable))>>32)); + } +#line 15146 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_LONG) { + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) { + if (op1_info & MAY_BE_STRING) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >5 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5176, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 15150 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (op1_info & MAY_BE_UNDEF) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 15152 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (default_label) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, &default_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG, (ptrdiff_t)(default_label)); +#line 15154 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG); +#line 15156 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, =>default_b + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 8273, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_LONG, default_b); +#line 15158 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_LVAL ZREG_FCARG2, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG2), (ZREG_FCARG2)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG2), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG2), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG2), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG2 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG2)); + } + } else { + ZEND_UNREACHABLE(); + } +#line 15161 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_index_find, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_index_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_index_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_index_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_index_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_index_find)), (unsigned int)((((ptrdiff_t)zend_hash_index_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 15162 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_STRING) { + //| jmp >2 + dasm_put(Dst, 3762); +#line 15164 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (op1_info & MAY_BE_STRING) { + //|5: + dasm_put(Dst, 509); +#line 15168 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_STRING))) { + if (op1_info & MAY_BE_UNDEF) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING); +#line 15171 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (default_label) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, &default_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING, (ptrdiff_t)(default_label)); +#line 15173 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING); +#line 15175 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, =>default_b + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 8273, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_STRING, default_b); +#line 15177 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| GET_ZVAL_PTR FCARG2a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 15180 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_find, r0 + dasm_put(Dst, 8207, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + if (MAY_USE_32BIT_ADDR(zend_hash_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find)), (unsigned int)((((ptrdiff_t)zend_hash_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 15181 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|2: + dasm_put(Dst, 2065); +#line 15183 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_hash_jmp(Dst, opline, op_array, ssa, jumptable, default_b, default_label, next_opline, trace_info)) { + return 0; + } + } + if (op1_info & MAY_BE_UNDEF) { + //|6: + dasm_put(Dst, 3411); +#line 15189 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & (MAY_BE_ANY-(MAY_BE_LONG|MAY_BE_STRING))) { + if (default_label) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, &default_label + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF, (ptrdiff_t)(default_label)); +#line 15192 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >3 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3360, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF); +#line 15194 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, =>default_b + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 8273, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF, default_b); +#line 15196 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var)))); + //| SET_EX_OPLINE opline, r0 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 15200 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1d, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, r0 + dasm_put(Dst, 2338, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 15202 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_check_exception_undef_result(Dst, opline)) { + return 0; + } + } + if (default_label) { + //| jmp &default_label + dasm_put(Dst, 146, (ptrdiff_t)(default_label)); +#line 15208 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (next_opline) { + //| jmp >3 + dasm_put(Dst, 3991); +#line 15210 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jmp =>default_b + dasm_put(Dst, 1614, default_b); +#line 15212 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 15214 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } + return 1; +} + +static bool zend_jit_verify_return_type(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info) +{ + zend_arg_info *arg_info = &op_array->arg_info[-1]; + ZEND_ASSERT(ZEND_TYPE_IS_SET(arg_info->type)); + zend_jit_addr op1_addr = OP1_ADDR(); + bool needs_slow_check = 1; + bool slow_check_in_cold = 1; + uint32_t type_mask = ZEND_TYPE_PURE_MASK(arg_info->type) & MAY_BE_ANY; + + if (type_mask == 0) { + slow_check_in_cold = 0; + } else { + if (((op1_info & MAY_BE_ANY) & type_mask) == 0) { + slow_check_in_cold = 0; + } else if (((op1_info & MAY_BE_ANY) | type_mask) == type_mask) { + needs_slow_check = 0; + } else if (is_power_of_two(type_mask)) { + uint32_t type_code = concrete_type(type_mask); + //| IF_NOT_ZVAL_TYPE op1_addr, type_code, >6 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3373, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), type_code); +#line 15240 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| mov edx, 1 + //| GET_ZVAL_TYPE cl, op1_addr + dasm_put(Dst, 8285); + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 15243 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| shl edx, cl + //| test edx, type_mask + //| je >6 + dasm_put(Dst, 8291, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.v.type), type_mask); +#line 15246 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (needs_slow_check) { + if (slow_check_in_cold) { + //|.cold_code + dasm_put(Dst, 276); +#line 15251 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|6: + dasm_put(Dst, 3411); +#line 15252 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| SET_EX_OPLINE opline, r1 + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 8309, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 15254 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (op1_info & MAY_BE_UNDEF) { + //| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >7 + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 15256 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG1a, opline->op1.var + //| EXT_CALL zend_jit_undefined_op_helper, FCARG2a + dasm_put(Dst, 8318, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_UNDEF, opline->op1.var); + if (MAY_USE_32BIT_ADDR(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_undefined_op_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_undefined_op_helper)) { + dasm_put(Dst, 751, ((ptrdiff_t)zend_jit_undefined_op_helper)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)zend_jit_undefined_op_helper)), (unsigned int)((((ptrdiff_t)zend_jit_undefined_op_helper))>>32)); + } + dasm_put(Dst, 8335); + } +#line 15258 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test r0, r0 + //| jz ->exception_handler + //| LOAD_ADDR_ZTS FCARG1a, executor_globals, uninitialized_zval + dasm_put(Dst, 8339); + if (tsrm_ls_cache_tcb_offset) { + dasm_put(Dst, 5207, tsrm_ls_cache_tcb_offset); + } else { + dasm_put(Dst, 5213, tsrm_tls_index, tsrm_tls_offset); + } +#line 15261 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >8 + dasm_put(Dst, 8348, (executor_globals_offset + offsetof(zend_executor_globals, uninitialized_zval))); +#line 15262 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|7: + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + dasm_put(Dst, 4482); + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 15265 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|8: + //| mov FCARG2a, EX->func + //|.if X64 + //| LOAD_ADDR CARG3, (ptrdiff_t)arg_info + dasm_put(Dst, 8357, Dt1(->func)); + if (IS_SIGNED_32BIT((ptrdiff_t)arg_info)) { + dasm_put(Dst, 3414, ((ptrdiff_t)(ptrdiff_t)arg_info)); + } else { + dasm_put(Dst, 3419, (unsigned int)(((ptrdiff_t)(ptrdiff_t)arg_info)), (unsigned int)((((ptrdiff_t)(ptrdiff_t)arg_info))>>32)); + } +#line 15269 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov r0, EX->run_time_cache + //| lea CARG4, aword [r0+opline->op2.num] + //| EXT_CALL zend_jit_verify_return_slow, r0 + dasm_put(Dst, 8364, Dt1(->run_time_cache), opline->op2.num); + if (MAY_USE_32BIT_ADDR(zend_jit_verify_return_slow)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_verify_return_slow)); + } else { + if (IS_SIGNED_32BIT(zend_jit_verify_return_slow)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_verify_return_slow)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_verify_return_slow)), (unsigned int)((((ptrdiff_t)zend_jit_verify_return_slow))>>32)); + } + dasm_put(Dst, 66); + } +#line 15272 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|.else + //| sub r4, 8 + //| mov r0, EX->run_time_cache + //| add r0, opline->op2.num + //| push r0 + //| push (ptrdiff_t)arg_info + //| EXT_CALL zend_jit_verify_return_slow, r0 + //| add r4, 8 + //|.endif + if (!zend_jit_check_exception(Dst)) { + return 0; + } + if (slow_check_in_cold) { + //| jmp >9 + //|.code + dasm_put(Dst, 4204); +#line 15287 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //|9: + dasm_put(Dst, 4230); +#line 15290 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + return 1; +} + +static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + // TODO: support for empty() ??? + ZEND_ASSERT(!(opline->extended_value & ZEND_ISEMPTY)); + + if (op1_info & MAY_BE_REF) { + if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != ZREG_FCARG1 || Z_OFFSET(op1_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, op1_addr + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(op1_addr)) { + dasm_put(Dst, 2341, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(op1_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 15303 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + } + //| ZVAL_DEREF FCARG1a, op1_info + if (op1_info & MAY_BE_REF) { + dasm_put(Dst, 5322, offsetof(zval, u1.v.type), IS_REFERENCE, offsetof(zend_reference, val)); + } +#line 15306 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|1: + dasm_put(Dst, 70); +#line 15307 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + if (!(op1_info & (MAY_BE_UNDEF|MAY_BE_NULL))) { + if (exit_addr) { + ZEND_ASSERT(smart_branch_opcode == ZEND_JMPZ); + } else if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 15315 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_TRUE); +#line 15318 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (!(op1_info & (MAY_BE_ANY - MAY_BE_NULL))) { + if (exit_addr) { + ZEND_ASSERT(smart_branch_opcode == ZEND_JMPNZ); + } else if (smart_branch_opcode) { + if (smart_branch_opcode != ZEND_JMPNZ) { + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 15325 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_FALSE); +#line 15328 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + //| cmp byte [Ra(Z_REG(op1_addr))+Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type)], IS_NULL + dasm_put(Dst, 5382, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval, u1.v.type), IS_NULL); +#line 15332 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPNZ) { + //| jg &exit_addr + dasm_put(Dst, 3864, (ptrdiff_t)(exit_addr)); +#line 15335 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jle &exit_addr + dasm_put(Dst, 3860, (ptrdiff_t)(exit_addr)); +#line 15337 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jle =>target_label + dasm_put(Dst, 4704, target_label); +#line 15341 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + //| jg =>target_label + dasm_put(Dst, 4724, target_label); +#line 15343 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + //| setg al + //| movzx eax, al + //| lea eax, [eax + IS_FALSE] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 8373, IS_FALSE); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 15351 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + return 1; +} + +static int zend_jit_fe_reset(dasm_State **Dst, const zend_op *opline, uint32_t op1_info) +{ + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + if (opline->op1_type == IS_CONST) { + zval *zv = RT_CONSTANT(opline, opline->op1); + + //| ZVAL_COPY_CONST res_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_R0 + if (Z_TYPE_P(zv) > IS_TRUE) { + if (Z_TYPE_P(zv) == IS_DOUBLE) { + zend_reg dst_reg = (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else if (!IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)zv)), (unsigned int)((((uintptr_t)zv))>>32)); + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } else { + dasm_put(Dst, 2028, (dst_reg-ZREG_XMM0), (ZREG_R0), 0); + } + } else { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } else { + dasm_put(Dst, 1988, (dst_reg-ZREG_XMM0), ((uint32_t)(uintptr_t)zv)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (dst_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_TYPE_P(zv) == IS_LONG && MAY_BE_ANY == MAY_BE_DOUBLE) { + zend_reg dst_reg = (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + if (Z_LVAL_P(zv) == 0) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2735, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 2747, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(Z_LVAL_P(zv)), (unsigned int)((Z_LVAL_P(zv))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R0), Z_LVAL_P(zv)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 2756, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } else { + dasm_put(Dst, 2780, (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (dst_reg-ZREG_XMM0), (ZREG_R0)); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (dst_reg != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (dst_reg-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (dst_reg-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_LVAL_P(zv) == 0 && Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + } else { + dasm_put(Dst, 1768, (ZREG_R0), (unsigned int)(((uintptr_t)Z_LVAL_P(zv))), (unsigned int)((((uintptr_t)Z_LVAL_P(zv)))>>32)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R0), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(zv)); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 3894, (Z_REG(res_addr)), Z_OFFSET(res_addr), Z_LVAL_P(zv)); + } + } + } + } + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if (MAY_BE_ANY == MAY_BE_DOUBLE) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_DOUBLE); + } + } else if (((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (1<>32)); + } else { + dasm_put(Dst, 3918, Z_LVAL_P(zv)); + } +#line 15367 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + zend_jit_addr op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var); + + //| // ZVAL_COPY(res, value); + //| ZVAL_COPY_VALUE res_addr, -1, op1_addr, op1_info, ZREG_R0, ZREG_FCARG1 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(op1_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(op1_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(op1_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(op1_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(op1_addr))); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else if (Z_MODE(op1_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(op1_addr)) { + dasm_put(Dst, 1782, (Z_REG(op1_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_FCARG1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_FCARG1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(op1_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(op1_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(op1_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(op1_addr) != IS_REG || ZREG_XMM0 != Z_REG(op1_addr)) { + if (Z_MODE(op1_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(op1_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(op1_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(op1_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(op1_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(op1_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + } + } else if (Z_MODE(op1_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(op1_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(op1_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_FCARG1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_FCARG1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((op1_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(op1_info & MAY_BE_GUARD) && + has_concrete_type(op1_info & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(op1_info); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(op1_addr)), Z_OFFSET(op1_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 15373 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type == IS_CV) { + //| TRY_ADDREF op1_info, ah, FCARG1a + if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 8383); + } +#line 15375 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + //| // Z_FE_POS_P(res) = 0; + //| mov dword [FP + opline->result.var + offsetof(zval, u2.fe_pos)], 0 + dasm_put(Dst, 8389, opline->result.var + offsetof(zval, u2.fe_pos)); +#line 15379 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op2_info, unsigned int target_label, uint8_t exit_opcode, const void *exit_addr) +{ + zend_jit_addr op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var); + + if (!MAY_BE_HASH(op1_info) && !MAY_BE_PACKED(op1_info)) { + /* empty array */ + if (exit_addr) { + if (exit_opcode == ZEND_JMP) { + //| jmp &exit_addr + dasm_put(Dst, 146, (ptrdiff_t)(exit_addr)); +#line 15392 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jmp =>target_label + dasm_put(Dst, 1614, target_label); +#line 15395 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + return 1; + } + + //| // array = EX_VAR(opline->op1.var); + //| // fe_ht = Z_ARRVAL_P(array); + //| GET_ZVAL_PTR FCARG1a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); +#line 15402 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (op1_info & MAY_BE_PACKED_GUARD) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_PACKED_GUARD); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + if (op1_info & MAY_BE_ARRAY_PACKED) { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jz &exit_addr + dasm_put(Dst, 1790, offsetof(zend_array, u.flags), HASH_FLAG_PACKED, (ptrdiff_t)(exit_addr)); +#line 15413 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jnz &exit_addr + dasm_put(Dst, 1799, offsetof(zend_array, u.flags), HASH_FLAG_PACKED, (ptrdiff_t)(exit_addr)); +#line 15416 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + //| // pos = Z_FE_POS_P(array); + //| mov eax, dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)] + dasm_put(Dst, 8398, opline->op1.var + offsetof(zval, u2.fe_pos)); +#line 15421 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if (MAY_BE_HASH(op1_info)) { + if (MAY_BE_PACKED(op1_info)) { + //| test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + //| jnz >2 + dasm_put(Dst, 8403, offsetof(zend_array, u.flags), HASH_FLAG_PACKED); +#line 15426 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //| // p = fe_ht->arData + pos; + //|.if X64 + ZEND_ASSERT(sizeof(Bucket) == 32); + //| mov FCARG2d, eax + //| shl FCARG2a, 5 + //|.else + //| imul FCARG2a, r0, sizeof(Bucket) + //|.endif + //| add FCARG2a, aword [FCARG1a + offsetof(zend_array, arData)] + //|1: + //| // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + //| cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], eax + //| // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + //| // ZEND_VM_CONTINUE(); + dasm_put(Dst, 8413, offsetof(zend_array, arData), offsetof(zend_array, nNumUsed)); +#line 15442 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (exit_opcode == ZEND_JMP) { + //| jbe &exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(exit_addr)); +#line 15445 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jbe >3 + dasm_put(Dst, 8429); +#line 15447 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jbe =>target_label + dasm_put(Dst, 4764, target_label); +#line 15450 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // pos++; + //| add eax, 1 + //| // value_type = Z_TYPE_INFO_P(value); + //| // if (EXPECTED(value_type != IS_UNDEF)) { + dasm_put(Dst, 8434); +#line 15455 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!exit_addr || exit_opcode == ZEND_JMP) { + //| IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >3 + dasm_put(Dst, 8215, offsetof(zval, u1.v.type), IS_UNDEF); +#line 15457 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, &exit_addr + dasm_put(Dst, 1743, offsetof(zval, u1.v.type), IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 15459 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // p++; + //| add FCARG2a, sizeof(Bucket) + //| jmp <1 + dasm_put(Dst, 8438, sizeof(Bucket)); +#line 15463 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (MAY_BE_PACKED(op1_info)) { + //|2: + dasm_put(Dst, 2065); +#line 15465 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (MAY_BE_PACKED(op1_info)) { + //| // p = fe_ht->arPacked + pos; + ZEND_ASSERT(sizeof(zval) == 16); + //| mov FCARG2d, eax + //| shl FCARG2a, 4 + //| add FCARG2a, aword [FCARG1a + offsetof(zend_array, arPacked)] + //|1: + //| // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + //| cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], eax + //| // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + //| // ZEND_VM_CONTINUE(); + dasm_put(Dst, 8447, offsetof(zend_array, arPacked), offsetof(zend_array, nNumUsed)); +#line 15478 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (exit_opcode == ZEND_JMP) { + //| jbe &exit_addr + dasm_put(Dst, 3670, (ptrdiff_t)(exit_addr)); +#line 15481 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jbe >4 + dasm_put(Dst, 8463); +#line 15483 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| jbe =>target_label + dasm_put(Dst, 4764, target_label); +#line 15486 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // pos++; + //| add eax, 1 + //| // value_type = Z_TYPE_INFO_P(value); + //| // if (EXPECTED(value_type != IS_UNDEF)) { + dasm_put(Dst, 8434); +#line 15491 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!exit_addr || exit_opcode == ZEND_JMP) { + //| IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >4 + dasm_put(Dst, 8468, offsetof(zval, u1.v.type), IS_UNDEF); +#line 15493 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, &exit_addr + dasm_put(Dst, 1743, offsetof(zval, u1.v.type), IS_UNDEF, (ptrdiff_t)(exit_addr)); +#line 15495 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| // p++; + //| add FCARG2a, sizeof(zval) + //| jmp <1 + dasm_put(Dst, 8438, sizeof(zval)); +#line 15499 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + + if (!exit_addr || exit_opcode == ZEND_JMP) { + zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); + zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var); + uint32_t val_info; + + if (RETURN_VALUE_USED(opline)) { + zend_jit_addr res_addr = RES_ADDR(); + + if (MAY_BE_HASH(op1_info)) { + //|3: + //| // Z_FE_POS_P(array) = pos + 1; + //| mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax + dasm_put(Dst, 8477, opline->op1.var + offsetof(zval, u2.fe_pos)); +#line 15514 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if ((op1_info & MAY_BE_ARRAY_KEY_LONG) + && (op1_info & MAY_BE_ARRAY_KEY_STRING)) { + //| // if (!p->key) { + //| cmp aword [FCARG2a + offsetof(Bucket, key)], 0 + //| jz >2 + dasm_put(Dst, 8484, offsetof(Bucket, key)); +#line 15520 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (op1_info & MAY_BE_ARRAY_KEY_STRING) { + //| // ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + //| mov r0, aword [FCARG2a + offsetof(Bucket, key)] + //| SET_ZVAL_PTR res_addr, r0 + dasm_put(Dst, 8494, offsetof(Bucket, key)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 15525 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| test dword [r0 + offsetof(zend_refcounted, gc.u.type_info)], IS_STR_INTERNED + //| jz >1 + //| SET_ZVAL_TYPE_INFO res_addr, IS_STRING + dasm_put(Dst, 8499, (Z_REG(res_addr)), Z_OFFSET(res_addr), offsetof(zend_refcounted, gc.u.type_info), IS_STR_INTERNED); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 15528 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| jmp >3 + //|1: + //| GC_ADDREF r0 + //| SET_ZVAL_TYPE_INFO res_addr, IS_STRING_EX + dasm_put(Dst, 8516, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_STRING); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_STRING_EX); +#line 15532 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if ((op1_info & MAY_BE_ARRAY_KEY_LONG) || MAY_BE_PACKED(op1_info)) { + //| jmp >3 + //|2: + dasm_put(Dst, 4044); +#line 15536 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + if (op1_info & MAY_BE_ARRAY_KEY_LONG) { + //| // ZVAL_LONG(EX_VAR(opline->result.var), p->h); + //| mov r0, aword [FCARG2a + offsetof(Bucket, h)] + //| SET_ZVAL_LVAL res_addr, r0 + dasm_put(Dst, 8494, offsetof(Bucket, h)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 15542 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 15543 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (MAY_BE_PACKED(op1_info)) { + //| jmp >3 + dasm_put(Dst, 3991); +#line 15545 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + } + if (MAY_BE_PACKED(op1_info)) { + //|4: + //| // Z_FE_POS_P(array) = pos + 1; + //| mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax + //| sub r0, 1 + //| SET_ZVAL_LVAL res_addr, r0 + dasm_put(Dst, 8534, opline->op1.var + offsetof(zval, u2.fe_pos)); + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 2306, (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } +#line 15554 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_LONG + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_LONG); +#line 15555 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|3: + dasm_put(Dst, 333); +#line 15557 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //|3: + //|4: + //| // Z_FE_POS_P(array) = pos + 1; + //| mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax + dasm_put(Dst, 8545, opline->op1.var + offsetof(zval, u2.fe_pos)); +#line 15562 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + val_info = ((op1_info & MAY_BE_ARRAY_OF_ANY) >> MAY_BE_ARRAY_SHIFT); + if (val_info & MAY_BE_ARRAY) { + val_info |= MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + } + if (op1_info & MAY_BE_ARRAY_OF_REF) { + val_info |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | + MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + } else if (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + val_info |= MAY_BE_RC1 | MAY_BE_RCN; + } + + if (opline->op2_type == IS_CV) { + //| // zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + if (!zend_jit_assign_to_variable(Dst, opline, var_addr, var_addr, op2_info, -1, IS_CV, val_addr, val_info, 0, 1)) { + return 0; + } + } else { + //| // ZVAL_COPY(res, value); + //| ZVAL_COPY_VALUE var_addr, -1, val_addr, val_info, ZREG_R0, ZREG_FCARG1 + if (val_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((val_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(var_addr) != IS_REG || Z_REG(var_addr) != Z_REG(val_addr)) { + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(val_addr)), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(var_addr)), (Z_REG(var_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (Z_REG(var_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(var_addr)), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(var_addr)), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (Z_REG(var_addr) != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(val_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_FCARG1), (ZREG_FCARG1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(val_addr)))) { + dasm_put(Dst, 1768, (ZREG_FCARG1), (unsigned int)(Z_LVAL_P(Z_ZV(val_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(val_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_FCARG1), Z_LVAL_P(Z_ZV(val_addr))); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else if (Z_MODE(val_addr) == IS_REG) { + if (ZREG_FCARG1 != Z_REG(val_addr)) { + dasm_put(Dst, 1782, (Z_REG(val_addr)), (ZREG_FCARG1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(var_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_FCARG1), (Z_REG(var_addr))); + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_FCARG1), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if ((val_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(val_addr) == IS_REG) { + if (Z_MODE(var_addr) == IS_REG) { + if (Z_REG(val_addr) != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(val_addr)-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } else if (Z_MODE(var_addr) == IS_REG) { + if (Z_MODE(val_addr) != IS_REG || Z_REG(var_addr) != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(var_addr)-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(var_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(var_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(val_addr) != IS_REG || ZREG_XMM0 != Z_REG(val_addr)) { + if (Z_MODE(val_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(val_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(val_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(val_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(val_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(val_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(val_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + } + } else if (Z_MODE(val_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(val_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(var_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(var_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(var_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + } + } else if (!(val_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_FCARG1), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_FCARG1), (Z_REG(val_addr)), Z_OFFSET(val_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_FCARG1), (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } + } + if ((val_info & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(val_info & MAY_BE_GUARD) && + has_concrete_type(val_info & MAY_BE_ANY)) { + if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if ((-1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (val_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(val_info); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(val_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(val_addr)), Z_OFFSET(val_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval,u1.type_info)); + } +#line 15583 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF val_info, ah, FCARG1a + if (val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (val_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 8383); + } +#line 15584 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //|3: + //|4: + dasm_put(Dst, 8554); +#line 15588 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_fetch_constant(dasm_State **Dst, + const zend_op *opline, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op, + zend_jit_addr res_addr) +{ + zval *zv = RT_CONSTANT(opline, opline->op2) + 1; + zend_jit_addr const_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + uint32_t res_info = RES_INFO(); + + //| // c = CACHED_PTR(opline->extended_value); + //| mov FCARG1a, EX->run_time_cache + //| mov r0, aword [FCARG1a + opline->extended_value] + //| // if (c != NULL) + //| test r0, r0 + //| jz >9 + dasm_put(Dst, 8559, Dt1(->run_time_cache), opline->extended_value); +#line 15610 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (!zend_jit_is_persistent_constant(zv, opline->op1.num)) { + //| // if (!IS_SPECIAL_CACHE_VAL(c)) + //| test r0, CACHE_SPECIAL + //| jnz >9 + dasm_put(Dst, 8575, CACHE_SPECIAL); +#line 15614 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //|8: + dasm_put(Dst, 4331); +#line 15616 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame)) { + zend_jit_trace_stack *stack = JIT_G(current_frame)->stack; + uint32_t old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + int32_t exit_point; + const void *exit_addr = NULL; + + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_ZVAL_COPY_GPR0); + exit_point = zend_jit_trace_get_exit_point(opline+1, 0); + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + res_info &= ~MAY_BE_GUARD; + ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; + + uint8_t type = concrete_type(res_info); + + if (type < IS_STRING) { + //| IF_NOT_ZVAL_TYPE const_addr, type, &exit_addr + ZEND_ASSERT(Z_MODE(const_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(const_addr)), Z_OFFSET(const_addr)+offsetof(zval, u1.v.type), type, (ptrdiff_t)(exit_addr)); +#line 15638 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_TYPE_INFO edx, const_addr + ZEND_ASSERT(Z_MODE(const_addr) == IS_MEM_ZVAL); +#line 15640 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| IF_NOT_TYPE dl, type, &exit_addr + dasm_put(Dst, 7236, (Z_REG(const_addr)), Z_OFFSET(const_addr)+offsetof(zval,u1.type_info), type, (ptrdiff_t)(exit_addr)); +#line 15641 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| ZVAL_COPY_VALUE_V res_addr, -1, const_addr, res_info, ZREG_R0, ZREG_R1 + if (res_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(const_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(const_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(const_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(const_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(const_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(const_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(const_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(const_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(const_addr))); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else if (Z_MODE(const_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(const_addr)) { + dasm_put(Dst, 1782, (Z_REG(const_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(const_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(const_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(const_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(const_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(const_addr))); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else if (Z_MODE(const_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(const_addr)) { + dasm_put(Dst, 1782, (Z_REG(const_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(const_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(const_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(const_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(const_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(const_addr) != IS_REG || Z_REG(res_addr) != Z_REG(const_addr)) { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(const_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(const_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(const_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(const_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(const_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } + } else if (Z_MODE(const_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(const_addr) != IS_REG || ZREG_XMM0 != Z_REG(const_addr)) { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(const_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(const_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(const_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(const_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(const_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } + } else if (Z_MODE(const_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(res_info & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(const_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(const_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } +#line 15643 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (type < IS_STRING) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + //| SET_ZVAL_TYPE_INFO res_addr, type + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); +#line 15646 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) { + return 0; + } + } else { + //| SET_ZVAL_TYPE_INFO res_addr, edx + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 15651 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF res_info, dh, r1 + dasm_put(Dst, 7123, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + if (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (res_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 4107); + } + dasm_put(Dst, 2199); + } +#line 15652 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else { + //| // ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value); (no dup) + //| ZVAL_COPY_VALUE res_addr, MAY_BE_ANY, const_addr, MAY_BE_ANY, ZREG_R0, ZREG_R1 + if (MAY_BE_ANY & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE))) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_LONG) { + if (Z_MODE(const_addr) == IS_REG) { + if (Z_MODE(res_addr) != IS_REG || Z_REG(res_addr) != Z_REG(const_addr)) { + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (Z_REG(const_addr)), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (Z_REG(const_addr)), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(const_addr)) == 0) { + dasm_put(Dst, 1760, (Z_REG(res_addr)), (Z_REG(res_addr))); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(const_addr)))) { + dasm_put(Dst, 1768, (Z_REG(res_addr)), (unsigned int)(Z_LVAL_P(Z_ZV(const_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(const_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (Z_REG(res_addr)), Z_LVAL_P(Z_ZV(const_addr))); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (Z_REG(res_addr)), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else if (Z_MODE(const_addr) == IS_REG) { + if (Z_REG(res_addr) != Z_REG(const_addr)) { + dasm_put(Dst, 1782, (Z_REG(const_addr)), (Z_REG(res_addr))); + } + } else { + ZEND_UNREACHABLE(); + } + } else { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (Z_LVAL_P(Z_ZV(const_addr)) == 0) { + dasm_put(Dst, 1760, (ZREG_R1), (ZREG_R1)); + } else { + if (!IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(const_addr)))) { + dasm_put(Dst, 1768, (ZREG_R1), (unsigned int)(Z_LVAL_P(Z_ZV(const_addr))), (unsigned int)((Z_LVAL_P(Z_ZV(const_addr)))>>32)); + } else { + dasm_put(Dst, 1775, (ZREG_R1), Z_LVAL_P(Z_ZV(const_addr))); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else if (Z_MODE(const_addr) == IS_REG) { + if (ZREG_R1 != Z_REG(const_addr)) { + dasm_put(Dst, 1782, (Z_REG(const_addr)), (ZREG_R1)); + } + } else { + ZEND_UNREACHABLE(); + } + if (Z_MODE(res_addr) == IS_REG) { + dasm_put(Dst, 1782, (ZREG_R1), (Z_REG(res_addr))); + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_GUARD)) == MAY_BE_DOUBLE) { + if (Z_MODE(const_addr) == IS_REG) { + if (Z_MODE(res_addr) == IS_REG) { + if (Z_REG(const_addr) != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (Z_REG(const_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (Z_REG(const_addr)-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } else if (Z_MODE(res_addr) == IS_REG) { + if (Z_MODE(const_addr) != IS_REG || Z_REG(res_addr) != Z_REG(const_addr)) { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(const_addr)); + } else { + dasm_put(Dst, 1988, (Z_REG(res_addr)-ZREG_XMM0), Z_ZV(const_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(const_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(const_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(const_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (Z_REG(res_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (Z_REG(res_addr)-ZREG_XMM0)); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else { + dasm_put(Dst, 2028, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } + } else if (Z_MODE(const_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + } else { + if (Z_MODE(const_addr) != IS_REG || ZREG_XMM0 != Z_REG(const_addr)) { + if (Z_MODE(const_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1978, (ZREG_XMM0-ZREG_XMM0), Z_ZV(const_addr)); + } else { + dasm_put(Dst, 1988, (ZREG_XMM0-ZREG_XMM0), Z_ZV(const_addr)); + } + } else { + if (IS_SIGNED_32BIT(Z_ZV(const_addr))) { + dasm_put(Dst, 56, ((ptrdiff_t)Z_ZV(const_addr))); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)Z_ZV(const_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(const_addr)))>>32)); + } + if (CAN_USE_AVX()) { + dasm_put(Dst, 1999, (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 2007, (ZREG_XMM0-ZREG_XMM0)); + } + } + } else if (Z_MODE(const_addr) == IS_MEM_ZVAL) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 2016, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } else { + dasm_put(Dst, 2028, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + } + } else if (Z_MODE(const_addr) == IS_REG) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (ZREG_XMM0-ZREG_XMM0), (Z_REG(const_addr)-ZREG_XMM0)); + } + } else { + ZEND_UNREACHABLE(); + } + } + if (Z_MODE(res_addr) == IS_REG) { + if (ZREG_XMM0 != Z_REG(res_addr)) { + if (CAN_USE_AVX()) { + dasm_put(Dst, 1933, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } else { + dasm_put(Dst, 1943, (Z_REG(res_addr)-ZREG_XMM0), (ZREG_XMM0-ZREG_XMM0)); + } + } + } else { + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + if (CAN_USE_AVX()) { + dasm_put(Dst, 1952, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + dasm_put(Dst, 1965, (ZREG_XMM0-ZREG_XMM0), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + } + } else if (!(MAY_BE_ANY & (MAY_BE_DOUBLE|MAY_BE_GUARD))) { + ZEND_ASSERT(Z_MODE(const_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } else { + ZEND_ASSERT(Z_MODE(const_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1674, (ZREG_R1), (Z_REG(const_addr)), Z_OFFSET(const_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1923, (ZREG_R1), (Z_REG(res_addr)), Z_OFFSET(res_addr)); + } + } + if ((MAY_BE_ANY & (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)) && + !(MAY_BE_ANY & MAY_BE_GUARD) && + has_concrete_type(MAY_BE_ANY & MAY_BE_ANY)) { + if (Z_MODE(res_addr) == IS_MEM_ZVAL) { + if ((MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) != (MAY_BE_ANY & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD))) { + uint8_t type = concrete_type(MAY_BE_ANY); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), type); + } + } + } else { + ZEND_ASSERT(Z_MODE(const_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2205, (ZREG_R0), (Z_REG(const_addr)), Z_OFFSET(const_addr)+offsetof(zval,u1.type_info)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 2215, (ZREG_R0), (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); + } +#line 15656 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF MAY_BE_ANY, ah, r1 + if (MAY_BE_ANY & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (MAY_BE_ANY & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2199); + } +#line 15657 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + //|.cold_code + dasm_put(Dst, 276); +#line 15660 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //|9: + //| // SAVE_OPLINE(); + //| SET_EX_OPLINE opline, r0 + dasm_put(Dst, 4230); + if (opline == last_valid_opline) { + zend_jit_use_last_valid_opline(); + if (GCC_GLOBAL_REGS) { + dasm_put(Dst, 8, Dt1(->opline)); + } + } else { + if (IS_SIGNED_32BIT(opline)) { + dasm_put(Dst, 313, Dt1(->opline), ((ptrdiff_t)opline)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)opline)), (unsigned int)((((ptrdiff_t)opline))>>32), Dt1(->opline)); + } + if (!GCC_GLOBAL_REGS) { + zend_jit_reset_last_valid_opline(); + } + } +#line 15663 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // zend_quick_get_constant(RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num OPLINE_CC EXECUTE_DATA_CC); + //| LOAD_ADDR FCARG1a, zv + if (IS_SIGNED_32BIT(zv)) { + dasm_put(Dst, 798, ((ptrdiff_t)zv)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)zv)), (unsigned int)((((ptrdiff_t)zv))>>32)); + } +#line 15665 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov FCARG2a, opline->op1.num + //| EXT_CALL zend_jit_get_constant, r0 + dasm_put(Dst, 751, opline->op1.num); + if (MAY_USE_32BIT_ADDR(zend_jit_get_constant)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_get_constant)); + } else { + if (IS_SIGNED_32BIT(zend_jit_get_constant)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_get_constant)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_get_constant)), (unsigned int)((((ptrdiff_t)zend_jit_get_constant))>>32)); + } + dasm_put(Dst, 66); + } +#line 15667 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| // ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + //| test r0, r0 + //| jnz <8 + //| jmp ->exception_handler + //|.code + dasm_put(Dst, 8583); +#line 15672 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static int zend_jit_in_array(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint8_t smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr) +{ + HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2)); + zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); + + ZEND_ASSERT(opline->op1_type != IS_VAR && opline->op1_type != IS_TMP_VAR); + ZEND_ASSERT((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) == MAY_BE_STRING); + + //| // result = zend_hash_find_ex(ht, Z_STR_P(op1), OP1_TYPE == IS_CONST); + //| LOAD_ADDR FCARG1a, ht + if (IS_SIGNED_32BIT(ht)) { + dasm_put(Dst, 798, ((ptrdiff_t)ht)); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)ht)), (unsigned int)((((ptrdiff_t)ht))>>32)); + } +#line 15686 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op1_type != IS_CONST) { + //| GET_ZVAL_PTR FCARG2a, op1_addr + ZEND_ASSERT(Z_MODE(op1_addr) == IS_MEM_ZVAL); +#line 15688 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_find, r0 + dasm_put(Dst, 8207, (Z_REG(op1_addr)), Z_OFFSET(op1_addr)); + if (MAY_USE_32BIT_ADDR(zend_hash_find)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find)), (unsigned int)((((ptrdiff_t)zend_hash_find))>>32)); + } + dasm_put(Dst, 66); + } +#line 15689 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_string *str = Z_STR_P(RT_CONSTANT(opline, opline->op1)); + //| LOAD_ADDR FCARG2a, str + if (IS_SIGNED_32BIT(str)) { + dasm_put(Dst, 751, ((ptrdiff_t)str)); + } else { + dasm_put(Dst, 756, (unsigned int)(((ptrdiff_t)str)), (unsigned int)((((ptrdiff_t)str))>>32)); + } +#line 15692 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| EXT_CALL zend_hash_find_known_hash, r0 + if (MAY_USE_32BIT_ADDR(zend_hash_find_known_hash)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_hash_find_known_hash)); + } else { + if (IS_SIGNED_32BIT(zend_hash_find_known_hash)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_hash_find_known_hash)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_hash_find_known_hash)), (unsigned int)((((ptrdiff_t)zend_hash_find_known_hash))>>32)); + } + dasm_put(Dst, 66); + } +#line 15693 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| test r0, r0 + dasm_put(Dst, 3655); +#line 15695 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (exit_addr) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jz &exit_addr + dasm_put(Dst, 1795, (ptrdiff_t)(exit_addr)); +#line 15698 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| jnz &exit_addr + dasm_put(Dst, 1593, (ptrdiff_t)(exit_addr)); +#line 15700 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } else if (smart_branch_opcode) { + if (smart_branch_opcode == ZEND_JMPZ) { + //| jz =>target_label + dasm_put(Dst, 4700, target_label); +#line 15704 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if (smart_branch_opcode == ZEND_JMPNZ) { + //| jnz =>target_label + dasm_put(Dst, 1908, target_label); +#line 15706 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + ZEND_UNREACHABLE(); + } + } else { + //| setnz al + //| movzx eax, al + //| lea eax, [eax + IS_FALSE] + //| SET_ZVAL_TYPE_INFO res_addr, eax + dasm_put(Dst, 8596, IS_FALSE); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4692, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info)); +#line 15714 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static int zend_jit_rope(dasm_State **Dst, const zend_op *opline, uint32_t op2_info) +{ + uint32_t offset; + + offset = (opline->opcode == ZEND_ROPE_INIT) ? + opline->result.var : + opline->op1.var + opline->extended_value * sizeof(zend_string*); + + if (opline->op2_type == IS_CONST) { + zval *zv = RT_CONSTANT(opline, opline->op2); + zend_string *str; + + ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING); + str = Z_STR_P(zv); + //| ADDR_STORE aword [FP + offset], str, r0 + if (IS_SIGNED_32BIT(str)) { + dasm_put(Dst, 313, offset, ((ptrdiff_t)str)); + } else { + dasm_put(Dst, 319, (unsigned int)(((ptrdiff_t)str)), (unsigned int)((((ptrdiff_t)str))>>32), offset); + } +#line 15734 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + zend_jit_addr op2_addr = OP2_ADDR(); + + ZEND_ASSERT((op2_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_STRING); + + //| GET_ZVAL_PTR r1, op2_addr + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); +#line 15740 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| mov aword [FP + offset], r1 + dasm_put(Dst, 8606, (Z_REG(op2_addr)), Z_OFFSET(op2_addr), offset); +#line 15741 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + if (opline->op2_type == IS_CV) { + //| GET_ZVAL_TYPE_INFO eax, op2_addr + ZEND_ASSERT(Z_MODE(op2_addr) == IS_MEM_ZVAL); +#line 15743 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| TRY_ADDREF op2_info, ah, r1 + dasm_put(Dst, 8618, (Z_REG(op2_addr)), Z_OFFSET(op2_addr)+offsetof(zval,u1.type_info)); + if (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + if (op2_info & (MAY_BE_ANY-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + dasm_put(Dst, 2408); + } + dasm_put(Dst, 2199); + } +#line 15744 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + + if (opline->opcode == ZEND_ROPE_END) { + zend_jit_addr res_addr = RES_ADDR(); + + //| lea FCARG1a, [FP + opline->op1.var] + //| mov FCARG2d, opline->extended_value + //| EXT_CALL zend_jit_rope_end, r0 + dasm_put(Dst, 8626, opline->op1.var, opline->extended_value); + if (MAY_USE_32BIT_ADDR(zend_jit_rope_end)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_rope_end)); + } else { + if (IS_SIGNED_32BIT(zend_jit_rope_end)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_rope_end)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_rope_end)), (unsigned int)((((ptrdiff_t)zend_jit_rope_end))>>32)); + } + dasm_put(Dst, 66); + } +#line 15753 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_PTR res_addr, r0 + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); +#line 15754 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| SET_ZVAL_TYPE_INFO res_addr, IS_STRING_EX + dasm_put(Dst, 2312, (Z_REG(res_addr)), Z_OFFSET(res_addr)); + ZEND_ASSERT(Z_MODE(res_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 1684, (Z_REG(res_addr)), Z_OFFSET(res_addr)+offsetof(zval,u1.type_info), IS_STRING_EX); +#line 15755 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + + return 1; +} + +static bool zend_jit_noref_guard(dasm_State **Dst, const zend_op *opline, zend_jit_addr var_addr) +{ + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_ZVAL_TYPE var_addr, IS_REFERENCE, &exit_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4162, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), IS_REFERENCE, (ptrdiff_t)(exit_addr)); +#line 15769 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + return 1; +} + +static bool zend_jit_fetch_reference(dasm_State **Dst, const zend_op *opline, uint8_t var_type, uint32_t *var_info_ptr, zend_jit_addr *var_addr_ptr, bool add_ref_guard, bool add_type_guard) +{ + zend_jit_addr var_addr = *var_addr_ptr; + uint32_t var_info = *var_info_ptr; + const void *exit_addr = NULL; + + if (add_ref_guard || add_type_guard) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + } + + if (add_ref_guard) { + //| IF_NOT_ZVAL_TYPE var_addr, IS_REFERENCE, &exit_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), IS_REFERENCE, (ptrdiff_t)(exit_addr)); +#line 15790 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + if (opline->opcode == ZEND_INIT_METHOD_CALL && opline->op1_type == IS_VAR) { + /* Hack: Convert reference to regular value to simplify JIT code for INIT_METHOD_CALL */ + if (Z_REG(var_addr) != ZREG_FCARG1 || Z_OFFSET(var_addr) != 0) { + //| LOAD_ZVAL_ADDR FCARG1a, var_addr + if (Z_MODE(var_addr) == IS_CONST_ZVAL) { + if (IS_SIGNED_32BIT(Z_ZV(var_addr))) { + dasm_put(Dst, 798, ((ptrdiff_t)Z_ZV(var_addr))); + } else { + dasm_put(Dst, 803, (unsigned int)(((ptrdiff_t)Z_ZV(var_addr))), (unsigned int)((((ptrdiff_t)Z_ZV(var_addr)))>>32)); + } + } else if (Z_MODE(var_addr) == IS_MEM_ZVAL) { + if (Z_OFFSET(var_addr)) { + dasm_put(Dst, 2341, (Z_REG(var_addr)), Z_OFFSET(var_addr)); + } else { + dasm_put(Dst, 2349, (Z_REG(var_addr))); + } + } else { + ZEND_UNREACHABLE(); + } +#line 15795 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + //| EXT_CALL zend_jit_unref_helper, r0 + if (MAY_USE_32BIT_ADDR(zend_jit_unref_helper)) { + dasm_put(Dst, 53, (ptrdiff_t)(zend_jit_unref_helper)); + } else { + if (IS_SIGNED_32BIT(zend_jit_unref_helper)) { + dasm_put(Dst, 56, ((ptrdiff_t)zend_jit_unref_helper)); + } else { + dasm_put(Dst, 61, (unsigned int)(((ptrdiff_t)zend_jit_unref_helper)), (unsigned int)((((ptrdiff_t)zend_jit_unref_helper))>>32)); + } + dasm_put(Dst, 66); + } +#line 15797 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + //| GET_ZVAL_PTR FCARG1a, var_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(var_addr)), Z_OFFSET(var_addr)); +#line 15799 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, offsetof(zend_reference, val)); + *var_addr_ptr = var_addr; + } + + if (var_type != IS_UNKNOWN) { + var_type &= ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED); + } + if (add_type_guard + && var_type != IS_UNKNOWN + && (var_info & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << var_type)) { + //| IF_NOT_ZVAL_TYPE var_addr, var_type, &exit_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 5903, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), var_type, (ptrdiff_t)(exit_addr)); +#line 15810 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + ZEND_ASSERT(var_info & (1 << var_type)); + if (var_type < IS_STRING) { + var_info = (1 << var_type); + } else if (var_type != IS_ARRAY) { + var_info = (1 << var_type) | (var_info & (MAY_BE_RC1|MAY_BE_RCN)); + } else { + var_info = MAY_BE_ARRAY | (var_info & (MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF|MAY_BE_ARRAY_KEY_ANY|MAY_BE_RC1|MAY_BE_RCN)); + } + + *var_info_ptr = var_info; + } else { + var_info &= ~MAY_BE_REF; + *var_info_ptr = var_info; + } + *var_info_ptr |= MAY_BE_GUARD; /* prevent generation of specialized zval dtor */ + + return 1; +} + +static bool zend_jit_fetch_indirect_var(dasm_State **Dst, const zend_op *opline, uint8_t var_type, uint32_t *var_info_ptr, zend_jit_addr *var_addr_ptr, bool add_indirect_guard) +{ + zend_jit_addr var_addr = *var_addr_ptr; + uint32_t var_info = *var_info_ptr; + int32_t exit_point; + const void *exit_addr; + + if (add_indirect_guard) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + //| IF_NOT_ZVAL_TYPE var_addr, IS_INDIRECT, &exit_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); +#line 15845 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + //| GET_ZVAL_PTR FCARG1a, var_addr + dasm_put(Dst, 5903, (Z_REG(var_addr)), Z_OFFSET(var_addr)+offsetof(zval, u1.v.type), IS_INDIRECT, (ptrdiff_t)(exit_addr)); + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(var_addr)), Z_OFFSET(var_addr)); +#line 15846 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else { + /* May be already loaded into FCARG1a or RAX by previous FETCH_OBJ_W/DIM_W */ + if (opline->op1_type != IS_VAR || + (opline-1)->result_type != IS_VAR || + (opline-1)->result.var != opline->op1.var || + (opline-1)->op1_type == IS_VAR || + (opline-1)->op2_type == IS_VAR || + (opline-1)->op2_type == IS_TMP_VAR) { + //| GET_ZVAL_PTR FCARG1a, var_addr + ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL); + dasm_put(Dst, 4245, (Z_REG(var_addr)), Z_OFFSET(var_addr)); +#line 15855 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } else if ((opline-1)->opcode == ZEND_FETCH_DIM_W || (opline-1)->opcode == ZEND_FETCH_DIM_RW) { + //| mov FCARG1a, r0 + dasm_put(Dst, 2248); +#line 15857 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + } + } + *var_info_ptr &= ~MAY_BE_INDIRECT; + var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1, 0); + *var_addr_ptr = var_addr; + + if (var_type != IS_UNKNOWN) { + var_type &= ~(IS_TRACE_INDIRECT|IS_TRACE_PACKED); + } + if (!(var_type & IS_TRACE_REFERENCE) + && var_type != IS_UNKNOWN + && (var_info & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << var_type)) { + exit_point = zend_jit_trace_get_exit_point(opline, 0); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + + //| IF_NOT_Z_TYPE FCARG1a, var_type, &exit_addr + dasm_put(Dst, 8633, offsetof(zval, u1.v.type), var_type, (ptrdiff_t)(exit_addr)); +#line 15877 "/home/jakub/prog/php/83/ext/opcache/jit/zend_jit_x86.dasc" + + //var_info = zend_jit_trace_type_to_info_ex(var_type, var_info); + ZEND_ASSERT(var_info & (1 << var_type)); + if (var_type < IS_STRING) { + var_info = (1 << var_type); + } else if (var_type != IS_ARRAY) { + var_info = (1 << var_type) | (var_info & (MAY_BE_RC1|MAY_BE_RCN)); + } else { + var_info = MAY_BE_ARRAY | (var_info & (MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF|MAY_BE_ARRAY_KEY_ANY|MAY_BE_RC1|MAY_BE_RCN)); + } + + *var_info_ptr = var_info; + } + + return 1; +} + +static bool zend_jit_may_reuse_reg(const zend_op *opline, const zend_ssa_op *ssa_op, zend_ssa *ssa, int def_var, int use_var) +{ + if ((ssa->var_info[def_var].type & ~MAY_BE_GUARD) != (ssa->var_info[use_var].type & ~MAY_BE_GUARD)) { + return 0; + } + + switch (opline->opcode) { + case ZEND_QM_ASSIGN: + case ZEND_SEND_VAR: + case ZEND_ASSIGN: + case ZEND_PRE_INC: + case ZEND_PRE_DEC: + case ZEND_POST_INC: + case ZEND_POST_DEC: + return 1; + case ZEND_ADD: + case ZEND_SUB: + case ZEND_MUL: + case ZEND_BW_OR: + case ZEND_BW_AND: + case ZEND_BW_XOR: + if (def_var == ssa_op->result_def && + use_var == ssa_op->op1_use) { + return 1; + } + break; + default: + break; + } + return 0; +} + +static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op, zend_jit_trace_rec *trace) +{ + uint32_t op1_info, op2_info; + + switch (opline->opcode) { + case ZEND_SEND_VAR: + case ZEND_SEND_VAL: + case ZEND_SEND_VAL_EX: + return (opline->op2_type != IS_CONST); + case ZEND_QM_ASSIGN: + case ZEND_IS_SMALLER: + case ZEND_IS_SMALLER_OR_EQUAL: + case ZEND_IS_EQUAL: + case ZEND_IS_NOT_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_IS_NOT_IDENTICAL: + case ZEND_CASE: + return 1; + case ZEND_RETURN: + return (op_array->type != ZEND_EVAL_CODE && op_array->function_name); + case ZEND_ASSIGN: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + return + opline->op1_type == IS_CV && + !(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_RESOURCE|MAY_BE_OBJECT|MAY_BE_REF)) && + !(op2_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))); + case ZEND_ADD: + case ZEND_SUB: + case ZEND_MUL: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + return !((op1_info | op2_info) & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_DOUBLE))); + case ZEND_BW_OR: + case ZEND_BW_AND: + case ZEND_BW_XOR: + case ZEND_SL: + case ZEND_SR: + case ZEND_MOD: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + return !((op1_info | op2_info) & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - MAY_BE_LONG)); + case ZEND_PRE_INC: + case ZEND_PRE_DEC: + case ZEND_POST_INC: + case ZEND_POST_DEC: + op1_info = OP1_INFO(); + op2_info = OP1_DEF_INFO(); + return opline->op1_type == IS_CV + && !(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - MAY_BE_LONG)) + && (op2_info & MAY_BE_LONG); + case ZEND_STRLEN: + op1_info = OP1_INFO(); + return (opline->op1_type & (IS_CV|IS_CONST)) + && (op1_info & (MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)) == MAY_BE_STRING; + case ZEND_COUNT: + op1_info = OP1_INFO(); + return (opline->op1_type & (IS_CV|IS_CONST)) + && (op1_info & (MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)) == MAY_BE_ARRAY; + case ZEND_JMPZ: + case ZEND_JMPNZ: + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { + if (!ssa->cfg.map) { + return 0; + } + if (opline > op_array->opcodes + ssa->cfg.blocks[ssa->cfg.map[opline-op_array->opcodes]].start && + ((opline-1)->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) { + return 0; + } + } + ZEND_FALLTHROUGH; + case ZEND_BOOL: + case ZEND_BOOL_NOT: + case ZEND_JMPZ_EX: + case ZEND_JMPNZ_EX: + return 1; + case ZEND_FETCH_CONSTANT: + return 1; + case ZEND_FETCH_DIM_R: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (trace + && trace->op1_type != IS_UNKNOWN + && (trace->op1_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED)) == IS_ARRAY) { + op1_info &= ~((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY); + } + return ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY) && + (!(opline->op1_type & (IS_TMP_VAR|IS_VAR)) || !(op1_info & MAY_BE_RC1)) && + (((op2_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_LONG) || + (((op2_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_STRING) && + (!(opline->op2_type & (IS_TMP_VAR|IS_VAR)) || !(op2_info & MAY_BE_RC1)))); + } + return 0; +} + +static bool zend_jit_var_supports_reg(zend_ssa *ssa, int var) +{ + if (ssa->vars[var].no_val) { + /* we don't need the value */ + return 0; + } + + if (!(JIT_G(opt_flags) & ZEND_JIT_REG_ALLOC_GLOBAL)) { + /* Disable global register allocation, + * register allocation for SSA variables connected through Phi functions + */ + if (ssa->vars[var].definition_phi) { + return 0; + } + if (ssa->vars[var].phi_use_chain) { + zend_ssa_phi *phi = ssa->vars[var].phi_use_chain; + do { + if (!ssa->vars[phi->ssa_var].no_val) { + return 0; + } + phi = zend_ssa_next_use_phi(ssa, var, phi); + } while (phi); + } + } + + if (((ssa->var_info[var].type & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_DOUBLE) && + ((ssa->var_info[var].type & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_LONG)) { + /* bad type */ + return 0; + } + + return 1; +} + +static bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa *ssa, int var) +{ + if (!zend_jit_var_supports_reg(ssa, var)) { + return 0; + } + + if (ssa->vars[var].definition >= 0) { + uint32_t def = ssa->vars[var].definition; + if (!zend_jit_opline_supports_reg(op_array, ssa, op_array->opcodes + def, ssa->ops + def, NULL)) { + return 0; + } + } + + if (ssa->vars[var].use_chain >= 0) { + int use = ssa->vars[var].use_chain; + + do { + if (!zend_ssa_is_no_val_use(op_array->opcodes + use, ssa->ops + use, var) && + !zend_jit_opline_supports_reg(op_array, ssa, op_array->opcodes + use, ssa->ops + use, NULL)) { + return 0; + } + use = zend_ssa_next_use(ssa->ops, var, use); + } while (use >= 0); + } + + return 1; +} + +static bool zend_needs_extra_reg_for_const(const zend_op *opline, uint8_t op_type, znode_op op) +{ +//|.if X64 + if (op_type == IS_CONST) { + zval *zv = RT_CONSTANT(opline, op); + if (Z_TYPE_P(zv) == IS_DOUBLE && Z_DVAL_P(zv) != 0 && !IS_SIGNED_32BIT(zv)) { + return 1; + } else if (Z_TYPE_P(zv) == IS_LONG && !IS_SIGNED_32BIT(Z_LVAL_P(zv))) { + return 1; + } + } +//|.endif + return 0; +} + +static zend_regset zend_jit_get_def_scratch_regset(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, int current_var, bool last_use) +{ + uint32_t op1_info, op2_info; + + switch (opline->opcode) { + case ZEND_FETCH_DIM_R: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (((opline->op1_type & (IS_TMP_VAR|IS_VAR)) && + (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) || + ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) && + (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)))) { + return ZEND_REGSET(ZREG_FCARG1); + } + break; + default: + break; + } + + return ZEND_REGSET_EMPTY; +} + +static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, int current_var, bool last_use) +{ + uint32_t op1_info, op2_info, res_info; + zend_regset regset = ZEND_REGSET_SCRATCH; + + switch (opline->opcode) { + case ZEND_NOP: + case ZEND_OP_DATA: + case ZEND_JMP: + case ZEND_RETURN: + regset = ZEND_REGSET_EMPTY; + break; + case ZEND_QM_ASSIGN: + if (ssa_op->op1_def == current_var || + ssa_op->result_def == current_var) { + regset = ZEND_REGSET_EMPTY; + break; + } + /* break missing intentionally */ + case ZEND_SEND_VAL: + case ZEND_SEND_VAL_EX: + if (opline->op2_type == IS_CONST) { + break; + } + if (ssa_op->op1_use == current_var) { + regset = ZEND_REGSET(ZREG_R0); + break; + } + op1_info = OP1_INFO(); + if (!(op1_info & MAY_BE_UNDEF)) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_DOUBLE) { + regset = ZEND_REGSET(ZREG_XMM0); + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_LONG) { + regset = ZEND_REGSET(ZREG_R0); + } else { + regset = ZEND_REGSET_UNION(ZEND_REGSET(ZREG_R0), ZEND_REGSET(ZREG_R2)); + } + } + break; + case ZEND_SEND_VAR: + if (opline->op2_type == IS_CONST) { + break; + } + if (ssa_op->op1_use == current_var || + ssa_op->op1_def == current_var) { + regset = ZEND_REGSET_EMPTY; + break; + } + op1_info = OP1_INFO(); + if (!(op1_info & MAY_BE_UNDEF)) { + if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_DOUBLE) { + regset = ZEND_REGSET(ZREG_XMM0); + } else if ((op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_LONG) { + } else { + regset = ZEND_REGSET_UNION(ZEND_REGSET(ZREG_R0), ZEND_REGSET(ZREG_R2)); + if (op1_info & MAY_BE_REF) { + ZEND_REGSET_INCL(regset, ZREG_R1); + } + } + } + break; + case ZEND_ASSIGN: + if (ssa_op->op2_use == current_var || + ssa_op->op2_def == current_var || + ssa_op->op1_def == current_var || + ssa_op->result_def == current_var) { + regset = ZEND_REGSET_EMPTY; + break; + } + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (opline->op1_type == IS_CV + && !(op2_info & MAY_BE_UNDEF) + && !(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + if ((op2_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_DOUBLE) { + regset = ZEND_REGSET(ZREG_XMM0); + } else if ((op2_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_LONG) { + regset = ZEND_REGSET(ZREG_R0); + } else { + regset = ZEND_REGSET_UNION(ZEND_REGSET(ZREG_R0), ZEND_REGSET(ZREG_R2)); + } + } + break; + case ZEND_PRE_INC: + case ZEND_PRE_DEC: + case ZEND_POST_INC: + case ZEND_POST_DEC: + if (ssa_op->op1_use == current_var || + ssa_op->op1_def == current_var || + ssa_op->result_def == current_var) { + regset = ZEND_REGSET_EMPTY; + break; + } + op1_info = OP1_INFO(); + if (opline->op1_type == IS_CV + && (op1_info & MAY_BE_LONG) + && !(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE)))) { + regset = ZEND_REGSET_EMPTY; + if (op1_info & MAY_BE_DOUBLE) { + regset = ZEND_REGSET(ZREG_XMM0); + } + if (opline->result_type != IS_UNUSED && (op1_info & MAY_BE_LONG)) { + ZEND_REGSET_INCL(regset, ZREG_R1); + } + } + break; + case ZEND_ADD: + case ZEND_SUB: + case ZEND_MUL: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (!(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) && + !(op2_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE)))) { + + regset = ZEND_REGSET_EMPTY; + if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG)) { + if (ssa_op->result_def != current_var && + (ssa_op->op1_use != current_var || !last_use)) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + res_info = RES_INFO(); + if (res_info & MAY_BE_DOUBLE) { + ZEND_REGSET_INCL(regset, ZREG_R0); + ZEND_REGSET_INCL(regset, ZREG_XMM0); + ZEND_REGSET_INCL(regset, ZREG_XMM1); + } else if (res_info & MAY_BE_GUARD) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + } + if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_DOUBLE)) { + if (opline->op1_type == IS_CONST) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + if (ssa_op->result_def != current_var) { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + } + } + if ((op1_info & MAY_BE_DOUBLE) && (op2_info & MAY_BE_LONG)) { + if (opline->op2_type == IS_CONST) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + if (zend_is_commutative(opline->opcode)) { + if (ssa_op->result_def != current_var) { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + } + } else { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + if (ssa_op->result_def != current_var && + (ssa_op->op1_use != current_var || !last_use)) { + ZEND_REGSET_INCL(regset, ZREG_XMM1); + } + } + } + if ((op1_info & MAY_BE_DOUBLE) && (op2_info & MAY_BE_DOUBLE)) { + if (ssa_op->result_def != current_var && + (ssa_op->op1_use != current_var || !last_use) && + (!zend_is_commutative(opline->opcode) || ssa_op->op2_use != current_var || !last_use)) { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + } + } + if (zend_needs_extra_reg_for_const(opline, opline->op1_type, opline->op1) || + zend_needs_extra_reg_for_const(opline, opline->op2_type, opline->op2)) { + if (!ZEND_REGSET_IN(regset, ZREG_R0)) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } else { + ZEND_REGSET_INCL(regset, ZREG_R1); + } + } + } + break; + case ZEND_BW_OR: + case ZEND_BW_AND: + case ZEND_BW_XOR: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (!(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-MAY_BE_LONG)) && + !(op2_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-MAY_BE_LONG))) { + regset = ZEND_REGSET_EMPTY; + if (ssa_op->result_def != current_var && + (ssa_op->op1_use != current_var || !last_use)) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + if (zend_needs_extra_reg_for_const(opline, opline->op1_type, opline->op1) || + zend_needs_extra_reg_for_const(opline, opline->op2_type, opline->op2)) { + if (!ZEND_REGSET_IN(regset, ZREG_R0)) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } else { + ZEND_REGSET_INCL(regset, ZREG_R1); + } + } + } + break; + case ZEND_SL: + case ZEND_SR: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (!(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-MAY_BE_LONG)) && + !(op2_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-MAY_BE_LONG))) { +bw_op: + regset = ZEND_REGSET_EMPTY; + if (ssa_op->result_def != current_var && + (ssa_op->op1_use != current_var || !last_use)) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + if (opline->op2_type != IS_CONST && ssa_op->op2_use != current_var) { + ZEND_REGSET_INCL(regset, ZREG_R1); + } + } + break; + case ZEND_MOD: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (!(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-MAY_BE_LONG)) && + !(op2_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-MAY_BE_LONG))) { + if (opline->op2_type == IS_CONST && + opline->op1_type != IS_CONST && + Z_TYPE_P(RT_CONSTANT(opline, opline->op2)) == IS_LONG && + zend_long_is_power_of_two(Z_LVAL_P(RT_CONSTANT(opline, opline->op2))) && + OP1_HAS_RANGE() && + OP1_MIN_RANGE() >= 0) { + /* MOD is going to be optimized into AND */ + goto bw_op; + } else { + regset = ZEND_REGSET_EMPTY; + ZEND_REGSET_INCL(regset, ZREG_R0); + ZEND_REGSET_INCL(regset, ZREG_R2); + if (opline->op2_type == IS_CONST) { + ZEND_REGSET_INCL(regset, ZREG_R1); + } + } + } + break; + case ZEND_IS_SMALLER: + case ZEND_IS_SMALLER_OR_EQUAL: + case ZEND_IS_EQUAL: + case ZEND_IS_NOT_EQUAL: + case ZEND_IS_IDENTICAL: + case ZEND_IS_NOT_IDENTICAL: + case ZEND_CASE: + op1_info = OP1_INFO(); + op2_info = OP2_INFO(); + if (!(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) && + !(op2_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE)))) { + regset = ZEND_REGSET_EMPTY; + if (!(opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ))) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG) && + opline->op1_type != IS_CONST && opline->op2_type != IS_CONST) { + if (ssa_op->op1_use != current_var && + ssa_op->op2_use != current_var) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + } + if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_DOUBLE)) { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + } + if ((op1_info & MAY_BE_DOUBLE) && (op2_info & MAY_BE_LONG)) { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + } + if ((op1_info & MAY_BE_DOUBLE) && (op2_info & MAY_BE_DOUBLE)) { + if (ssa_op->op1_use != current_var && + ssa_op->op2_use != current_var) { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + } + } + if (zend_needs_extra_reg_for_const(opline, opline->op1_type, opline->op1) || + zend_needs_extra_reg_for_const(opline, opline->op2_type, opline->op2)) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + } + break; + case ZEND_BOOL: + case ZEND_BOOL_NOT: + case ZEND_JMPZ: + case ZEND_JMPNZ: + case ZEND_JMPZ_EX: + case ZEND_JMPNZ_EX: + op1_info = OP1_INFO(); + if (!(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { + regset = ZEND_REGSET_EMPTY; + if (op1_info & MAY_BE_DOUBLE) { + ZEND_REGSET_INCL(regset, ZREG_XMM0); + } + if (opline->opcode == ZEND_BOOL || + opline->opcode == ZEND_BOOL_NOT || + opline->opcode == ZEND_JMPZ_EX || + opline->opcode == ZEND_JMPNZ_EX) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } + } + break; + case ZEND_DO_UCALL: + case ZEND_DO_FCALL: + case ZEND_DO_FCALL_BY_NAME: + case ZEND_INCLUDE_OR_EVAL: + case ZEND_GENERATOR_CREATE: + case ZEND_YIELD: + case ZEND_YIELD_FROM: + regset = ZEND_REGSET_UNION(ZEND_REGSET_GP, ZEND_REGSET_FP); + break; + default: + break; + } + + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + if (ssa_op == ssa->ops + && JIT_G(current_trace)[ZEND_JIT_TRACE_START_REC_SIZE].op == ZEND_JIT_TRACE_INIT_CALL + && (JIT_G(current_trace)[ZEND_JIT_TRACE_START_REC_SIZE].info & ZEND_JIT_TRACE_FAKE_INIT_CALL)) { + ZEND_REGSET_INCL(regset, ZREG_R0); + ZEND_REGSET_INCL(regset, ZREG_R1); + } + } + + /* %r0 is used to check EG(vm_interrupt) */ + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + if (ssa_op == ssa->ops + && (JIT_G(current_trace)->stop == ZEND_JIT_TRACE_STOP_LOOP || + JIT_G(current_trace)->stop == ZEND_JIT_TRACE_STOP_RECURSIVE_CALL)) { +#if ZTS + ZEND_REGSET_INCL(regset, ZREG_R0); +#else + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(vm_interrupt)))) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } +#endif + } + } else { + uint32_t b = ssa->cfg.map[ssa_op - ssa->ops]; + + if ((ssa->cfg.blocks[b].flags & ZEND_BB_LOOP_HEADER) != 0 + && ssa->cfg.blocks[b].start == ssa_op - ssa->ops) { +#if ZTS + ZEND_REGSET_INCL(regset, ZREG_R0); +#else + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(vm_interrupt)))) { + ZEND_REGSET_INCL(regset, ZREG_R0); + } +#endif + } + } + + return regset; +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + */ diff --git a/ext/opcache/minilua b/ext/opcache/minilua new file mode 100755 index 00000000000..67520058957 Binary files /dev/null and b/ext/opcache/minilua differ