diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index dcb32d92b5e8b..e1bd5bfdbdfea 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -5157,7 +5157,7 @@ static int zend_jit_long_math_helper(dasm_State **Dst, result_reg = ZREG_R0; } else { /* ASSIGN_DIM_OP */ - if (sizeof(void*) == 4 + if (ZREG_FCARG1 == ZREG_RCX && (opcode == ZEND_SL || opcode == ZEND_SR) && Z_MODE(op2_addr) != IS_CONST_ZVAL) { result_reg = ZREG_R2; diff --git a/ext/opcache/tests/jit/gh11917.phpt b/ext/opcache/tests/jit/gh11917.phpt new file mode 100644 index 0000000000000..a66105d7a8f7a --- /dev/null +++ b/ext/opcache/tests/jit/gh11917.phpt @@ -0,0 +1,61 @@ +--TEST-- +GH-11917: primitives seem to be passed via reference instead of by value under some conditions when JIT is enabled on windows +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +--FILE-- +>= $split; + if (!$overflow) { + $remaining -= $split; + $overflow = $split <= $remaining ? 0 : $split - $remaining; + + if (!$remaining) { + $i++; + $remaining = 31; + $overflow = 0; + } + } elseif (++$i != $len) { + $tempmask = (1 << $overflow) - 1; + $digit |= ($val[$i] & $tempmask) << $remaining; + $val[$i] >>= $overflow; + $remaining = 31 - $overflow; + $overflow = $split <= $remaining ? 0 : $split - $remaining; + } + + $vals[] = $digit; + } + + while ($vals[count($vals) - 1] == 0) { + unset($vals[count($vals) - 1]); + } + + return array_reverse($vals); +} +?> +--EXPECT-- +48207660 +48207660 +48207660 +48207660