< prev index next >

src/share/vm/opto/matcher.cpp

Print this page




 174 RegMask* Matcher::return_values_mask(const TypeTuple *range) {
 175   uint cnt = range->cnt() - TypeFunc::Parms;
 176   if (cnt == 0) {
 177     return NULL;
 178   }
 179   RegMask* mask = NEW_RESOURCE_ARRAY(RegMask, cnt);
 180 
 181   if (!ValueTypeReturnedAsFields) {
 182     // Get ideal-register return type
 183     uint ireg = range->field_at(TypeFunc::Parms)->ideal_reg();
 184     // Get machine return register
 185     OptoRegPair regs = return_value(ireg, false);
 186 
 187     // And mask for same
 188     mask[0].Clear();
 189     mask[0].Insert(regs.first());
 190     if (OptoReg::is_valid(regs.second())) {
 191       mask[0].Insert(regs.second());
 192     }
 193   } else {
 194     BasicType *sig_bt = NEW_RESOURCE_ARRAY(BasicType, cnt);
 195     VMRegPair *vm_parm_regs = NEW_RESOURCE_ARRAY(VMRegPair, cnt);
 196 
 197     for (uint i = 0; i < cnt; i++) {
 198       sig_bt[i] = range->field_at(i+TypeFunc::Parms)->basic_type();
 199     }
 200 
 201     int regs = SharedRuntime::java_return_convention(sig_bt, vm_parm_regs, cnt);
 202     assert(regs > 0, "should have been tested during graph construction");
 203     for (uint i = 0; i < cnt; i++) {
 204       mask[i].Clear();
 205 
 206       OptoReg::Name reg1 = OptoReg::as_OptoReg(vm_parm_regs[i].first());
 207       if (OptoReg::is_valid(reg1)) {
 208         mask[i].Insert(reg1);
 209       }
 210       OptoReg::Name reg2 = OptoReg::as_OptoReg(vm_parm_regs[i].second());
 211       if (OptoReg::is_valid(reg2)) {
 212         mask[i].Insert(reg2);
 213       }
 214     }
 215   }




 174 RegMask* Matcher::return_values_mask(const TypeTuple *range) {
 175   uint cnt = range->cnt() - TypeFunc::Parms;
 176   if (cnt == 0) {
 177     return NULL;
 178   }
 179   RegMask* mask = NEW_RESOURCE_ARRAY(RegMask, cnt);
 180 
 181   if (!ValueTypeReturnedAsFields) {
 182     // Get ideal-register return type
 183     uint ireg = range->field_at(TypeFunc::Parms)->ideal_reg();
 184     // Get machine return register
 185     OptoRegPair regs = return_value(ireg, false);
 186 
 187     // And mask for same
 188     mask[0].Clear();
 189     mask[0].Insert(regs.first());
 190     if (OptoReg::is_valid(regs.second())) {
 191       mask[0].Insert(regs.second());
 192     }
 193   } else {
 194     BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, cnt);
 195     VMRegPair* vm_parm_regs = NEW_RESOURCE_ARRAY(VMRegPair, cnt);
 196 
 197     for (uint i = 0; i < cnt; i++) {
 198       sig_bt[i] = range->field_at(i+TypeFunc::Parms)->basic_type();
 199     }
 200 
 201     int regs = SharedRuntime::java_return_convention(sig_bt, vm_parm_regs, cnt);
 202     assert(regs > 0, "should have been tested during graph construction");
 203     for (uint i = 0; i < cnt; i++) {
 204       mask[i].Clear();
 205 
 206       OptoReg::Name reg1 = OptoReg::as_OptoReg(vm_parm_regs[i].first());
 207       if (OptoReg::is_valid(reg1)) {
 208         mask[i].Insert(reg1);
 209       }
 210       OptoReg::Name reg2 = OptoReg::as_OptoReg(vm_parm_regs[i].second());
 211       if (OptoReg::is_valid(reg2)) {
 212         mask[i].Insert(reg2);
 213       }
 214     }
 215   }


< prev index next >