diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index c0e5ac16306..5dc5b5e7c23 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -502,10 +502,10 @@ public abstract class StackValue { } if (operandType == Type.FLOAT_TYPE || operandType == Type.DOUBLE_TYPE) { if (opToken == JetTokens.GT || opToken == JetTokens.GTEQ) { - v.cmpg(operandType); + v.cmpl(operandType); } else { - v.cmpl(operandType); + v.cmpg(operandType); } } else if (operandType == Type.LONG_TYPE) { diff --git a/compiler/testData/codegen/box/primitiveTypes/comparisonWithNaN.kt b/compiler/testData/codegen/box/primitiveTypes/comparisonWithNaN.kt new file mode 100644 index 00000000000..2b7885fc585 --- /dev/null +++ b/compiler/testData/codegen/box/primitiveTypes/comparisonWithNaN.kt @@ -0,0 +1,57 @@ +// This test checks that our bytecode is consistent with javac bytecode + +fun assert(condition: Boolean): Unit = + if (!condition) throw AssertionError("Fail") + +fun assertFalse(condition: Boolean) = assert(!condition) + +fun box(): String { + var dnan = java.lang.Double.NaN + if (System.nanoTime() < 0) dnan = 3.14 // To avoid possible compile-time const propagation + + assertFalse(0.0 < dnan) + assertFalse(0.0 > dnan) + assertFalse(0.0 <= dnan) + assertFalse(0.0 >= dnan) + assertFalse(0.0 == dnan) + assertFalse(dnan < 0.0) + assertFalse(dnan > 0.0) + assertFalse(dnan <= 0.0) + assertFalse(dnan >= 0.0) + assertFalse(dnan == 0.0) + assertFalse(dnan < dnan) + assertFalse(dnan > dnan) + assertFalse(dnan <= dnan) + assertFalse(dnan >= dnan) + assertFalse(dnan == dnan) + + // Double.compareTo: "NaN is considered by this method to be equal to itself and greater than all other values" + assert(0.0.compareTo(dnan) == -1) + assert(dnan.compareTo(0.0) == 1) + assert(dnan.compareTo(dnan) == 0) + + var fnan = java.lang.Float.NaN + if (System.nanoTime() < 0) fnan = 3.14f + + assertFalse(0.0f < fnan) + assertFalse(0.0f > fnan) + assertFalse(0.0f <= fnan) + assertFalse(0.0f >= fnan) + assertFalse(0.0f == fnan) + assertFalse(fnan < 0.0f) + assertFalse(fnan > 0.0f) + assertFalse(fnan <= 0.0f) + assertFalse(fnan >= 0.0f) + assertFalse(fnan == 0.0f) + assertFalse(fnan < fnan) + assertFalse(fnan > fnan) + assertFalse(fnan <= fnan) + assertFalse(fnan >= fnan) + assertFalse(fnan == fnan) + + assert(0.0.compareTo(fnan) == -1) + assert(fnan.compareTo(0.0) == 1) + assert(fnan.compareTo(fnan) == 0) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 007c4f65cf2..68b9b5951c3 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -4142,6 +4142,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/box/primitiveTypes"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("comparisonWithNaN.kt") + public void testComparisonWithNaN() throws Exception { + doTest("compiler/testData/codegen/box/primitiveTypes/comparisonWithNaN.kt"); + } + @TestMetadata("comparisonWithNullCallsFun.kt") public void testComparisonWithNullCallsFun() throws Exception { doTest("compiler/testData/codegen/box/primitiveTypes/comparisonWithNullCallsFun.kt");