@@ -985,13 +985,15 @@ boolean eqDbDb(double a, double b) {
985
985
}
986
986
987
987
@ 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 ;
990
991
}
991
992
992
993
@ 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 ;
995
997
}
996
998
997
999
@ Specialization
@@ -1024,17 +1026,9 @@ PNotImplemented eq(Object a, Object b) {
1024
1026
}
1025
1027
1026
1028
// 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
1038
1032
return v - w ;
1039
1033
} else {
1040
1034
return compareUsingBigDecimal (v , PInt .longToBigInteger (w ));
@@ -1074,13 +1068,15 @@ boolean neDbDb(double a, double b) {
1074
1068
}
1075
1069
1076
1070
@ 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 ;
1079
1074
}
1080
1075
1081
1076
@ 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 ;
1084
1080
}
1085
1081
1086
1082
@ Specialization
@@ -1123,13 +1119,15 @@ boolean doDD(double x, double y) {
1123
1119
}
1124
1120
1125
1121
@ 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 ;
1128
1125
}
1129
1126
1130
1127
@ 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 ;
1133
1131
}
1134
1132
1135
1133
@ Specialization
@@ -1193,13 +1191,15 @@ boolean doDD(double x, double y) {
1193
1191
}
1194
1192
1195
1193
@ 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 ;
1198
1197
}
1199
1198
1200
1199
@ 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 ;
1203
1203
}
1204
1204
1205
1205
@ Specialization
@@ -1263,13 +1263,15 @@ boolean doDD(double x, double y) {
1263
1263
}
1264
1264
1265
1265
@ 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 ;
1268
1269
}
1269
1270
1270
1271
@ 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 ;
1273
1275
}
1274
1276
1275
1277
@ Specialization
@@ -1333,13 +1335,15 @@ boolean doDD(double x, double y) {
1333
1335
}
1334
1336
1335
1337
@ 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 ;
1338
1341
}
1339
1342
1340
1343
@ 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 ;
1343
1347
}
1344
1348
1345
1349
@ Specialization
0 commit comments