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