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;
|