diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc
index 1be6e00..b261460 100644
--- a/compiler/optimizing/builder.cc
+++ b/compiler/optimizing/builder.cc
@@ -313,15 +313,6 @@
   UpdateLocal(instruction.VRegA(), current_block_->GetLastInstruction());
 }
 
-void HGraphBuilder::Binop_23x_cmp(const Instruction& instruction,
-                                  Primitive::Type type,
-                                  HCompare::Bias bias) {
-  HInstruction* first = LoadLocal(instruction.VRegB(), type);
-  HInstruction* second = LoadLocal(instruction.VRegC(), type);
-  current_block_->AddInstruction(new (arena_) HCompare(type, first, second, bias));
-  UpdateLocal(instruction.VRegA(), current_block_->GetLastInstruction());
-}
-
 template<typename T>
 void HGraphBuilder::Binop_12x(const Instruction& instruction, Primitive::Type type) {
   HInstruction* first = LoadLocal(instruction.VRegA(), type);
@@ -1501,27 +1492,7 @@
       break;
 
     case Instruction::CMP_LONG: {
-      Binop_23x_cmp(instruction, Primitive::kPrimLong, HCompare::kNoBias);
-      break;
-    }
-
-    case Instruction::CMPG_FLOAT: {
-      Binop_23x_cmp(instruction, Primitive::kPrimFloat, HCompare::kGtBias);
-      break;
-    }
-
-    case Instruction::CMPG_DOUBLE: {
-      Binop_23x_cmp(instruction, Primitive::kPrimDouble, HCompare::kGtBias);
-      break;
-    }
-
-    case Instruction::CMPL_FLOAT: {
-      Binop_23x_cmp(instruction, Primitive::kPrimFloat, HCompare::kLtBias);
-      break;
-    }
-
-    case Instruction::CMPL_DOUBLE: {
-      Binop_23x_cmp(instruction, Primitive::kPrimDouble, HCompare::kLtBias);
+      Binop_23x<HCompare>(instruction, Primitive::kPrimLong);
       break;
     }
 
diff --git a/compiler/optimizing/builder.h b/compiler/optimizing/builder.h
index 25781b0..204005d 100644
--- a/compiler/optimizing/builder.h
+++ b/compiler/optimizing/builder.h
@@ -107,8 +107,6 @@
   template<typename T>
   void Binop_23x_shift(const Instruction& instruction, Primitive::Type type);
 
-  void Binop_23x_cmp(const Instruction& instruction, Primitive::Type type, HCompare::Bias bias);
-
   template<typename T>
   void Binop_12x(const Instruction& instruction, Primitive::Type type);
 
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc
index 641e115..a204e21 100644
--- a/compiler/optimizing/code_generator_arm.cc
+++ b/compiler/optimizing/code_generator_arm.cc
@@ -2292,71 +2292,44 @@
 void LocationsBuilderARM::VisitCompare(HCompare* compare) {
   LocationSummary* locations =
       new (GetGraph()->GetArena()) LocationSummary(compare, LocationSummary::kNoCall);
-  switch (compare->InputAt(0)->GetType()) {
-    case Primitive::kPrimLong: {
-      locations->SetInAt(0, Location::RequiresRegister());
-      locations->SetInAt(1, Location::RequiresRegister());
-      locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap);
-      break;
-    }
-    case Primitive::kPrimFloat:
-    case Primitive::kPrimDouble: {
-      locations->SetInAt(0, Location::RequiresFpuRegister());
-      locations->SetInAt(1, Location::RequiresFpuRegister());
-      locations->SetOut(Location::RequiresRegister());
-      break;
-    }
-    default:
-      LOG(FATAL) << "Unexpected type for compare operation " << compare->InputAt(0)->GetType();
-  }
+  locations->SetInAt(0, Location::RequiresRegister());
+  locations->SetInAt(1, Location::RequiresRegister());
+  locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap);
 }
 
 void InstructionCodeGeneratorARM::VisitCompare(HCompare* compare) {
   LocationSummary* locations = compare->GetLocations();
-  Register out = locations->Out().As<Register>();
-  Location left = locations->InAt(0);
-  Location right = locations->InAt(1);
-
-  Label less, greater, done;
   switch (compare->InputAt(0)->GetType()) {
     case Primitive::kPrimLong: {
+      Register output = locations->Out().As<Register>();
+      Location left = locations->InAt(0);
+      Location right = locations->InAt(1);
+      Label less, greater, done;
       __ cmp(left.AsRegisterPairHigh<Register>(),
              ShifterOperand(right.AsRegisterPairHigh<Register>()));  // Signed compare.
       __ b(&less, LT);
       __ b(&greater, GT);
-      // Do LoadImmediate before any `cmp`, as LoadImmediate might affect the status flags.
-      __ LoadImmediate(out, 0);
+      // Do LoadImmediate before any `cmp`, as LoadImmediate might affect
+      // the status flags.
+      __ LoadImmediate(output, 0);
       __ cmp(left.AsRegisterPairLow<Register>(),
              ShifterOperand(right.AsRegisterPairLow<Register>()));  // Unsigned compare.
-      break;
-    }
-    case Primitive::kPrimFloat: {
-      __ LoadImmediate(out, 0);
-      __ vcmps(left.As<SRegister>(), right.As<SRegister>());
-      __ b(compare->IsGtBias() ? &greater : &less, VS);  // VS for unordered
-      break;
-    }
-    case Primitive::kPrimDouble: {
-      __ LoadImmediate(out, 0);
-      __ vcmpd(FromLowSToD(left.AsFpuRegisterPairLow<SRegister>()),
-               FromLowSToD(right.AsFpuRegisterPairLow<SRegister>()));
-      __ b(compare->IsGtBias() ? &greater : &less, VS);
+      __ b(&done, EQ);
+      __ b(&less, CC);
+
+      __ Bind(&greater);
+      __ LoadImmediate(output, 1);
+      __ b(&done);
+
+      __ Bind(&less);
+      __ LoadImmediate(output, -1);
+
+      __ Bind(&done);
       break;
     }
     default:
-      LOG(FATAL) << "Unexpected compare type " << compare->InputAt(0)->GetType();
+      LOG(FATAL) << "Unimplemented compare type " << compare->InputAt(0)->GetType();
   }
-  __ b(&done, EQ);
-  __ b(&less, CC);  // CC is for both: unsigned compare for longs and 'less than' for floats.
-
-  __ Bind(&greater);
-  __ LoadImmediate(out, 1);
-  __ b(&done);
-
-  __ Bind(&less);
-  __ LoadImmediate(out, -1);
-
-  __ Bind(&done);
 }
 
 void LocationsBuilderARM::VisitPhi(HPhi* instruction) {
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index d2c3eec..917b7dd 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -2355,36 +2355,20 @@
 void LocationsBuilderX86::VisitCompare(HCompare* compare) {
   LocationSummary* locations =
       new (GetGraph()->GetArena()) LocationSummary(compare, LocationSummary::kNoCall);
-  switch (compare->InputAt(0)->GetType()) {
-    case Primitive::kPrimLong: {
-      locations->SetInAt(0, Location::RequiresRegister());
-      // TODO: we set any here but we don't handle constants
-      locations->SetInAt(1, Location::Any());
-      locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap);
-      break;
-    }
-    case Primitive::kPrimFloat:
-    case Primitive::kPrimDouble: {
-      locations->SetInAt(0, Location::RequiresFpuRegister());
-      locations->SetInAt(1, Location::RequiresFpuRegister());
-      locations->SetOut(Location::RequiresRegister());
-      break;
-    }
-    default:
-      LOG(FATAL) << "Unexpected type for compare operation " << compare->InputAt(0)->GetType();
-  }
+  locations->SetInAt(0, Location::RequiresRegister());
+  locations->SetInAt(1, Location::Any());
+  locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap);
 }
 
 void InstructionCodeGeneratorX86::VisitCompare(HCompare* compare) {
   LocationSummary* locations = compare->GetLocations();
-  Register out = locations->Out().As<Register>();
-  Location left = locations->InAt(0);
-  Location right = locations->InAt(1);
-
-  Label less, greater, done;
   switch (compare->InputAt(0)->GetType()) {
     case Primitive::kPrimLong: {
-      if (right.IsRegisterPair()) {
+      Label less, greater, done;
+      Register output = locations->Out().As<Register>();
+      Location left = locations->InAt(0);
+      Location right = locations->InAt(1);
+      if (right.IsRegister()) {
         __ cmpl(left.AsRegisterPairHigh<Register>(), right.AsRegisterPairHigh<Register>());
       } else {
         DCHECK(right.IsDoubleStackSlot());
@@ -2399,33 +2383,23 @@
         DCHECK(right.IsDoubleStackSlot());
         __ cmpl(left.AsRegisterPairLow<Register>(), Address(ESP, right.GetStackIndex()));
       }
-      break;
-    }
-    case Primitive::kPrimFloat: {
-      __ ucomiss(left.As<XmmRegister>(), right.As<XmmRegister>());
-      __ j(kUnordered, compare->IsGtBias() ? &greater : &less);
-      break;
-    }
-    case Primitive::kPrimDouble: {
-      __ ucomisd(left.As<XmmRegister>(), right.As<XmmRegister>());
-      __ j(kUnordered, compare->IsGtBias() ? &greater : &less);
+      __ movl(output, Immediate(0));
+      __ j(kEqual, &done);
+      __ j(kBelow, &less);  // Unsigned compare.
+
+      __ Bind(&greater);
+      __ movl(output, Immediate(1));
+      __ jmp(&done);
+
+      __ Bind(&less);
+      __ movl(output, Immediate(-1));
+
+      __ Bind(&done);
       break;
     }
     default:
-      LOG(FATAL) << "Unexpected type for compare operation " << compare->InputAt(0)->GetType();
+      LOG(FATAL) << "Unimplemented compare type " << compare->InputAt(0)->GetType();
   }
-  __ movl(out, Immediate(0));
-  __ j(kEqual, &done);
-  __ j(kBelow, &less);  // kBelow is for CF (unsigned & floats).
-
-  __ Bind(&greater);
-  __ movl(out, Immediate(1));
-  __ jmp(&done);
-
-  __ Bind(&less);
-  __ movl(out, Immediate(-1));
-
-  __ Bind(&done);
 }
 
 void LocationsBuilderX86::VisitPhi(HPhi* instruction) {
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index 0eb4614..83d04b1 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -899,61 +899,33 @@
 void LocationsBuilderX86_64::VisitCompare(HCompare* compare) {
   LocationSummary* locations =
       new (GetGraph()->GetArena()) LocationSummary(compare, LocationSummary::kNoCall);
-  switch (compare->InputAt(0)->GetType()) {
-    case Primitive::kPrimLong: {
-      locations->SetInAt(0, Location::RequiresRegister());
-      locations->SetInAt(1, Location::RequiresRegister());
-      locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap);
-      break;
-    }
-    case Primitive::kPrimFloat:
-    case Primitive::kPrimDouble: {
-      locations->SetInAt(0, Location::RequiresFpuRegister());
-      locations->SetInAt(1, Location::RequiresFpuRegister());
-      locations->SetOut(Location::RequiresRegister());
-      break;
-    }
-    default:
-      LOG(FATAL) << "Unexpected type for compare operation " << compare->InputAt(0)->GetType();
-  }
+  locations->SetInAt(0, Location::RequiresRegister());
+  locations->SetInAt(1, Location::RequiresRegister());
+  locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap);
 }
 
 void InstructionCodeGeneratorX86_64::VisitCompare(HCompare* compare) {
+  Label greater, done;
   LocationSummary* locations = compare->GetLocations();
-  CpuRegister out = locations->Out().As<CpuRegister>();
-  Location left = locations->InAt(0);
-  Location right = locations->InAt(1);
-
-  Label less, greater, done;
-  Primitive::Type type = compare->InputAt(0)->GetType();
-  switch (type) {
-    case Primitive::kPrimLong: {
-      __ cmpq(left.As<CpuRegister>(), right.As<CpuRegister>());
+  switch (compare->InputAt(0)->GetType()) {
+    case Primitive::kPrimLong:
+      __ cmpq(locations->InAt(0).As<CpuRegister>(),
+              locations->InAt(1).As<CpuRegister>());
       break;
-    }
-    case Primitive::kPrimFloat: {
-      __ ucomiss(left.As<XmmRegister>(), right.As<XmmRegister>());
-      __ j(kUnordered, compare->IsGtBias() ? &greater : &less);
-      break;
-    }
-    case Primitive::kPrimDouble: {
-      __ ucomisd(left.As<XmmRegister>(), right.As<XmmRegister>());
-      __ j(kUnordered, compare->IsGtBias() ? &greater : &less);
-      break;
-    }
     default:
-      LOG(FATAL) << "Unexpected compare type " << type;
+      LOG(FATAL) << "Unimplemented compare type " << compare->InputAt(0)->GetType();
   }
-  __ movl(out, Immediate(0));
-  __ j(kEqual, &done);
-  __ j(type == Primitive::kPrimLong ? kLess : kBelow, &less);  //  ucomis{s,d} sets CF (kBelow)
 
-  __ Bind(&greater);
-  __ movl(out, Immediate(1));
+  CpuRegister output = locations->Out().As<CpuRegister>();
+  __ movl(output, Immediate(0));
+  __ j(kEqual, &done);
+  __ j(kGreater, &greater);
+
+  __ movl(output, Immediate(-1));
   __ jmp(&done);
 
-  __ Bind(&less);
-  __ movl(out, Immediate(-1));
+  __ Bind(&greater);
+  __ movl(output, Immediate(1));
 
   __ Bind(&done);
 }
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 87e98af..f562113 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -1363,41 +1363,28 @@
 // Result is 0 if input0 == input1, 1 if input0 > input1, or -1 if input0 < input1.
 class HCompare : public HBinaryOperation {
  public:
-  // The bias applies for floating point operations and indicates how NaN
-  // comparisons are treated:
-  enum Bias {
-    kNoBias,  // bias is not applicable (i.e. for long operation)
-    kGtBias,  // return 1 for NaN comparisons
-    kLtBias,  // return -1 for NaN comparisons
-  };
-
-  HCompare(Primitive::Type type, HInstruction* first, HInstruction* second, Bias bias)
-      : HBinaryOperation(Primitive::kPrimInt, first, second), bias_(bias) {
+  HCompare(Primitive::Type type, HInstruction* first, HInstruction* second)
+      : HBinaryOperation(Primitive::kPrimInt, first, second) {
     DCHECK_EQ(type, first->GetType());
     DCHECK_EQ(type, second->GetType());
   }
 
-  int32_t Evaluate(int32_t x, int32_t y) const OVERRIDE {
+  virtual int32_t Evaluate(int32_t x, int32_t y) const OVERRIDE {
     return
       x == y ? 0 :
       x > y ? 1 :
       -1;
   }
-
-  int64_t Evaluate(int64_t x, int64_t y) const OVERRIDE {
+  virtual int64_t Evaluate(int64_t x, int64_t y) const OVERRIDE {
     return
       x == y ? 0 :
       x > y ? 1 :
       -1;
   }
 
-  bool IsGtBias() { return bias_ == kGtBias; }
-
   DECLARE_INSTRUCTION(Compare);
 
  private:
-  Bias bias_;
-
   DISALLOW_COPY_AND_ASSIGN(HCompare);
 };
 
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc
index b118f9a..a297ea3 100644
--- a/compiler/utils/x86/assembler_x86.cc
+++ b/compiler/utils/x86/assembler_x86.cc
@@ -613,23 +613,6 @@
 }
 
 
-void X86Assembler::ucomiss(XmmRegister a, XmmRegister b) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x0F);
-  EmitUint8(0x2E);
-  EmitXmmRegisterOperand(a, b);
-}
-
-
-void X86Assembler::ucomisd(XmmRegister a, XmmRegister b) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitUint8(0x0F);
-  EmitUint8(0x2E);
-  EmitXmmRegisterOperand(a, b);
-}
-
-
 void X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h
