Mercurial > hg > truffle
comparison src/cpu/x86/vm/sharedRuntime_x86_64.cpp @ 11222:8f33568d693d
Merge
author | Christos Kotselidis <christos.kotselidis@oracle.com> |
---|---|
date | Tue, 06 Aug 2013 14:39:47 +0200 |
parents | 6b0fd0964b87 |
children | 02f27ecb4f3a |
comparison
equal
deleted
inserted
replaced
11221:8d4bd13c6983 | 11222:8f33568d693d |
---|---|
1441 assert(!body_arg.first()->is_Register() || body_arg.first()->as_Register() != tmp_reg, | 1441 assert(!body_arg.first()->is_Register() || body_arg.first()->as_Register() != tmp_reg, |
1442 "possible collision"); | 1442 "possible collision"); |
1443 assert(!length_arg.first()->is_Register() || length_arg.first()->as_Register() != tmp_reg, | 1443 assert(!length_arg.first()->is_Register() || length_arg.first()->as_Register() != tmp_reg, |
1444 "possible collision"); | 1444 "possible collision"); |
1445 | 1445 |
1446 __ block_comment("unpack_array_argument {"); | |
1447 | |
1446 // Pass the length, ptr pair | 1448 // Pass the length, ptr pair |
1447 Label is_null, done; | 1449 Label is_null, done; |
1448 VMRegPair tmp; | 1450 VMRegPair tmp; |
1449 tmp.set_ptr(tmp_reg->as_VMReg()); | 1451 tmp.set_ptr(tmp_reg->as_VMReg()); |
1450 if (reg.first()->is_stack()) { | 1452 if (reg.first()->is_stack()) { |
1465 // Pass zeros | 1467 // Pass zeros |
1466 __ xorptr(tmp_reg, tmp_reg); | 1468 __ xorptr(tmp_reg, tmp_reg); |
1467 move_ptr(masm, tmp, body_arg); | 1469 move_ptr(masm, tmp, body_arg); |
1468 move32_64(masm, tmp, length_arg); | 1470 move32_64(masm, tmp, length_arg); |
1469 __ bind(done); | 1471 __ bind(done); |
1472 | |
1473 __ block_comment("} unpack_array_argument"); | |
1470 } | 1474 } |
1471 | 1475 |
1472 | 1476 |
1473 // Different signatures may require very different orders for the move | 1477 // Different signatures may require very different orders for the move |
1474 // to avoid clobbering other arguments. There's no simple way to | 1478 // to avoid clobbering other arguments. There's no simple way to |
2206 default: | 2210 default: |
2207 move32_64(masm, in_regs[i], out_regs[c_arg]); | 2211 move32_64(masm, in_regs[i], out_regs[c_arg]); |
2208 } | 2212 } |
2209 } | 2213 } |
2210 | 2214 |
2211 // point c_arg at the first arg that is already loaded in case we | 2215 int c_arg; |
2212 // need to spill before we call out | |
2213 int c_arg = total_c_args - total_in_args; | |
2214 | 2216 |
2215 // Pre-load a static method's oop into r14. Used both by locking code and | 2217 // Pre-load a static method's oop into r14. Used both by locking code and |
2216 // the normal JNI call code. | 2218 // the normal JNI call code. |
2217 if (method->is_static() && !is_critical_native) { | 2219 if (!is_critical_native) { |
2218 | 2220 // point c_arg at the first arg that is already loaded in case we |
2219 // load oop into a register | 2221 // need to spill before we call out |
2220 __ movoop(oop_handle_reg, JNIHandles::make_local(method->method_holder()->java_mirror())); | 2222 c_arg = total_c_args - total_in_args; |
2221 | 2223 |
2222 // Now handlize the static class mirror it's known not-null. | 2224 if (method->is_static()) { |
2223 __ movptr(Address(rsp, klass_offset), oop_handle_reg); | 2225 |
2224 map->set_oop(VMRegImpl::stack2reg(klass_slot_offset)); | 2226 // load oop into a register |
2225 | 2227 __ movoop(oop_handle_reg, JNIHandles::make_local(method->method_holder()->java_mirror())); |
2226 // Now get the handle | 2228 |
2227 __ lea(oop_handle_reg, Address(rsp, klass_offset)); | 2229 // Now handlize the static class mirror it's known not-null. |
2228 // store the klass handle as second argument | 2230 __ movptr(Address(rsp, klass_offset), oop_handle_reg); |
2229 __ movptr(c_rarg1, oop_handle_reg); | 2231 map->set_oop(VMRegImpl::stack2reg(klass_slot_offset)); |
2230 // and protect the arg if we must spill | 2232 |
2231 c_arg--; | 2233 // Now get the handle |
2234 __ lea(oop_handle_reg, Address(rsp, klass_offset)); | |
2235 // store the klass handle as second argument | |
2236 __ movptr(c_rarg1, oop_handle_reg); | |
2237 // and protect the arg if we must spill | |
2238 c_arg--; | |
2239 } | |
2240 } else { | |
2241 // For JNI critical methods we need to save all registers in save_args. | |
2242 c_arg = 0; | |
2232 } | 2243 } |
2233 | 2244 |
2234 // Change state to native (we save the return address in the thread, since it might not | 2245 // Change state to native (we save the return address in the thread, since it might not |
2235 // be pushed on the stack when we do a a stack traversal). It is enough that the pc() | 2246 // be pushed on the stack when we do a a stack traversal). It is enough that the pc() |
2236 // points into the right code segment. It does not have to be the correct return pc. | 2247 // points into the right code segment. It does not have to be the correct return pc. |