[aarch64-port-dev ] C1: Correct types for double-double stack move.

Andrew Haley aph at redhat.com
Mon Sep 22 09:20:07 UTC 2014


Sometimes we have to copy floating-point values from stack to stack.
We don't have a dedicated floating-point scratch register, so it's
easiest to use an integer register instead.  Unfortunately we got the
type of the integer register we use wrong; fixed thusly.

Andrew.


# HG changeset patch
# User aph
# Date 1410941098 14400
#      Wed Sep 17 04:04:58 2014 -0400
# Node ID 07ecc743c580a14fd483417e1f21bac3aff71931
# Parent  9200b9e93039412a3bcc2552575ae6a4d311daf9
C1: Correct types for double-double stack move.

diff -r 9200b9e93039 -r 07ecc743c580 src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
--- a/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp	Wed Sep 17 04:02:47 2014 -0400
+++ b/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp	Wed Sep 17 04:04:58 2014 -0400
@@ -906,7 +906,7 @@
     if (type == T_ARRAY || type == T_OBJECT) {
       __ ldr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
       __ verify_oop(dest->as_register());
-    } else if (type == T_METADATA || type == T_DOUBLE) {
+    } else if (type == T_METADATA) {
       __ ldr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
     } else {
       __ ldrw(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
@@ -959,8 +959,9 @@
 }

 void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) {
+
   LIR_Opr temp;
-  if (type == T_LONG)
+  if (type == T_LONG || type == T_DOUBLE)
     temp = FrameMap::rscratch1_long_opr;
   else
     temp = FrameMap::rscratch1_opr;


More information about the aarch64-port-dev mailing list