@@ -3036,38 +3036,62 @@ static int zend_jit_math_long_long(dasm_State **Dst,
3036
3036
}
3037
3037
if (may_overflow) {
3038
3038
| jo >1
3039
- |.cold_code
3040
- |1:
3039
+ }
3040
+
3041
+ | SET_ZVAL_LVAL res_addr, Ra(result_reg)
3042
+ if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
3043
+ if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_LONG) {
3044
+ | SET_ZVAL_TYPE_INFO res_addr, IS_LONG
3045
+ }
3046
+ }
3047
+
3048
+ if (may_overflow) {
3041
3049
zend_reg tmp_reg1 = ZREG_XMM0;
3042
3050
zend_reg tmp_reg2 = ZREG_XMM1;
3043
3051
3044
- | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
3045
- | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
3046
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
3047
- | AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
3048
- } else {
3049
- | SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
3050
- }
3051
- | SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
3052
+ |.cold_code
3053
+ |1:
3054
+
3055
+ do {
3056
+ if ((Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 1) ||
3057
+ (Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1)) {
3058
+ if (opcode == ZEND_ADD) {
3059
+ |.if X64
3060
+ | mov64 rax, 0x43e0000000000000
3061
+ | SET_ZVAL_LVAL res_addr, rax
3062
+ |.else
3063
+ | SET_ZVAL_LVAL res_addr, 0
3064
+ | SET_ZVAL_W2 res_addr, 0x41e00000
3065
+ |.endif
3066
+ break;
3067
+ } else if (opcode == ZEND_SUB) {
3068
+ |.if X64
3069
+ | mov64 rax, 0xc3e0000000000000
3070
+ | SET_ZVAL_LVAL res_addr, rax
3071
+ |.else
3072
+ | SET_ZVAL_LVAL res_addr, 0x00200000
3073
+ | SET_ZVAL_W2 res_addr, 0xc1e00000
3074
+ |.endif
3075
+ break;
3076
+ }
3077
+ }
3078
+
3079
+ | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
3080
+ | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
3081
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
3082
+ | AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
3083
+ } else {
3084
+ | SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
3085
+ }
3086
+ | SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
3087
+ } while (0);
3088
+
3052
3089
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_DOUBLE) {
3053
3090
| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE
3054
3091
}
3055
3092
| jmp >2
3056
3093
|.code
3057
- | SET_ZVAL_LVAL res_addr, Ra(result_reg)
3058
- if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
3059
- if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_LONG) {
3060
- | SET_ZVAL_TYPE_INFO res_addr, IS_LONG
3061
- }
3062
- }
3063
3094
|2:
3064
- } else if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
3065
- | SET_ZVAL_LVAL res_addr, Ra(result_reg)
3066
- if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
3067
- if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_LONG) {
3068
- | SET_ZVAL_TYPE_INFO res_addr, IS_LONG
3069
- }
3070
- }
3071
3095
}
3072
3096
3073
3097
return 1;
0 commit comments