Mercurial > hg > truffle
comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 1006:dcf03e02b020
6879902: CTW failure jdk6_18/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp:845
Summary: For signatures with a large number of arguments the offset for the float store becomes too big and does not fit in 13-bit.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Tue, 06 Oct 2009 02:11:49 -0700 |
parents | 62001a362ce9 |
children | cff162798819 c640000b7cc1 |
comparison
equal
deleted
inserted
replaced
997:46b819ba120b | 1006:dcf03e02b020 |
---|---|
2629 assert(dest.register_or_noreg() != G0, "lost side effect"); | 2629 assert(dest.register_or_noreg() != G0, "lost side effect"); |
2630 if ((src.is_constant() && src.as_constant() == 0) || | 2630 if ((src.is_constant() && src.as_constant() == 0) || |
2631 (src.is_register() && src.as_register() == G0)) { | 2631 (src.is_register() && src.as_register() == G0)) { |
2632 // do nothing | 2632 // do nothing |
2633 } else if (dest.is_register()) { | 2633 } else if (dest.is_register()) { |
2634 add(dest.as_register(), ensure_rs2(src, temp), dest.as_register()); | 2634 add(dest.as_register(), ensure_simm13_or_reg(src, temp), dest.as_register()); |
2635 } else if (src.is_constant()) { | 2635 } else if (src.is_constant()) { |
2636 intptr_t res = dest.as_constant() + src.as_constant(); | 2636 intptr_t res = dest.as_constant() + src.as_constant(); |
2637 dest = RegisterOrConstant(res); // side effect seen by caller | 2637 dest = RegisterOrConstant(res); // side effect seen by caller |
2638 } else { | 2638 } else { |
2639 assert(temp != noreg, "cannot handle constant += register"); | 2639 assert(temp != noreg, "cannot handle constant += register"); |
2640 add(src.as_register(), ensure_rs2(dest, temp), temp); | 2640 add(src.as_register(), ensure_simm13_or_reg(dest, temp), temp); |
2641 dest = RegisterOrConstant(temp); // side effect seen by caller | 2641 dest = RegisterOrConstant(temp); // side effect seen by caller |
2642 } | 2642 } |
2643 } | 2643 } |
2644 | 2644 |
2645 void MacroAssembler::regcon_sll_ptr( RegisterOrConstant& dest, RegisterOrConstant src, Register temp ) { | 2645 void MacroAssembler::regcon_sll_ptr( RegisterOrConstant& dest, RegisterOrConstant src, Register temp ) { |
2708 | 2708 |
2709 // Adjust recv_klass by scaled itable_index, so we can free itable_index. | 2709 // Adjust recv_klass by scaled itable_index, so we can free itable_index. |
2710 RegisterOrConstant itable_offset = itable_index; | 2710 RegisterOrConstant itable_offset = itable_index; |
2711 regcon_sll_ptr(itable_offset, exact_log2(itableMethodEntry::size() * wordSize)); | 2711 regcon_sll_ptr(itable_offset, exact_log2(itableMethodEntry::size() * wordSize)); |
2712 regcon_inc_ptr(itable_offset, itableMethodEntry::method_offset_in_bytes()); | 2712 regcon_inc_ptr(itable_offset, itableMethodEntry::method_offset_in_bytes()); |
2713 add(recv_klass, ensure_rs2(itable_offset, sethi_temp), recv_klass); | 2713 add(recv_klass, ensure_simm13_or_reg(itable_offset, sethi_temp), recv_klass); |
2714 | 2714 |
2715 // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { | 2715 // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { |
2716 // if (scan->interface() == intf) { | 2716 // if (scan->interface() == intf) { |
2717 // result = (klass + scan->offset() + itable_index); | 2717 // result = (klass + scan->offset() + itable_index); |
2718 // } | 2718 // } |