Mercurial > hg > truffle
diff src/cpu/x86/vm/stubGenerator_x86_32.cpp @ 2245:638119ce7cfd
7009309: JSR 292: compiler/6991596/Test6991596.java crashes on fastdebug JDK7/b122
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Tue, 01 Feb 2011 03:38:44 -0800 |
parents | f95d63e2154a |
children | d89a22843c62 |
line wrap: on
line diff
--- a/src/cpu/x86/vm/stubGenerator_x86_32.cpp Mon Jan 31 17:48:21 2011 -0800 +++ b/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Feb 01 03:38:44 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -240,9 +240,30 @@ BLOCK_COMMENT("call_stub_return_address:"); return_address = __ pc(); - Label common_return; +#ifdef COMPILER2 + { + Label L_skip; + if (UseSSE >= 2) { + __ verify_FPU(0, "call_stub_return"); + } else { + for (int i = 1; i < 8; i++) { + __ ffree(i); + } - __ BIND(common_return); + // UseSSE <= 1 so double result should be left on TOS + __ movl(rsi, result_type); + __ cmpl(rsi, T_DOUBLE); + __ jcc(Assembler::equal, L_skip); + if (UseSSE == 0) { + // UseSSE == 0 so float result should be left on TOS + __ cmpl(rsi, T_FLOAT); + __ jcc(Assembler::equal, L_skip); + } + __ ffree(0); + } + __ BIND(L_skip); + } +#endif // COMPILER2 // store result depending on type // (everything that is not T_LONG, T_FLOAT or T_DOUBLE is treated as T_INT) @@ -305,37 +326,6 @@ } __ jmp(exit); - // If we call compiled code directly from the call stub we will - // need to adjust the return back to the call stub to a specialized - // piece of code that can handle compiled results and cleaning the fpu - // stack. compiled code will be set to return here instead of the - // return above that handles interpreter returns. - - BLOCK_COMMENT("call_stub_compiled_return:"); - StubRoutines::x86::set_call_stub_compiled_return( __ pc()); - -#ifdef COMPILER2 - if (UseSSE >= 2) { - __ verify_FPU(0, "call_stub_compiled_return"); - } else { - for (int i = 1; i < 8; i++) { - __ ffree(i); - } - - // UseSSE <= 1 so double result should be left on TOS - __ movl(rsi, result_type); - __ cmpl(rsi, T_DOUBLE); - __ jcc(Assembler::equal, common_return); - if (UseSSE == 0) { - // UseSSE == 0 so float result should be left on TOS - __ cmpl(rsi, T_FLOAT); - __ jcc(Assembler::equal, common_return); - } - __ ffree(0); - } -#endif /* COMPILER2 */ - __ jmp(common_return); - return start; }