1 /* |
1 /* |
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
238 __ call(rax); |
238 __ call(rax); |
239 |
239 |
240 BLOCK_COMMENT("call_stub_return_address:"); |
240 BLOCK_COMMENT("call_stub_return_address:"); |
241 return_address = __ pc(); |
241 return_address = __ pc(); |
242 |
242 |
243 Label common_return; |
243 #ifdef COMPILER2 |
244 |
244 { |
245 __ BIND(common_return); |
245 Label L_skip; |
|
246 if (UseSSE >= 2) { |
|
247 __ verify_FPU(0, "call_stub_return"); |
|
248 } else { |
|
249 for (int i = 1; i < 8; i++) { |
|
250 __ ffree(i); |
|
251 } |
|
252 |
|
253 // UseSSE <= 1 so double result should be left on TOS |
|
254 __ movl(rsi, result_type); |
|
255 __ cmpl(rsi, T_DOUBLE); |
|
256 __ jcc(Assembler::equal, L_skip); |
|
257 if (UseSSE == 0) { |
|
258 // UseSSE == 0 so float result should be left on TOS |
|
259 __ cmpl(rsi, T_FLOAT); |
|
260 __ jcc(Assembler::equal, L_skip); |
|
261 } |
|
262 __ ffree(0); |
|
263 } |
|
264 __ BIND(L_skip); |
|
265 } |
|
266 #endif // COMPILER2 |
246 |
267 |
247 // store result depending on type |
268 // store result depending on type |
248 // (everything that is not T_LONG, T_FLOAT or T_DOUBLE is treated as T_INT) |
269 // (everything that is not T_LONG, T_FLOAT or T_DOUBLE is treated as T_INT) |
249 __ movptr(rdi, result); |
270 __ movptr(rdi, result); |
250 Label is_long, is_float, is_double, exit; |
271 Label is_long, is_float, is_double, exit; |
302 __ movdbl(Address(rdi, 0), xmm0); |
323 __ movdbl(Address(rdi, 0), xmm0); |
303 } else { |
324 } else { |
304 __ fstp_d(Address(rdi, 0)); |
325 __ fstp_d(Address(rdi, 0)); |
305 } |
326 } |
306 __ jmp(exit); |
327 __ jmp(exit); |
307 |
|
308 // If we call compiled code directly from the call stub we will |
|
309 // need to adjust the return back to the call stub to a specialized |
|
310 // piece of code that can handle compiled results and cleaning the fpu |
|
311 // stack. compiled code will be set to return here instead of the |
|
312 // return above that handles interpreter returns. |
|
313 |
|
314 BLOCK_COMMENT("call_stub_compiled_return:"); |
|
315 StubRoutines::x86::set_call_stub_compiled_return( __ pc()); |
|
316 |
|
317 #ifdef COMPILER2 |
|
318 if (UseSSE >= 2) { |
|
319 __ verify_FPU(0, "call_stub_compiled_return"); |
|
320 } else { |
|
321 for (int i = 1; i < 8; i++) { |
|
322 __ ffree(i); |
|
323 } |
|
324 |
|
325 // UseSSE <= 1 so double result should be left on TOS |
|
326 __ movl(rsi, result_type); |
|
327 __ cmpl(rsi, T_DOUBLE); |
|
328 __ jcc(Assembler::equal, common_return); |
|
329 if (UseSSE == 0) { |
|
330 // UseSSE == 0 so float result should be left on TOS |
|
331 __ cmpl(rsi, T_FLOAT); |
|
332 __ jcc(Assembler::equal, common_return); |
|
333 } |
|
334 __ ffree(0); |
|
335 } |
|
336 #endif /* COMPILER2 */ |
|
337 __ jmp(common_return); |
|
338 |
328 |
339 return start; |
329 return start; |
340 } |
330 } |
341 |
331 |
342 |
332 |