index a630ccd..6ea66a5 100644
--- a/compiler/utils/x86/assembler_x86.h
+++ b/compiler/utils/x86/assembler_x86.h
@@ -301,8 +301,6 @@
 
   void comiss(XmmRegister a, XmmRegister b);
   void comisd(XmmRegister a, XmmRegister b);
-  void ucomiss(XmmRegister a, XmmRegister b);
-  void ucomisd(XmmRegister a, XmmRegister b);
 
   void sqrtsd(XmmRegister dst, XmmRegister src);
   void sqrtss(XmmRegister dst, XmmRegister src);
diff --git a/compiler/utils/x86/constants_x86.h b/compiler/utils/x86/constants_x86.h
index 2dfb65c..45c3834 100644
--- a/compiler/utils/x86/constants_x86.h
+++ b/compiler/utils/x86/constants_x86.h
@@ -96,8 +96,7 @@
   kZero         = kEqual,
   kNotZero      = kNotEqual,
   kNegative     = kSign,
-  kPositive     = kNotSign,
-  kUnordered    = kParityEven
+  kPositive     = kNotSign
 };
 
 
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc
index 2b7ec0f..dff3849 100644
--- a/compiler/utils/x86_64/assembler_x86_64.cc
+++ b/compiler/utils/x86_64/assembler_x86_64.cc
@@ -700,24 +700,6 @@
   EmitXmmRegisterOperand(a.LowBits(), b);
 }
 
