29 #define __ gen()->lir(__FILE__, __LINE__)-> |
29 #define __ gen()->lir(__FILE__, __LINE__)-> |
30 #else |
30 #else |
31 #define __ gen()->lir()-> |
31 #define __ gen()->lir()-> |
32 #endif |
32 #endif |
33 |
33 |
|
34 // TODO: ARM - Use some recognizable constant which still fits architectural constraints |
|
35 #ifdef ARM |
|
36 #define PATCHED_ADDR (204) |
|
37 #else |
|
38 #define PATCHED_ADDR (max_jint) |
|
39 #endif |
34 |
40 |
35 void PhiResolverState::reset(int max_vregs) { |
41 void PhiResolverState::reset(int max_vregs) { |
36 // Initialize array sizes |
42 // Initialize array sizes |
37 _virtual_operands.at_put_grow(max_vregs - 1, NULL, NULL); |
43 _virtual_operands.at_put_grow(max_vregs - 1, NULL, NULL); |
38 _virtual_operands.trunc_to(0); |
44 _virtual_operands.trunc_to(0); |
223 } |
229 } |
224 |
230 |
225 void LIRItem::load_item_force(LIR_Opr reg) { |
231 void LIRItem::load_item_force(LIR_Opr reg) { |
226 LIR_Opr r = result(); |
232 LIR_Opr r = result(); |
227 if (r != reg) { |
233 if (r != reg) { |
|
234 #if !defined(ARM) && !defined(E500V2) |
228 if (r->type() != reg->type()) { |
235 if (r->type() != reg->type()) { |
229 // moves between different types need an intervening spill slot |
236 // moves between different types need an intervening spill slot |
230 LIR_Opr tmp = _gen->force_to_spill(r, reg->type()); |
237 r = _gen->force_to_spill(r, reg->type()); |
231 __ move(tmp, reg); |
238 } |
232 } else { |
239 #endif |
233 __ move(r, reg); |
240 __ move(r, reg); |
234 } |
|
235 _result = reg; |
241 _result = reg; |
236 } |
242 } |
237 } |
243 } |
238 |
244 |
239 ciObject* LIRItem::get_jobject_constant() const { |
245 ciObject* LIRItem::get_jobject_constant() const { |
626 // for handling NullPointerException, use debug info representing just the lock stack before this monitorenter |
632 // for handling NullPointerException, use debug info representing just the lock stack before this monitorenter |
627 __ lock_object(hdr, object, lock, scratch, slow_path, info_for_exception); |
633 __ lock_object(hdr, object, lock, scratch, slow_path, info_for_exception); |
628 } |
634 } |
629 |
635 |
630 |
636 |
631 void LIRGenerator::monitor_exit(LIR_Opr object, LIR_Opr lock, LIR_Opr new_hdr, int monitor_no) { |
637 void LIRGenerator::monitor_exit(LIR_Opr object, LIR_Opr lock, LIR_Opr new_hdr, LIR_Opr scratch, int monitor_no) { |
632 if (!GenerateSynchronizationCode) return; |
638 if (!GenerateSynchronizationCode) return; |
633 // setup registers |
639 // setup registers |
634 LIR_Opr hdr = lock; |
640 LIR_Opr hdr = lock; |
635 lock = new_hdr; |
641 lock = new_hdr; |
636 CodeStub* slow_path = new MonitorExitStub(lock, UseFastLocking, monitor_no); |
642 CodeStub* slow_path = new MonitorExitStub(lock, UseFastLocking, monitor_no); |
637 __ load_stack_address_monitor(monitor_no, lock); |
643 __ load_stack_address_monitor(monitor_no, lock); |
638 __ unlock_object(hdr, object, lock, slow_path); |
644 __ unlock_object(hdr, object, lock, scratch, slow_path); |
639 } |
645 } |
640 |
646 |
641 |
647 |
642 void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) { |
648 void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) { |
643 jobject2reg_with_patching(klass_reg, klass, info); |
649 jobject2reg_with_patching(klass_reg, klass, info); |
1398 } |
1404 } |
1399 addr = ptr; |
1405 addr = ptr; |
1400 } |
1406 } |
1401 assert(addr->is_register(), "must be a register at this point"); |
1407 assert(addr->is_register(), "must be a register at this point"); |
1402 |
1408 |
|
1409 #ifdef ARM |
|
1410 // TODO: ARM - move to platform-dependent code |
|
1411 LIR_Opr tmp = FrameMap::R14_opr; |
|
1412 if (VM_Version::supports_movw()) { |
|
1413 __ move((LIR_Opr)card_table_base, tmp); |
|
1414 } else { |
|
1415 __ move(new LIR_Address(FrameMap::Rthread_opr, in_bytes(JavaThread::card_table_base_offset()), T_ADDRESS), tmp); |
|
1416 } |
|
1417 |
|
1418 CardTableModRefBS* ct = (CardTableModRefBS*)_bs; |
|
1419 LIR_Address *card_addr = new LIR_Address(tmp, addr, (LIR_Address::Scale) -CardTableModRefBS::card_shift, 0, T_BYTE); |
|
1420 if(((int)ct->byte_map_base & 0xff) == 0) { |
|
1421 __ move(tmp, card_addr); |
|
1422 } else { |
|
1423 LIR_Opr tmp_zero = new_register(T_INT); |
|
1424 __ move(LIR_OprFact::intConst(0), tmp_zero); |
|
1425 __ move(tmp_zero, card_addr); |
|
1426 } |
|
1427 #else // ARM |
1403 LIR_Opr tmp = new_pointer_register(); |
1428 LIR_Opr tmp = new_pointer_register(); |
1404 if (TwoOperandLIRForm) { |
1429 if (TwoOperandLIRForm) { |
1405 __ move(addr, tmp); |
1430 __ move(addr, tmp); |
1406 __ unsigned_shift_right(tmp, CardTableModRefBS::card_shift, tmp); |
1431 __ unsigned_shift_right(tmp, CardTableModRefBS::card_shift, tmp); |
1407 } else { |
1432 } else { |
1505 if (needs_patching) { |
1531 if (needs_patching) { |
1506 // we need to patch the offset in the instruction so don't allow |
1532 // we need to patch the offset in the instruction so don't allow |
1507 // generate_address to try to be smart about emitting the -1. |
1533 // generate_address to try to be smart about emitting the -1. |
1508 // Otherwise the patching code won't know how to find the |
1534 // Otherwise the patching code won't know how to find the |
1509 // instruction to patch. |
1535 // instruction to patch. |
1510 address = new LIR_Address(object.result(), max_jint, field_type); |
1536 address = new LIR_Address(object.result(), PATCHED_ADDR, field_type); |
1511 } else { |
1537 } else { |
1512 address = generate_address(object.result(), x->offset(), field_type); |
1538 address = generate_address(object.result(), x->offset(), field_type); |
1513 } |
1539 } |
1514 |
1540 |
1515 if (is_volatile && os::is_MP()) { |
1541 if (is_volatile && os::is_MP()) { |
1582 if (needs_patching) { |
1608 if (needs_patching) { |
1583 // we need to patch the offset in the instruction so don't allow |
1609 // we need to patch the offset in the instruction so don't allow |
1584 // generate_address to try to be smart about emitting the -1. |
1610 // generate_address to try to be smart about emitting the -1. |
1585 // Otherwise the patching code won't know how to find the |
1611 // Otherwise the patching code won't know how to find the |
1586 // instruction to patch. |
1612 // instruction to patch. |
1587 address = new LIR_Address(object.result(), max_jint, field_type); |
1613 address = new LIR_Address(object.result(), PATCHED_ADDR, field_type); |
1588 } else { |
1614 } else { |
1589 address = generate_address(object.result(), x->offset(), field_type); |
1615 address = generate_address(object.result(), x->offset(), field_type); |
1590 } |
1616 } |
1591 |
1617 |
1592 if (is_volatile) { |
1618 if (is_volatile) { |
1842 __ convert(Bytecodes::_i2l, index_op, tmp); |
1868 __ convert(Bytecodes::_i2l, index_op, tmp); |
1843 index_op = tmp; |
1869 index_op = tmp; |
1844 } |
1870 } |
1845 #endif |
1871 #endif |
1846 addr = new LIR_Address(base_op, index_op, LIR_Address::Scale(log2_scale), 0, dst_type); |
1872 addr = new LIR_Address(base_op, index_op, LIR_Address::Scale(log2_scale), 0, dst_type); |
|
1873 #elif defined(ARM) |
|
1874 addr = generate_address(base_op, index_op, log2_scale, 0, dst_type); |
1847 #else |
1875 #else |
1848 if (index_op->is_illegal() || log2_scale == 0) { |
1876 if (index_op->is_illegal() || log2_scale == 0) { |
1849 #ifdef _LP64 |
1877 #ifdef _LP64 |
1850 if (!index_op->is_illegal() && index_op->type() == T_INT) { |
1878 if (!index_op->is_illegal() && index_op->type() == T_INT) { |
1851 LIR_Opr tmp = new_pointer_register(); |
1879 LIR_Opr tmp = new_pointer_register(); |
1914 #ifdef _LP64 |
1942 #ifdef _LP64 |
1915 if(idx.result()->type() == T_INT) { |
1943 if(idx.result()->type() == T_INT) { |
1916 __ convert(Bytecodes::_i2l, idx.result(), index_op); |
1944 __ convert(Bytecodes::_i2l, idx.result(), index_op); |
1917 } else { |
1945 } else { |
1918 #endif |
1946 #endif |
|
1947 // TODO: ARM also allows embedded shift in the address |
1919 __ move(idx.result(), index_op); |
1948 __ move(idx.result(), index_op); |
1920 #ifdef _LP64 |
1949 #ifdef _LP64 |
1921 } |
1950 } |
1922 #endif |
1951 #endif |
1923 __ shift_left(index_op, log2_scale, index_op); |
1952 __ shift_left(index_op, log2_scale, index_op); |
2202 __ move(src, dest); |
2231 __ move(src, dest); |
2203 |
2232 |
2204 // Assign new location to Local instruction for this local |
2233 // Assign new location to Local instruction for this local |
2205 Local* local = x->state()->local_at(java_index)->as_Local(); |
2234 Local* local = x->state()->local_at(java_index)->as_Local(); |
2206 assert(local != NULL, "Locals for incoming arguments must have been created"); |
2235 assert(local != NULL, "Locals for incoming arguments must have been created"); |
|
2236 #ifndef __SOFTFP__ |
|
2237 // The java calling convention passes double as long and float as int. |
2207 assert(as_ValueType(t)->tag() == local->type()->tag(), "check"); |
2238 assert(as_ValueType(t)->tag() == local->type()->tag(), "check"); |
|
2239 #endif // __SOFTFP__ |
2208 local->set_operand(dest); |
2240 local->set_operand(dest); |
2209 _instruction_for_operand.at_put_grow(dest->vreg_number(), local, NULL); |
2241 _instruction_for_operand.at_put_grow(dest->vreg_number(), local, NULL); |
2210 java_index += type2size[t]; |
2242 java_index += type2size[t]; |
2211 } |
2243 } |
2212 |
2244 |