[aarch64-port-dev ] A more efficient sequence for C1_MacroAssembler::float_cmp.

Andrew Haley aph at redhat.com
Wed Aug 20 14:58:11 UTC 2014


A minor improvement; removes a branch.

Andrew.


# HG changeset patch
# User aph
# Date 1408546615 14400
#      Wed Aug 20 10:56:55 2014 -0400
# Node ID 4a1e593ddb9e9e7317f9aa416a2b478d336fe334
# Parent  d9857f115ab3b7355883e25956cf085ee8d980bd
A more efficient sequence for C1_MacroAssembler::float_cmp.

diff -r d9857f115ab3 -r 4a1e593ddb9e src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp
--- a/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp  Wed Aug 20 10:55:48 2014 -0400
+++ b/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp  Wed Aug 20 10:56:55 2014 -0400
@@ -50,21 +50,14 @@
   if (unordered_result < 0) {
     // we want -1 for unordered or less than, 0 for equal and 1 for
     // greater than.
-    mov(result, (u_int64_t)-1L);
-    // for FP LT tests less than or unordered
-    br(Assembler::LT, done);
-    // install 0 for EQ otherwise 1
-    csinc(result, zr, zr, Assembler::EQ);
+    cset(result, NE);  // Not equal or unordered
+    cneg(result, result, LT);  // Less than or unordered
   } else {
     // we want -1 for less than, 0 for equal and 1 for unordered or
     // greater than.
-    mov(result, 1L);
-    // for FP HI tests greater than or unordered
-    br(Assembler::HI, done);
-    // install 0 for EQ otherwise ~0
-    csinv(result, zr, zr, Assembler::EQ);
+    cset(result, NE);  // Not equal or unordered
+    cneg(result, result, LO);  // Less than
   }
-  bind(done);
 }

 int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register scratch, Label& slow_case) {


More information about the aarch64-port-dev mailing list