< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page


1566   ciType* array_type = array.value()->declared_type();
1567   ciValueArrayKlass* value_array_klass = array_type->as_value_array_klass();
1568   ciValueKlass* elem_klass = value_array_klass->element_klass()->as_value_klass();
1569   int array_header_size = value_array_klass->array_header_in_bytes();
1570 
1571 #ifndef _LP64
1572   LIR_Opr index_op = index.result();
1573 #else
1574   LIR_Opr index_op = new_register(T_LONG);
1575   __ convert(Bytecodes::_i2l, index.result(), index_op);
1576 #endif
1577   // Need to shift manually, as LIR_Address can scale only up to 3.
1578   __ shift_left(index_op, value_array_klass->log2_element_size(), index_op);
1579 
1580   LIR_Opr elm_op = new_pointer_register();
1581   LIR_Address* elm_address = new LIR_Address(array.result(), index_op, array_header_size, T_ADDRESS);
1582   __ leal(LIR_OprFact::address(elm_address), elm_op);
1583 
1584   for (int i = 0; i < elem_klass->nof_nonstatic_fields(); i++) {
1585     ciField* inner_field = elem_klass->nonstatic_field_at(i);

1586     int obj_offset = inner_field->offset();
1587     int elm_offset = obj_offset - elem_klass->first_field_offset(); // object header is not stored in array.
1588 
1589     BasicType field_type = inner_field->type()->basic_type();
1590     switch (field_type) {
1591     case T_BYTE:
1592     case T_BOOLEAN:
1593     case T_SHORT:
1594     case T_CHAR:
1595      field_type = T_INT;
1596       break;
1597     default:
1598       break;
1599     }
1600 
1601     LIR_Opr temp = new_register(field_type);
1602     TempResolvedAddress* elm_resolved_addr = new TempResolvedAddress(as_ValueType(field_type), elm_op);
1603     LIRItem elm_item(elm_resolved_addr, this);
1604 
1605     DecoratorSet decorators = IN_HEAP;




1566   ciType* array_type = array.value()->declared_type();
1567   ciValueArrayKlass* value_array_klass = array_type->as_value_array_klass();
1568   ciValueKlass* elem_klass = value_array_klass->element_klass()->as_value_klass();
1569   int array_header_size = value_array_klass->array_header_in_bytes();
1570 
1571 #ifndef _LP64
1572   LIR_Opr index_op = index.result();
1573 #else
1574   LIR_Opr index_op = new_register(T_LONG);
1575   __ convert(Bytecodes::_i2l, index.result(), index_op);
1576 #endif
1577   // Need to shift manually, as LIR_Address can scale only up to 3.
1578   __ shift_left(index_op, value_array_klass->log2_element_size(), index_op);
1579 
1580   LIR_Opr elm_op = new_pointer_register();
1581   LIR_Address* elm_address = new LIR_Address(array.result(), index_op, array_header_size, T_ADDRESS);
1582   __ leal(LIR_OprFact::address(elm_address), elm_op);
1583 
1584   for (int i = 0; i < elem_klass->nof_nonstatic_fields(); i++) {
1585     ciField* inner_field = elem_klass->nonstatic_field_at(i);
1586     assert(!inner_field->is_flattened(), "flattened fields must have been expanded");
1587     int obj_offset = inner_field->offset();
1588     int elm_offset = obj_offset - elem_klass->first_field_offset(); // object header is not stored in array.
1589 
1590     BasicType field_type = inner_field->type()->basic_type();
1591     switch (field_type) {
1592     case T_BYTE:
1593     case T_BOOLEAN:
1594     case T_SHORT:
1595     case T_CHAR:
1596      field_type = T_INT;
1597       break;
1598     default:
1599       break;
1600     }
1601 
1602     LIR_Opr temp = new_register(field_type);
1603     TempResolvedAddress* elm_resolved_addr = new TempResolvedAddress(as_ValueType(field_type), elm_op);
1604     LIRItem elm_item(elm_resolved_addr, this);
1605 
1606     DecoratorSet decorators = IN_HEAP;


< prev index next >