Skip to content

Commit cc9d068

Browse files
committed
Support for ASSIGN_OBJ/DIM with result
1 parent b23e90f commit cc9d068

File tree

1 file changed

+126
-33
lines changed

1 file changed

+126
-33
lines changed

ext/opcache/jit/zend_jit_ir.c

Lines changed: 126 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13801,119 +13801,212 @@ static int zend_jit_ffi_write(zend_jit_ctx *jit,
1380113801
ir_ref ptr,
1380213802
uint32_t val_info,
1380313803
zend_jit_addr val_addr,
13804-
zend_ffi_type *val_ffi_type)
13804+
zend_ffi_type *val_ffi_type,
13805+
zend_jit_addr res_addr)
1380513806
{
13807+
ir_ref ref = IR_UNUSED;
13808+
1380613809
switch (ffi_type->kind) {
1380713810
case ZEND_FFI_TYPE_FLOAT:
1380813811
if (val_info == MAY_BE_LONG) {
13809-
ir_STORE(ptr, ir_INT2F(jit_Z_LVAL(jit, val_addr)));
13812+
ref = ir_INT2F(jit_Z_LVAL(jit, val_addr));
1381013813
} else if (val_info == MAY_BE_DOUBLE) {
13811-
ir_STORE(ptr, ir_D2F(jit_Z_DVAL(jit, val_addr)));
13814+
ref = ir_D2F(jit_Z_DVAL(jit, val_addr));
1381213815
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13813-
ir_STORE(ptr, ir_LOAD_F(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13816+
ref = ir_LOAD_F(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1381413817
} else {
1381513818
ZEND_UNREACHABLE();
1381613819
}
13820+
ir_STORE(ptr, ref);
13821+
if (res_addr) {
13822+
ref = ir_F2D(ref);
13823+
jit_set_Z_DVAL(jit, res_addr, ref);
13824+
if (Z_MODE(res_addr) != IS_REG) {
13825+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_DOUBLE);
13826+
}
13827+
}
1381713828
break;
1381813829
case ZEND_FFI_TYPE_DOUBLE:
1381913830
if (val_info == MAY_BE_LONG) {
13820-
ir_STORE(ptr, ir_INT2D(jit_Z_LVAL(jit, val_addr)));
13831+
ref = ir_INT2D(jit_Z_LVAL(jit, val_addr));
1382113832
} else if (val_info == MAY_BE_DOUBLE) {
13822-
ir_STORE(ptr, jit_Z_DVAL(jit, val_addr));
13833+
ref = jit_Z_DVAL(jit, val_addr);
1382313834
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13824-
ir_STORE(ptr, ir_LOAD_D(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13835+
ref = ir_LOAD_D(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1382513836
} else {
1382613837
ZEND_UNREACHABLE();
1382713838
}
13839+
ir_STORE(ptr, ref);
13840+
if (res_addr) {
13841+
jit_set_Z_DVAL(jit, res_addr, ref);
13842+
if (Z_MODE(res_addr) != IS_REG) {
13843+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_DOUBLE);
13844+
}
13845+
}
1382813846
break;
1382913847
case ZEND_FFI_TYPE_BOOL:
1383013848
if (val_info == MAY_BE_FALSE) {
1383113849
ir_STORE(ptr, IR_FALSE);
13850+
if (res_addr) {
13851+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_FALSE);
13852+
}
1383213853
return 1;
1383313854
} else if (val_info == MAY_BE_TRUE) {
1383413855
ir_STORE(ptr, IR_TRUE);
13856+
if (res_addr) {
13857+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_TRUE);
13858+
}
1383513859
return 1;
1383613860
} else if (val_info == (MAY_BE_FALSE|MAY_BE_TRUE)) {
13837-
ir_STORE(ptr, ir_SUB_U8(jit_Z_TYPE(jit, val_addr), ir_CONST_U8(IS_FALSE)));
13861+
if (res_addr) {
13862+
ref = jit_Z_TYPE_INFO(jit, val_addr);
13863+
jit_set_Z_TYPE_INFO_ex(jit, res_addr, ref);
13864+
ref = ir_TRUNC_U8(ref);
13865+
} else {
13866+
ref = jit_Z_TYPE(jit, val_addr);
13867+
}
13868+
ir_STORE(ptr, ir_SUB_U8(ref, ir_CONST_U8(IS_FALSE)));
1383813869
return 1;
1383913870
}
1384013871
ZEND_FALLTHROUGH;
1384113872
case ZEND_FFI_TYPE_UINT8:
1384213873
if (val_info == MAY_BE_LONG) {
13843-
ir_STORE(ptr, ir_TRUNC_U8(jit_Z_LVAL(jit, val_addr)));
13874+
ref = ir_TRUNC_U8(jit_Z_LVAL(jit, val_addr));
1384413875
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13845-
ir_STORE(ptr, ir_LOAD_U8(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13876+
ref = ir_LOAD_U8(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1384613877
} else {
1384713878
ZEND_UNREACHABLE();
1384813879
}
13880+
ir_STORE(ptr, ref);
13881+
if (res_addr) {
13882+
ref = ir_ZEXT_L(ref);
13883+
jit_set_Z_LVAL(jit, res_addr, ref);
13884+
if (Z_MODE(res_addr) != IS_REG) {
13885+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
13886+
}
13887+
}
1384913888
break;
1385013889
case ZEND_FFI_TYPE_SINT8:
1385113890
case ZEND_FFI_TYPE_CHAR:
1385213891
if (val_info == MAY_BE_LONG) {
13853-
ir_STORE(ptr, ir_TRUNC_I8(jit_Z_LVAL(jit, val_addr)));
13892+
ref = ir_TRUNC_I8(jit_Z_LVAL(jit, val_addr));
1385413893
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13855-
ir_STORE(ptr, ir_LOAD_I8(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13894+
ref = ir_LOAD_I8(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1385613895
} else {
1385713896
ZEND_UNREACHABLE();
1385813897
}
13898+
ir_STORE(ptr, ref);
13899+
if (res_addr) {
13900+
ref = ir_SEXT_L(ref);
13901+
jit_set_Z_LVAL(jit, res_addr, ref);
13902+
if (Z_MODE(res_addr) != IS_REG) {
13903+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
13904+
}
13905+
}
1385913906
break;
1386013907
case ZEND_FFI_TYPE_UINT16:
1386113908
if (val_info == MAY_BE_LONG) {
13862-
ir_STORE(ptr, ir_TRUNC_U16(jit_Z_LVAL(jit, val_addr)));
13909+
ref = ir_TRUNC_U16(jit_Z_LVAL(jit, val_addr));
1386313910
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13864-
ir_STORE(ptr, ir_LOAD_U16(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13911+
ref = ir_LOAD_U16(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1386513912
} else {
1386613913
ZEND_UNREACHABLE();
1386713914
}
13915+
ir_STORE(ptr, ref);
13916+
if (res_addr) {
13917+
ref = ir_ZEXT_L(ref);
13918+
jit_set_Z_LVAL(jit, res_addr, ref);
13919+
if (Z_MODE(res_addr) != IS_REG) {
13920+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
13921+
}
13922+
}
1386813923
break;
1386913924
case ZEND_FFI_TYPE_SINT16:
1387013925
if (val_info == MAY_BE_LONG) {
13871-
ir_STORE(ptr, ir_TRUNC_I16(jit_Z_LVAL(jit, val_addr)));
13926+
ref = ir_TRUNC_I16(jit_Z_LVAL(jit, val_addr));
1387213927
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13873-
ir_STORE(ptr, ir_LOAD_I16(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13928+
ref = ir_LOAD_I16(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1387413929
} else {
1387513930
ZEND_UNREACHABLE();
1387613931
}
13932+
ir_STORE(ptr, ref);
13933+
if (res_addr) {
13934+
ref = ir_SEXT_L(ref);
13935+
jit_set_Z_LVAL(jit, res_addr, ref);
13936+
if (Z_MODE(res_addr) != IS_REG) {
13937+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
13938+
}
13939+
}
1387713940
break;
1387813941
#ifdef ZEND_ENABLE_ZVAL_LONG64
1387913942
case ZEND_FFI_TYPE_UINT32:
1388013943
if (val_info == MAY_BE_LONG) {
13881-
ir_STORE(ptr, ir_TRUNC_U32(jit_Z_LVAL(jit, val_addr)));
13944+
ref = ir_TRUNC_U32(jit_Z_LVAL(jit, val_addr));
1388213945
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13883-
ir_STORE(ptr, ir_LOAD_U32(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13946+
ref = ir_LOAD_U32(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1388413947
} else {
1388513948
ZEND_UNREACHABLE();
1388613949
}
13950+
ir_STORE(ptr, ref);
13951+
if (res_addr) {
13952+
ref = ir_ZEXT_L(ref);
13953+
jit_set_Z_LVAL(jit, res_addr, ref);
13954+
if (Z_MODE(res_addr) != IS_REG) {
13955+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
13956+
}
13957+
}
1388713958
break;
1388813959
case ZEND_FFI_TYPE_SINT32:
1388913960
if (val_info == MAY_BE_LONG) {
13890-
ir_STORE(ptr, ir_TRUNC_I32(jit_Z_LVAL(jit, val_addr)));
13961+
ref = ir_TRUNC_I32(jit_Z_LVAL(jit, val_addr));
1389113962
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13892-
ir_STORE(ptr, ir_LOAD_I32(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13963+
ref = ir_LOAD_I32(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1389313964
} else {
1389413965
ZEND_UNREACHABLE();
1389513966
}
13967+
ir_STORE(ptr, ref);
13968+
if (res_addr) {
13969+
ref = ir_SEXT_L(ref);
13970+
jit_set_Z_LVAL(jit, res_addr, ref);
13971+
if (Z_MODE(res_addr) != IS_REG) {
13972+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
13973+
}
13974+
}
1389613975
break;
1389713976
case ZEND_FFI_TYPE_UINT64:
1389813977
case ZEND_FFI_TYPE_SINT64:
1389913978
if (val_info == MAY_BE_LONG) {
13900-
ir_STORE(ptr, jit_Z_LVAL(jit, val_addr));
13979+
ref = jit_Z_LVAL(jit, val_addr);
1390113980
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13902-
ir_STORE(ptr, ir_LOAD_I64(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13981+
ref = ir_LOAD_I64(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1390313982
} else {
1390413983
ZEND_UNREACHABLE();
1390513984
}
13985+
ir_STORE(ptr, ref);
13986+
if (res_addr) {
13987+
jit_set_Z_LVAL(jit, res_addr, ref);
13988+
if (Z_MODE(res_addr) != IS_REG) {
13989+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
13990+
}
13991+
}
1390613992
break;
1390713993
#else
1390813994
case ZEND_FFI_TYPE_UINT32:
1390913995
case ZEND_FFI_TYPE_SINT32:
1391013996
if (val_info == MAY_BE_LONG) {
13911-
ir_STORE(ptr, jit_Z_LVAL(jit, val_addr));
13997+
ref = jit_Z_LVAL(jit, val_addr);
1391213998
} else if (val_ffi_type && val_ffi_type->kind == ffi_type->kind) {
13913-
ir_STORE(ptr, ir_LOAD_I32(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr))));
13999+
ref = ir_LOAD_I32(jit_FFI_CDATA_PTR(jit, jit_Z_PTR(jit, val_addr)));
1391414000
} else {
1391514001
ZEND_UNREACHABLE();
1391614002
}
14003+
ir_STORE(ptr, ref);
14004+
if (res_addr) {
14005+
jit_set_Z_LVAL(jit, res_addr, ref);
14006+
if (Z_MODE(res_addr) != IS_REG) {
14007+
jit_set_Z_TYPE_INFO(jit, res_addr, IS_LONG);
14008+
}
14009+
}
1391714010
break;
1391814011
#endif
1391914012
default:
@@ -13968,12 +14061,12 @@ static int zend_jit_ffi_assign_dim(zend_jit_ctx *jit,
1396814061

1396914062
ir_ref ptr = ir_ADD_A(cdata_ref, ir_MUL_L(jit_Z_LVAL(jit, op2_addr), ir_CONST_LONG(el_type->size)));
1397014063

13971-
if (!zend_jit_ffi_write(jit, el_type, ptr, val_info, val_addr, val_ffi_type)) {
14064+
ZEND_ASSERT(!res_addr || RETURN_VALUE_USED(opline));
14065+
14066+
if (!zend_jit_ffi_write(jit, el_type, ptr, val_info, val_addr, val_ffi_type, res_addr)) {
1397214067
return 0;
1397314068
}
1397414069

13975-
ZEND_ASSERT(!res_addr);
13976-
1397714070
return 1;
1397814071
}
1397914072
#endif
@@ -15479,12 +15572,12 @@ static int zend_jit_ffi_assign_obj(zend_jit_ctx *jit,
1547915572
ir_ref cdata_ref = ir_LOAD_A(ir_ADD_OFFSET(obj_ref, offsetof(zend_ffi_cdata, ptr)));
1548015573
ir_ref ptr = ir_ADD_A(cdata_ref, ir_CONST_LONG(field->offset));
1548115574

15482-
if (!zend_jit_ffi_write(jit, field_type, ptr, val_info, val_addr, val_ffi_type)) {
15575+
ZEND_ASSERT(!res_addr || RETURN_VALUE_USED(opline));
15576+
15577+
if (!zend_jit_ffi_write(jit, field_type, ptr, val_info, val_addr, val_ffi_type, res_addr)) {
1548315578
return 0;
1548415579
}
1548515580

15486-
ZEND_ASSERT(!res_addr);
15487-
1548815581
if (!op1_indirect) {
1548915582
jit_FREE_OP(jit, opline->op1_type, opline->op1, op1_info, opline);
1549015583
}
@@ -15524,13 +15617,13 @@ static int zend_jit_ffi_assign_sym(zend_jit_ctx *jit,
1552415617
}
1552515618
}
1552615619

15620+
ZEND_ASSERT(!res_addr || RETURN_VALUE_USED(opline));
15621+
1552715622
ir_ref ptr = ir_CONST_ADDR(sym->addr);
15528-
if (!zend_jit_ffi_write(jit, sym_type, ptr, val_info, val_addr, val_ffi_type)) {
15623+
if (!zend_jit_ffi_write(jit, sym_type, ptr, val_info, val_addr, val_ffi_type, res_addr)) {
1552915624
return 0;
1553015625
}
1553115626

15532-
ZEND_ASSERT(!res_addr);
15533-
1553415627
if (!op1_indirect) {
1553515628
jit_FREE_OP(jit, opline->op1_type, opline->op1, op1_info, opline);
1553615629
}

0 commit comments

Comments
 (0)