Skip to content

Commit dd2c30a

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: JIT: Fix register clobbering
2 parents 59dd4fd + 2515e78 commit dd2c30a

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5057,9 +5057,6 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
50575057

50585058
if (opcode == ZEND_MOD) {
50595059
result_reg = ZREG_RAX;
5060-
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5061-
| mov aword T1, r0 // save
5062-
}
50635060
} else if (Z_MODE(res_addr) == IS_REG) {
50645061
if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR)
50655062
&& opline->op2_type != IS_CONST) {
@@ -5184,6 +5181,11 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
51845181
| GET_ZVAL_LVAL result_reg, op1_addr
51855182
| LONG_MATH ZEND_BW_AND, result_reg, tmp_addr
51865183
} else {
5184+
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5185+
| mov aword T1, r0 // save
5186+
} else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RCX) {
5187+
| mov aword T1, Ra(ZREG_RCX) // save
5188+
}
51875189
result_reg = ZREG_RDX;
51885190
if (op2_lval == -1) {
51895191
| xor Ra(result_reg), Ra(result_reg)
@@ -5199,6 +5201,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
51995201
}
52005202
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
52015203
| mov r0, aword T1 // restore
5204+
} else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RCX) {
5205+
| mov Ra(ZREG_RCX), aword T1 // restore
52025206
}
52035207
}
52045208
} else {
@@ -5240,6 +5244,9 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
52405244
|.code
52415245
}
52425246

5247+
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_RAX) {
5248+
| mov aword T1, r0 // save
5249+
}
52435250
result_reg = ZREG_RDX;
52445251
| GET_ZVAL_LVAL ZREG_RAX, op1_addr
52455252
|.if X64

ext/opcache/tests/jit/mod_005.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
JIT MOD: 005
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
opcache.protect_memory=1
9+
--FILE--
10+
<?php
11+
class Test{
12+
public $prop = 32;
13+
}
14+
15+
function test2($test) {
16+
$test->prop %= 3;
17+
return $test;
18+
}
19+
20+
var_dump(test2(new Test));
21+
?>
22+
--EXPECT--
23+
object(Test)#1 (1) {
24+
["prop"]=>
25+
int(2)
26+
}

0 commit comments

Comments
 (0)