-void X86_64Assembler::ucomiss(XmmRegister a, XmmRegister b) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOptionalRex32(a, b);
-  EmitUint8(0x0F);
-  EmitUint8(0x2E);
-  EmitXmmRegisterOperand(a.LowBits(), b);
-}
-
-
-void X86_64Assembler::ucomisd(XmmRegister a, XmmRegister b) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitOptionalRex32(a, b);
-  EmitUint8(0x0F);
-  EmitUint8(0x2E);
-  EmitXmmRegisterOperand(a.LowBits(), b);
-}
-
 
 void X86_64Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h
index 929ed31..ab1bc9e 100644
--- a/compiler/utils/x86_64/assembler_x86_64.h
+++ b/compiler/utils/x86_64/assembler_x86_64.h
@@ -344,8 +344,6 @@
 
   void comiss(XmmRegister a, XmmRegister b);
   void comisd(XmmRegister a, XmmRegister b);
-  void ucomiss(XmmRegister a, XmmRegister b);
-  void ucomisd(XmmRegister a, XmmRegister b);
 
   void sqrtsd(XmmRegister dst, XmmRegister src);
   void sqrtss(XmmRegister dst, XmmRegister src);
diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc
index c8e923c..14a98b9 100644
--- a/compiler/utils/x86_64/assembler_x86_64_test.cc
+++ b/compiler/utils/x86_64/assembler_x86_64_test.cc
@@ -660,14 +660,6 @@
   DriverStr(RepeatFF(&x86_64::X86_64Assembler::comisd, "comisd %{reg2}, %{reg1}"), "comisd");
 }
 
