Skip to content

Commit a8b18f6

Browse files
committed
Improved performance of compareDoubleToLong()
1 parent dc0ebb0 commit a8b18f6

File tree

2 files changed

+45
-39
lines changed

2 files changed

+45
-39
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/complex/ComplexBuiltins.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -596,8 +596,9 @@ boolean doComplex(PComplex left, PComplex right) {
596596
}
597597

598598
@Specialization
599-
boolean doComplexInt(PComplex left, long right) {
600-
return left.getImag() == 0 && FloatBuiltins.EqNode.compareDoubleToLong(left.getReal(), right) == 0;
599+
boolean doComplexInt(PComplex left, long right,
600+
@Cached ConditionProfile longFitsToDoubleProfile) {
601+
return left.getImag() == 0 && FloatBuiltins.EqNode.compareDoubleToLong(left.getReal(), right, longFitsToDoubleProfile) == 0;
601602
}
602603

603604
@Specialization
@@ -691,8 +692,9 @@ boolean doComplex(PComplex left, PComplex right) {
691692
}
692693

693694
@Specialization
694-
boolean doComplex(PComplex left, long right) {
695-
return left.getImag() != 0 || FloatBuiltins.EqNode.compareDoubleToLong(left.getReal(), right) != 0;
695+
boolean doComplex(PComplex left, long right,
696+
@Cached ConditionProfile longFitsToDoubleProfile) {
697+
return left.getImag() != 0 || FloatBuiltins.EqNode.compareDoubleToLong(left.getReal(), right, longFitsToDoubleProfile) != 0;
696698
}
697699

698700
@Specialization

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -985,13 +985,15 @@ boolean eqDbDb(double a, double b) {
985985
}
986986

987987
@Specialization
988-
boolean eqDbLn(double a, long b) {
989-
return compareDoubleToLong(a, b) == 0;
988+
boolean eqDbLn(double a, long b,
989+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
990+
return compareDoubleToLong(a, b, longFitsToDoubleProfile) == 0;
990991
}
991992

992993
@Specialization
993-
boolean eqLnDb(long a, double b) {
994-
return compareDoubleToLong(b, a) == 0;
994+
boolean eqLnDb(long a, double b,
995+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
996+
return compareDoubleToLong(b, a, longFitsToDoubleProfile) == 0;
995997
}
996998

997999
@Specialization
@@ -1024,17 +1026,9 @@ PNotImplemented eq(Object a, Object b) {
10241026
}
10251027

10261028
// adapted from CPython's float_richcompare in floatobject.c
1027-
@TruffleBoundary(allowInlining = true)
1028-
public static double compareDoubleToLong(double v, long w) {
1029-
if (!Double.isFinite(v)) {
1030-
return v;
1031-
}
1032-
int vsign = v == 0.0 ? 0 : v < 0.0 ? -1 : 1;
1033-
int wsign = Long.signum(w);
1034-
if (vsign != wsign) {
1035-
return vsign - wsign;
1036-
}
1037-
if (w > -0x1000000000000L && w < 0x1000000000000L) { // w is at most 48 bits
1029+
public static double compareDoubleToLong(double v, long w, ConditionProfile wFitsInDoubleProfile) {
1030+
if (wFitsInDoubleProfile.profile(w > -0x1000000000000L && w < 0x1000000000000L)) {
1031+
// w is at most 48 bits and thus fits into a double without any loss
10381032
return v - w;
10391033
} else {
10401034
return compareUsingBigDecimal(v, PInt.longToBigInteger(w));
@@ -1074,13 +1068,15 @@ boolean neDbDb(double a, double b) {
10741068
}
10751069

10761070
@Specialization
1077-
boolean neDbLn(double a, long b) {
1078-
return EqNode.compareDoubleToLong(a, b) != 0;
1071+
boolean neDbLn(double a, long b,
1072+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1073+
return EqNode.compareDoubleToLong(a, b, longFitsToDoubleProfile) != 0;
10791074
}
10801075

10811076
@Specialization
1082-
boolean neLnDb(long a, double b) {
1083-
return EqNode.compareDoubleToLong(b, a) != 0;
1077+
boolean neLnDb(long a, double b,
1078+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1079+
return EqNode.compareDoubleToLong(b, a, longFitsToDoubleProfile) != 0;
10841080
}
10851081

10861082
@Specialization
@@ -1123,13 +1119,15 @@ boolean doDD(double x, double y) {
11231119
}
11241120

11251121
@Specialization
1126-
boolean doDL(double x, long y) {
1127-
return EqNode.compareDoubleToLong(x, y) < 0;
1122+
boolean doDL(double x, long y,
1123+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1124+
return EqNode.compareDoubleToLong(x, y, longFitsToDoubleProfile) < 0;
11281125
}
11291126

11301127
@Specialization
1131-
boolean doLD(long x, double y) {
1132-
return EqNode.compareDoubleToLong(y, x) > 0;
1128+
boolean doLD(long x, double y,
1129+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1130+
return EqNode.compareDoubleToLong(y, x, longFitsToDoubleProfile) > 0;
11331131
}
11341132

11351133
@Specialization
@@ -1193,13 +1191,15 @@ boolean doDD(double x, double y) {
11931191
}
11941192

11951193
@Specialization
1196-
boolean doDL(double x, long y) {
1197-
return EqNode.compareDoubleToLong(x, y) <= 0;
1194+
boolean doDL(double x, long y,
1195+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1196+
return EqNode.compareDoubleToLong(x, y, longFitsToDoubleProfile) <= 0;
11981197
}
11991198

12001199
@Specialization
1201-
boolean doLD(long x, double y) {
1202-
return EqNode.compareDoubleToLong(y, x) >= 0;
1200+
boolean doLD(long x, double y,
1201+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1202+
return EqNode.compareDoubleToLong(y, x, longFitsToDoubleProfile) >= 0;
12031203
}
12041204

12051205
@Specialization
@@ -1263,13 +1263,15 @@ boolean doDD(double x, double y) {
12631263
}
12641264

12651265
@Specialization
1266-
boolean doDL(double x, long y) {
1267-
return EqNode.compareDoubleToLong(x, y) > 0;
1266+
boolean doDL(double x, long y,
1267+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1268+
return EqNode.compareDoubleToLong(x, y, longFitsToDoubleProfile) > 0;
12681269
}
12691270

12701271
@Specialization
1271-
boolean doLD(long x, double y) {
1272-
return EqNode.compareDoubleToLong(y, x) < 0;
1272+
boolean doLD(long x, double y,
1273+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1274+
return EqNode.compareDoubleToLong(y, x, longFitsToDoubleProfile) < 0;
12731275
}
12741276

12751277
@Specialization
@@ -1333,13 +1335,15 @@ boolean doDD(double x, double y) {
13331335
}
13341336

13351337
@Specialization
1336-
boolean doDL(double x, long y) {
1337-
return EqNode.compareDoubleToLong(x, y) >= 0;
1338+
boolean doDL(double x, long y,
1339+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1340+
return EqNode.compareDoubleToLong(x, y, longFitsToDoubleProfile) >= 0;
13381341
}
13391342

13401343
@Specialization
1341-
boolean doLD(long x, double y) {
1342-
return EqNode.compareDoubleToLong(y, x) <= 0;
1344+
boolean doLD(long x, double y,
1345+
@Shared("longFitsToDouble") @Cached ConditionProfile longFitsToDoubleProfile) {
1346+
return EqNode.compareDoubleToLong(y, x, longFitsToDoubleProfile) <= 0;
13431347
}
13441348

13451349
@Specialization

0 commit comments

Comments
 (0)