Mercurial > hg > graal-jvmci-8
diff src/cpu/sparc/vm/assembler_sparc.inline.hpp @ 2121:c17b998c5926
7011627: C1: call_RT must support targets that don't fit in wdisp30
Summary: Make both compilers emit near and far calls when necessary.
Reviewed-by: never, kvn, phh
author | iveresov |
---|---|
date | Wed, 12 Jan 2011 18:33:25 -0800 |
parents | 2f644f85485d |
children | f7d55ea6ee56 |
line wrap: on
line diff
--- a/src/cpu/sparc/vm/assembler_sparc.inline.hpp Tue Jan 11 20:26:13 2011 -0800 +++ b/src/cpu/sparc/vm/assembler_sparc.inline.hpp Wed Jan 12 18:33:25 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -588,10 +588,13 @@ inline void MacroAssembler::jmp( Register s1, Register s2 ) { jmpl( s1, s2, G0 ); } inline void MacroAssembler::jmp( Register s1, int simm13a, RelocationHolder const& rspec ) { jmpl( s1, simm13a, G0, rspec); } +inline bool MacroAssembler::is_far_target(address d) { + return !is_in_wdisp30_range(d, CodeCache::low_bound()) || !is_in_wdisp30_range(d, CodeCache::high_bound()); +} + // Call with a check to see if we need to deal with the added // expense of relocation and if we overflow the displacement -// of the quick call instruction./ -// Check to see if we have to deal with relocations +// of the quick call instruction. inline void MacroAssembler::call( address d, relocInfo::relocType rt ) { #ifdef _LP64 intptr_t disp; @@ -603,14 +606,12 @@ // Is this address within range of the call instruction? // If not, use the expensive instruction sequence - disp = (intptr_t)d - (intptr_t)pc(); - if ( disp != (intptr_t)(int32_t)disp ) { + if (is_far_target(d)) { relocate(rt); AddressLiteral dest(d); jumpl_to(dest, O7, O7); - } - else { - Assembler::call( d, rt ); + } else { + Assembler::call(d, rt); } #else Assembler::call( d, rt );