-TEST_F(AssemblerX86_64Test, Ucomiss) {
-  DriverStr(RepeatFF(&x86_64::X86_64Assembler::ucomiss, "ucomiss %{reg2}, %{reg1}"), "ucomiss");
-}
-
-TEST_F(AssemblerX86_64Test, Ucomisd) {
-  DriverStr(RepeatFF(&x86_64::X86_64Assembler::ucomisd, "ucomisd %{reg2}, %{reg1}"), "ucomisd");
-}
-
 TEST_F(AssemblerX86_64Test, Sqrtss) {
   DriverStr(RepeatFF(&x86_64::X86_64Assembler::sqrtss, "sqrtss %{reg2}, %{reg1}"), "sqrtss");
 }
diff --git a/compiler/utils/x86_64/constants_x86_64.h b/compiler/utils/x86_64/constants_x86_64.h
index 0c782d4..2a5b43d 100644
--- a/compiler/utils/x86_64/constants_x86_64.h
+++ b/compiler/utils/x86_64/constants_x86_64.h
@@ -105,8 +105,7 @@
   kZero         = kEqual,
   kNotZero      = kNotEqual,
   kNegative     = kSign,
-  kPositive     = kNotSign,
-  kUnordered    = kParityEven
+  kPositive     = kNotSign
 };
 
 
