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 // }