Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/c1_CodeStubs_x86.cpp @ 304:dc7f315e41f7
5108146: Merge i486 and amd64 cpu directories
6459804: Want client (c1) compiler for x86_64 (amd64) for faster start-up
Reviewed-by: kvn
author | never |
---|---|
date | Wed, 27 Aug 2008 00:21:55 -0700 |
parents | a61af66fc99e |
children | 9ee9cf798b59 f8199438385b |
comparison
equal
deleted
inserted
replaced
303:fa4d1d240383 | 304:dc7f315e41f7 |
---|---|
41 ExternalAddress((address)&float_zero)); | 41 ExternalAddress((address)&float_zero)); |
42 } else if (input()->is_double_xmm()) { | 42 } else if (input()->is_double_xmm()) { |
43 __ comisd(input()->as_xmm_double_reg(), | 43 __ comisd(input()->as_xmm_double_reg(), |
44 ExternalAddress((address)&double_zero)); | 44 ExternalAddress((address)&double_zero)); |
45 } else { | 45 } else { |
46 __ pushl(rax); | 46 LP64_ONLY(ShouldNotReachHere()); |
47 __ push(rax); | |
47 __ ftst(); | 48 __ ftst(); |
48 __ fnstsw_ax(); | 49 __ fnstsw_ax(); |
49 __ sahf(); | 50 __ sahf(); |
50 __ popl(rax); | 51 __ pop(rax); |
51 } | 52 } |
52 | 53 |
53 Label NaN, do_return; | 54 Label NaN, do_return; |
54 __ jccb(Assembler::parity, NaN); | 55 __ jccb(Assembler::parity, NaN); |
55 __ jccb(Assembler::below, do_return); | 56 __ jccb(Assembler::below, do_return); |
59 __ decrement(result()->as_register()); | 60 __ decrement(result()->as_register()); |
60 __ jmpb(do_return); | 61 __ jmpb(do_return); |
61 | 62 |
62 // input is NaN -> return 0 | 63 // input is NaN -> return 0 |
63 __ bind(NaN); | 64 __ bind(NaN); |
64 __ xorl(result()->as_register(), result()->as_register()); | 65 __ xorptr(result()->as_register(), result()->as_register()); |
65 | 66 |
66 __ bind(do_return); | 67 __ bind(do_return); |
67 __ jmp(_continuation); | 68 __ jmp(_continuation); |
68 } | 69 } |
69 | 70 |
137 | 138 |
138 | 139 |
139 void NewInstanceStub::emit_code(LIR_Assembler* ce) { | 140 void NewInstanceStub::emit_code(LIR_Assembler* ce) { |
140 assert(__ rsp_offset() == 0, "frame size should be fixed"); | 141 assert(__ rsp_offset() == 0, "frame size should be fixed"); |
141 __ bind(_entry); | 142 __ bind(_entry); |
142 __ movl(rdx, _klass_reg->as_register()); | 143 __ movptr(rdx, _klass_reg->as_register()); |
143 __ call(RuntimeAddress(Runtime1::entry_for(_stub_id))); | 144 __ call(RuntimeAddress(Runtime1::entry_for(_stub_id))); |
144 ce->add_call_info_here(_info); | 145 ce->add_call_info_here(_info); |
145 ce->verify_oop_map(_info); | 146 ce->verify_oop_map(_info); |
146 assert(_result->as_register() == rax, "result must in rax,"); | 147 assert(_result->as_register() == rax, "result must in rax,"); |
147 __ jmp(_continuation); | 148 __ jmp(_continuation); |
304 __ block_comment(" being_initialized check"); | 305 __ block_comment(" being_initialized check"); |
305 } | 306 } |
306 assert(_obj != noreg, "must be a valid register"); | 307 assert(_obj != noreg, "must be a valid register"); |
307 Register tmp = rax; | 308 Register tmp = rax; |
308 if (_obj == tmp) tmp = rbx; | 309 if (_obj == tmp) tmp = rbx; |
309 __ pushl(tmp); | 310 __ push(tmp); |
310 __ get_thread(tmp); | 311 __ get_thread(tmp); |
311 __ cmpl(tmp, Address(_obj, instanceKlass::init_thread_offset_in_bytes() + sizeof(klassOopDesc))); | 312 __ cmpptr(tmp, Address(_obj, instanceKlass::init_thread_offset_in_bytes() + sizeof(klassOopDesc))); |
312 __ popl(tmp); | 313 __ pop(tmp); |
313 __ jcc(Assembler::notEqual, call_patch); | 314 __ jcc(Assembler::notEqual, call_patch); |
314 | 315 |
315 // access_field patches may execute the patched code before it's | 316 // access_field patches may execute the patched code before it's |
316 // copied back into place so we need to jump back into the main | 317 // copied back into place so we need to jump back into the main |
317 // code of the nmethod to continue execution. | 318 // code of the nmethod to continue execution. |
432 // next registers will get stored on the stack | 433 // next registers will get stored on the stack |
433 for (int i = 0; i < 5 ; i++ ) { | 434 for (int i = 0; i < 5 ; i++ ) { |
434 VMReg r_1 = args[i].first(); | 435 VMReg r_1 = args[i].first(); |
435 if (r_1->is_stack()) { | 436 if (r_1->is_stack()) { |
436 int st_off = r_1->reg2stack() * wordSize; | 437 int st_off = r_1->reg2stack() * wordSize; |
437 __ movl (Address(rsp, st_off), r[i]); | 438 __ movptr (Address(rsp, st_off), r[i]); |
438 } else { | 439 } else { |
439 assert(r[i] == args[i].first()->as_Register(), "Wrong register for arg "); | 440 assert(r[i] == args[i].first()->as_Register(), "Wrong register for arg "); |
440 } | 441 } |
441 } | 442 } |
442 | 443 |
447 relocInfo::static_call_type); | 448 relocInfo::static_call_type); |
448 __ call(resolve); | 449 __ call(resolve); |
449 ce->add_call_info_here(info()); | 450 ce->add_call_info_here(info()); |
450 | 451 |
451 #ifndef PRODUCT | 452 #ifndef PRODUCT |
452 __ increment(ExternalAddress((address)&Runtime1::_arraycopy_slowcase_cnt)); | 453 __ incrementl(ExternalAddress((address)&Runtime1::_arraycopy_slowcase_cnt)); |
453 #endif | 454 #endif |
454 | 455 |
455 __ jmp(_continuation); | 456 __ jmp(_continuation); |
456 } | 457 } |
457 | 458 |