< prev index next >

src/hotspot/share/opto/output.cpp

Print this page




 809       // Repack the double/long as two jints.
 810       // The convention the interpreter uses is that the second local
 811       // holds the first raw word of the native double representation.
 812       // This is actually reasonable, since locals and stack arrays
 813       // grow downwards in all implementations.
 814       // (If, on some machine, the interpreter's Java locals or stack
 815       // were to grow upwards, the embedded doubles would be word-swapped.)
 816       array->append(new_loc_value( C->regalloc(), OptoReg::add(regnum,1), Location::normal ));
 817       array->append(new_loc_value( C->regalloc(),              regnum   , Location::normal ));
 818     }
 819 #endif //_LP64
 820     else if( (t->base() == Type::FloatBot || t->base() == Type::FloatCon) &&
 821              OptoReg::is_reg(regnum) ) {
 822       array->append(new_loc_value( C->regalloc(), regnum, Matcher::float_in_double()
 823                                                       ? Location::float_in_dbl : Location::normal ));
 824     } else if( t->base() == Type::Int && OptoReg::is_reg(regnum) ) {
 825       array->append(new_loc_value( C->regalloc(), regnum, Matcher::int_in_long
 826                                                       ? Location::int_in_long : Location::normal ));
 827     } else if( t->base() == Type::NarrowOop ) {
 828       array->append(new_loc_value( C->regalloc(), regnum, Location::narrowoop ));




 829     } else {
 830       array->append(new_loc_value( C->regalloc(), regnum, C->regalloc()->is_oop(local) ? Location::oop : Location::normal ));
 831     }
 832     return;
 833   }
 834 
 835   // No register.  It must be constant data.
 836   switch (t->base()) {
 837     case Type::Half:              // Second half of a double
 838       ShouldNotReachHere();       // Caller should skip 2nd halves
 839       break;
 840     case Type::AnyPtr:
 841       array->append(new ConstantOopWriteValue(NULL));
 842       break;
 843     case Type::AryPtr:
 844     case Type::InstPtr:          // fall through
 845       array->append(new ConstantOopWriteValue(t->isa_oopptr()->const_oop()->constant_encoding()));
 846       break;
 847     case Type::NarrowOop:
 848       if (t == TypeNarrowOop::NULL_PTR) {




 809       // Repack the double/long as two jints.
 810       // The convention the interpreter uses is that the second local
 811       // holds the first raw word of the native double representation.
 812       // This is actually reasonable, since locals and stack arrays
 813       // grow downwards in all implementations.
 814       // (If, on some machine, the interpreter's Java locals or stack
 815       // were to grow upwards, the embedded doubles would be word-swapped.)
 816       array->append(new_loc_value( C->regalloc(), OptoReg::add(regnum,1), Location::normal ));
 817       array->append(new_loc_value( C->regalloc(),              regnum   , Location::normal ));
 818     }
 819 #endif //_LP64
 820     else if( (t->base() == Type::FloatBot || t->base() == Type::FloatCon) &&
 821              OptoReg::is_reg(regnum) ) {
 822       array->append(new_loc_value( C->regalloc(), regnum, Matcher::float_in_double()
 823                                                       ? Location::float_in_dbl : Location::normal ));
 824     } else if( t->base() == Type::Int && OptoReg::is_reg(regnum) ) {
 825       array->append(new_loc_value( C->regalloc(), regnum, Matcher::int_in_long
 826                                                       ? Location::int_in_long : Location::normal ));
 827     } else if( t->base() == Type::NarrowOop ) {
 828       array->append(new_loc_value( C->regalloc(), regnum, Location::narrowoop ));
 829     } else if ( t->base() == Type::VectorS || t->base() == Type::VectorD ||
 830                 t->base() == Type::VectorX || t->base() == Type::VectorY ||
 831                 t->base() == Type::VectorZ) {
 832       array->append(new_loc_value( C->regalloc(), regnum, Location::vector ));
 833     } else {
 834       array->append(new_loc_value( C->regalloc(), regnum, C->regalloc()->is_oop(local) ? Location::oop : Location::normal ));
 835     }
 836     return;
 837   }
 838 
 839   // No register.  It must be constant data.
 840   switch (t->base()) {
 841     case Type::Half:              // Second half of a double
 842       ShouldNotReachHere();       // Caller should skip 2nd halves
 843       break;
 844     case Type::AnyPtr:
 845       array->append(new ConstantOopWriteValue(NULL));
 846       break;
 847     case Type::AryPtr:
 848     case Type::InstPtr:          // fall through
 849       array->append(new ConstantOopWriteValue(t->isa_oopptr()->const_oop()->constant_encoding()));
 850       break;
 851     case Type::NarrowOop:
 852       if (t == TypeNarrowOop::NULL_PTR) {


< prev index next >