Skip to content

Commit 66a1d82

Browse files
committed
Improved code for unordered comparison
1 parent 17a43fe commit 66a1d82

File tree

2 files changed

+36
-17
lines changed

2 files changed

+36
-17
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5530,8 +5530,8 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
55305530
case ZEND_IS_EQUAL:
55315531
case ZEND_IS_IDENTICAL:
55325532
case ZEND_CASE:
5533-
| jp => target_label
55345533
| jne => target_label
5534+
| jp => target_label
55355535
break;
55365536
case ZEND_IS_NOT_EQUAL:
55375537
case ZEND_IS_NOT_IDENTICAL:
@@ -5541,20 +5541,18 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
55415541
break;
55425542
case ZEND_IS_SMALLER:
55435543
if (swap) {
5544-
| jp => target_label
55455544
| jbe => target_label
55465545
} else {
5547-
| jp => target_label
55485546
| jae => target_label
5547+
| jp => target_label
55495548
}
55505549
break;
55515550
case ZEND_IS_SMALLER_OR_EQUAL:
55525551
if (swap) {
5553-
| jp => target_label
55545552
| jb => target_label
55555553
} else {
5556-
| jp => target_label
55575554
| ja => target_label
5555+
| jp => target_label
55585556
}
55595557
break;
55605558
default:
@@ -5574,8 +5572,8 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
55745572
break;
55755573
case ZEND_IS_NOT_EQUAL:
55765574
case ZEND_IS_NOT_IDENTICAL:
5577-
| jp => target_label
55785575
| jne => target_label
5576+
| jp => target_label
55795577
break;
55805578
case ZEND_IS_SMALLER:
55815579
if (swap) {
@@ -5608,8 +5606,8 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
56085606
case ZEND_IS_EQUAL:
56095607
case ZEND_IS_IDENTICAL:
56105608
case ZEND_CASE:
5611-
| jp => target_label
56125609
| jne => target_label
5610+
| jp => target_label
56135611
break;
56145612
case ZEND_IS_NOT_EQUAL:
56155613
case ZEND_IS_NOT_IDENTICAL:
@@ -5618,20 +5616,18 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
56185616
break;
56195617
case ZEND_IS_SMALLER:
56205618
if (swap) {
5621-
| jp => target_label
56225619
| jbe => target_label
56235620
} else {
5624-
| jp => target_label
56255621
| jae => target_label
5622+
| jp => target_label
56265623
}
56275624
break;
56285625
case ZEND_IS_SMALLER_OR_EQUAL:
56295626
if (swap) {
5630-
| jp => target_label
56315627
| jb => target_label
56325628
} else {
5633-
| jp => target_label
56345629
| ja => target_label
5630+
| jp => target_label
56355631
}
56365632
break;
56375633
default:
@@ -5649,8 +5645,8 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
56495645
case ZEND_IS_IDENTICAL:
56505646
case ZEND_CASE:
56515647
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
5652-
| jp => target_label
56535648
| jne => target_label
5649+
| jp => target_label
56545650
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
56555651
break;
56565652
case ZEND_IS_NOT_EQUAL:
@@ -5664,26 +5660,24 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
56645660
case ZEND_IS_SMALLER:
56655661
if (swap) {
56665662
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
5667-
| jp => target_label
56685663
| jbe => target_label
56695664
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
56705665
} else {
56715666
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
5672-
| jp => target_label
56735667
| jae => target_label
5668+
| jp => target_label
56745669
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
56755670
}
56765671
break;
56775672
case ZEND_IS_SMALLER_OR_EQUAL:
56785673
if (swap) {
56795674
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
5680-
| jp => target_label
56815675
| jb => target_label
56825676
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
56835677
} else {
56845678
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
5685-
| jp => target_label
56865679
| ja => target_label
5680+
| jp => target_label
56875681
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
56885682
}
56895683
break;
@@ -5709,8 +5703,8 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
57095703
case ZEND_IS_NOT_EQUAL:
57105704
case ZEND_IS_NOT_IDENTICAL:
57115705
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
5712-
| jp => target_label
57135706
| jne => target_label
5707+
| jp => target_label
57145708
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
57155709
break;
57165710
case ZEND_IS_SMALLER:

ext/opcache/tests/jit/cmp_003.phpt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@ var_dump($i < $b || f());
113113
var_dump($i > $b || f());
114114
var_dump($i <= $b || f());
115115
var_dump($i >= $b || f());
116+
$a=NAN;
117+
var_dump($a == $b);
118+
var_dump($a != $b);
119+
var_dump($a < $b);
120+
var_dump($a > $b);
121+
var_dump($a <= $b);
122+
var_dump($a >= $b);
123+
var_dump($a == $b ? 1 : 0);
124+
var_dump($a != $b ? 1 : 0);
125+
var_dump($a < $b ? 1 : 0);
126+
var_dump($a > $b ? 1 : 0);
127+
var_dump($a <= $b ? 1 : 0);
128+
var_dump($a >= $b ? 1 : 0);
116129
?>
117130
--EXPECT--
118131
bool(false)
@@ -167,3 +180,15 @@ bool(true)
167180
!bool(false)
168181
!bool(false)
169182
!bool(false)
183+
bool(false)
184+
bool(true)
185+
bool(false)
186+
bool(false)
187+
bool(false)
188+
bool(false)
189+
int(0)
190+
int(1)
191+
int(0)
192+
int(0)
193+
int(0)
194+
int(0)

0 commit comments

Comments
 (0)