hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
changeset 6176 4d9030fe341f
parent 5707 6c66849ed24e
child 6453 970dc585ab63
equal deleted inserted replaced
6175:86dbf3cacacc 6176:4d9030fe341f
    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 {
  1413   } else {
  1438   } else {
  1414     __ move(LIR_OprFact::intConst(0),
  1439     __ move(LIR_OprFact::intConst(0),
  1415               new LIR_Address(tmp, load_constant(card_table_base),
  1440               new LIR_Address(tmp, load_constant(card_table_base),
  1416                               T_BYTE));
  1441                               T_BYTE));
  1417   }
  1442   }
       
  1443 #endif // ARM
  1418 }
  1444 }
  1419 
  1445 
  1420 
  1446 
  1421 //------------------------field access--------------------------------------
  1447 //------------------------field access--------------------------------------
  1422 
  1448 
  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