diff --git a/test/432-optimizing-cmp/expected.txt b/test/432-optimizing-cmp/expected.txt
deleted file mode 100644
index e69de29..0000000
--- a/test/432-optimizing-cmp/expected.txt
+++ /dev/null
diff --git a/test/432-optimizing-cmp/info.txt b/test/432-optimizing-cmp/info.txt
deleted file mode 100644
index fad6cee..0000000
--- a/test/432-optimizing-cmp/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-Tests for compare operations.
diff --git a/test/432-optimizing-cmp/smali/cmp.smali b/test/432-optimizing-cmp/smali/cmp.smali
deleted file mode 100644
index 470d940..0000000
--- a/test/432-optimizing-cmp/smali/cmp.smali
+++ /dev/null
@@ -1,33 +0,0 @@
-.class public LTestCmp;
-
-.super Ljava/lang/Object;
-
-.method public static $opt$CmpLong(JJ)I
-   .registers 5
-   cmp-long v0, v1, v3
-   return v0
-.end method
-
-.method public static $opt$CmpGtFloat(FF)I
-   .registers 3
-   cmpg-float v0, v1, v2
-   return v0
-.end method
-
-.method public static $opt$CmpLtFloat(FF)I
-   .registers 3
-   cmpl-float v0, v1, v2
-   return v0
-.end method
-
-.method public static $opt$CmpGtDouble(DD)I
-   .registers 5
-   cmpg-double v0, v1, v3
-   return v0
-.end method
-
-.method public static $opt$CmpLtDouble(DD)I
-   .registers 5
-   cmpl-double v0, v1, v3
-   return v0
-.end method
diff --git a/test/432-optimizing-cmp/src/Main.java b/test/432-optimizing-cmp/src/Main.java
deleted file mode 100644
index f45b94d..0000000
--- a/test/432-optimizing-cmp/src/Main.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.lang.reflect.Method;
-
-public class Main {
-
-  public static void main(String[] args) throws Exception {
-    cmpLong();
-    cmpFloat();
-    cmpDouble();
-  }
-
-  private static void cmpLong() throws Exception {
-    expectLt(3.1F, 5.1F);
-    expectGt(5.1F, 3.1F);
-    expectLt(Long.MIN_VALUE, Long.MAX_VALUE);
-    expectGt(Long.MAX_VALUE, Long.MIN_VALUE);
-
-    expectEquals(0, smaliCmpLong(0L, 0L));
-    expectEquals(0, smaliCmpLong(1L, 1L));
-    expectEquals(-1, smaliCmpLong(1L, 2L));
-    expectEquals(1, smaliCmpLong(2L, 1L));
-    expectEquals(-1, smaliCmpLong(Long.MIN_VALUE, Long.MAX_VALUE));
-    expectEquals(1, smaliCmpLong(Long.MAX_VALUE, Long.MIN_VALUE));
-    expectEquals(0, smaliCmpLong(Long.MIN_VALUE, Long.MIN_VALUE));
-    expectEquals(0, smaliCmpLong(Long.MAX_VALUE, Long.MAX_VALUE));
-  }
-
-  private static void cmpFloat() throws Exception {
-    expectLt(3.1F, 5.1F);
-    expectGt(5.1F, 3.1F);
-    expectLt(Float.MIN_VALUE, Float.MAX_VALUE);
-    expectGt(Float.MAX_VALUE, Float.MIN_VALUE);
-    expectFalse(3.1F, Float.NaN);
-    expectFalse(Float.NaN, 3.1F);
-
-    expectEquals(0, smaliCmpGtFloat(0F, 0F));
-    expectEquals(0, smaliCmpGtFloat(1F, 1F));
-    expectEquals(-1, smaliCmpGtFloat(1.1F, 2.1F));
-    expectEquals(1, smaliCmpGtFloat(2.1F, 1.1F));
-    expectEquals(-1, smaliCmpGtFloat(Float.MIN_VALUE, Float.MAX_VALUE));
-    expectEquals(1, smaliCmpGtFloat(Float.MAX_VALUE, Float.MIN_VALUE));
-    expectEquals(0, smaliCmpGtFloat(Float.MIN_VALUE, Float.MIN_VALUE));
-    expectEquals(0, smaliCmpGtFloat(Float.MAX_VALUE, Float.MAX_VALUE));
-    expectEquals(1, smaliCmpGtFloat(5F, Float.NaN));
-    expectEquals(1, smaliCmpGtFloat(Float.NaN, 5F));
-
-    expectEquals(0, smaliCmpLtFloat(0F, 0F));
-    expectEquals(0, smaliCmpLtFloat(1F, 1F));
-    expectEquals(-1, smaliCmpLtFloat(1.1F, 2.1F));
-    expectEquals(1, smaliCmpLtFloat(2.1F, 1.1F));
-    expectEquals(-1, smaliCmpLtFloat(Float.MIN_VALUE, Float.MAX_VALUE));
-    expectEquals(1, smaliCmpLtFloat(Float.MAX_VALUE, Float.MIN_VALUE));
-    expectEquals(0, smaliCmpLtFloat(Float.MIN_VALUE, Float.MIN_VALUE));
-    expectEquals(0, smaliCmpLtFloat(Float.MAX_VALUE, Float.MAX_VALUE));
-    expectEquals(-1, smaliCmpLtFloat(5F, Float.NaN));
-    expectEquals(-1, smaliCmpLtFloat(Float.NaN, 5F));
-  }
-
-  private static void cmpDouble() throws Exception {
-    expectLt(3.1D, 5.1D);
-    expectGt(5.1D, 3.1D);
-    expectLt(Double.MIN_VALUE, Double.MAX_VALUE);
-    expectGt(Double.MAX_VALUE, Double.MIN_VALUE);
-    expectFalse(3.1D, Double.NaN);
-    expectFalse(Double.NaN, 3.1D);
-
-    expectEquals(0, smaliCmpGtDouble(0D, 0D));
-    expectEquals(0, smaliCmpGtDouble(1D, 1D));
-    expectEquals(-1, smaliCmpGtDouble(1.1D, 2.1D));
-    expectEquals(1, smaliCmpGtDouble(2.1D, 1.1D));
-    expectEquals(-1, smaliCmpGtDouble(Double.MIN_VALUE, Double.MAX_VALUE));
-    expectEquals(1, smaliCmpGtDouble(Double.MAX_VALUE, Double.MIN_VALUE));
-    expectEquals(0, smaliCmpGtDouble(Double.MIN_VALUE, Double.MIN_VALUE));
-    expectEquals(0, smaliCmpGtDouble(Double.MAX_VALUE, Double.MAX_VALUE));
-    expectEquals(1, smaliCmpGtDouble(5D, Double.NaN));
-    expectEquals(1, smaliCmpGtDouble(Double.NaN, 5D));
-
-    expectEquals(0, smaliCmpLtDouble(0D, 0D));
-    expectEquals(0, smaliCmpLtDouble(1D, 1D));
-    expectEquals(-1, smaliCmpLtDouble(1.1D, 2.1D));
-    expectEquals(1, smaliCmpLtDouble(2.1D, 1.1D));
-    expectEquals(-1, smaliCmpLtDouble(Double.MIN_VALUE, Double.MAX_VALUE));
-    expectEquals(1, smaliCmpLtDouble(Double.MAX_VALUE, Double.MIN_VALUE));
-    expectEquals(0, smaliCmpLtDouble(Double.MIN_VALUE, Double.MIN_VALUE));
-    expectEquals(0, smaliCmpLtDouble(Double.MAX_VALUE, Double.MAX_VALUE));
-    expectEquals(-1, smaliCmpLtDouble(5D, Double.NaN));
-    expectEquals(-1, smaliCmpLtDouble(Float.NaN, 5D));
-  }
-
- static boolean $opt$lt(long a, long b) {
-    return a < b;
-  }
-
-  static boolean $opt$lt(float a, float b) {
-    return a < b;
-  }
-
-  static boolean $opt$lt(double a, double b) {
-    return a < b;
-  }
-
-  static boolean $opt$gt(long a, long b) {
-    return a > b;
-  }
-
-  static boolean $opt$gt(float a, float b) {
-    return a > b;
-  }
-
-  static boolean $opt$gt(double a, double b) {
-    return a > b;
-  }
-
-  // Wrappers around methods located in file cmp.smali.
-
-  private static int smaliCmpLong(long a, long b) throws Exception {
-    Class<?> c = Class.forName("TestCmp");
-    Method m = c.getMethod("$opt$CmpLong", long.class, long.class);
-    int result = (Integer)m.invoke(null, a, b);
-    return result;
-  }
-
-  private static int smaliCmpGtFloat(float a, float b) throws Exception {
-    Class<?> c = Class.forName("TestCmp");
-    Method m = c.getMethod("$opt$CmpGtFloat", float.class, float.class);
-    int result = (Integer)m.invoke(null, a, b);
-    return result;
-  }
-
-  private static int smaliCmpLtFloat(float a, float b) throws Exception {
-    Class<?> c = Class.forName("TestCmp");
-    Method m = c.getMethod("$opt$CmpLtFloat", float.class, float.class);
-    int result = (Integer)m.invoke(null, a, b);
-    return result;
-  }
-
-  private static int smaliCmpGtDouble(double a, double b) throws Exception {
-    Class<?> c = Class.forName("TestCmp");
-    Method m = c.getMethod("$opt$CmpGtDouble", double.class, double.class);
-    int result = (Integer)m.invoke(null, a, b);
-    return result;
-  }
-
-  private static int smaliCmpLtDouble(double a, double b) throws Exception {
-    Class<?> c = Class.forName("TestCmp");
-    Method m = c.getMethod("$opt$CmpLtDouble", double.class, double.class);
-    int result = (Integer)m.invoke(null, a, b);
-    return result;
-  }
-
-    public static void expectEquals(int expected, int result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
-  }
-
-  public static void expectLt(long a, long b) {
-    if (!$opt$lt(a, b)) {
-      throw new Error("Expected: " + a + " < " + b);
-    }
-  }
-
-  public static void expectGt(long a, long b) {
-    if (!$opt$gt(a, b)) {
-      throw new Error("Expected: " + a + " > " + b);
-    }
-  }
-
-  public static void expectLt(float a, float b) {
-    if (!$opt$lt(a, b)) {
-      throw new Error("Expected: " + a + " < " + b);
-    }
-  }
-
-  public static void expectGt(float a, float b) {
-    if (!$opt$gt(a, b)) {
-      throw new Error("Expected: " + a + " > " + b);
-    }
-  }
-
-  public static void expectFalse(float a, float b) {
-    if ($opt$lt(a, b)) {
-      throw new Error("Not expecting: " + a + " < " + b);
-    }
-    if ($opt$gt(a, b)) {
-      throw new Error("Not expecting: " + a + " > " + b);
-    }
-  }
-
-  public static void expectLt(double a, double b) {
-    if (!$opt$lt(a, b)) {
-      throw new Error("Expected: " + a + " < " + b);
-    }
-  }
-
-  public static void expectGt(double a, double b) {
-    if (!$opt$gt(a, b)) {
-      throw new Error("Expected: " + a + " > " + b);
-    }
-  }
-
-  public static void expectFalse(double a, double b) {
-    if ($opt$lt(a, b)) {
-      throw new Error("Not expecting: " + a + " < " + b);
-    }
-    if ($opt$gt(a, b)) {
-      throw new Error("Not expecting: " + a + " > " + b);
-    }
-  }
-
-}
-
diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk
index d9699bd..47d186a 100644
--- a/test/Android.run-test.mk
+++ b/test/Android.run-test.mk
@@ -331,7 +331,6 @@
   428-optimizing-arith-rem \
   430-live-register-slow-path \
   431-optimizing-arith-shifts \
-  432-optimizing-cmp \
   701-easy-div-rem \
   800-smali \
 
