Mercurial > hg > graal-jvmci-8
comparison src/share/vm/c1/c1_LIR.cpp @ 1681:126ea7725993
6953477: Increase portability and flexibility of building Hotspot
Summary: A collection of portability improvements including shared code support for PPC, ARM platforms, software floating point, cross compilation support and improvements in error crash detail.
Reviewed-by: phh, never, coleenp, dholmes
author | bobv |
---|---|
date | Tue, 03 Aug 2010 08:13:38 -0400 |
parents | e9ff18c4ace7 |
children | d5d065957597 |
comparison
equal
deleted
inserted
replaced
1680:a64438a2b7e8 | 1681:126ea7725993 |
---|---|
48 return FrameMap::nr2xmmreg(xmm_regnrLo()); | 48 return FrameMap::nr2xmmreg(xmm_regnrLo()); |
49 } | 49 } |
50 | 50 |
51 #endif // X86 | 51 #endif // X86 |
52 | 52 |
53 | 53 #if defined(SPARC) || defined(PPC) |
54 #ifdef SPARC | |
55 | 54 |
56 FloatRegister LIR_OprDesc::as_float_reg() const { | 55 FloatRegister LIR_OprDesc::as_float_reg() const { |
57 return FrameMap::nr2floatreg(fpu_regnr()); | 56 return FrameMap::nr2floatreg(fpu_regnr()); |
58 } | 57 } |
59 | 58 |
60 FloatRegister LIR_OprDesc::as_double_reg() const { | 59 FloatRegister LIR_OprDesc::as_double_reg() const { |
61 return FrameMap::nr2floatreg(fpu_regnrHi()); | 60 return FrameMap::nr2floatreg(fpu_regnrHi()); |
62 } | 61 } |
63 | 62 |
64 #endif | 63 #endif |
64 | |
65 #ifdef ARM | |
66 | |
67 FloatRegister LIR_OprDesc::as_float_reg() const { | |
68 return as_FloatRegister(fpu_regnr()); | |
69 } | |
70 | |
71 FloatRegister LIR_OprDesc::as_double_reg() const { | |
72 return as_FloatRegister(fpu_regnrLo()); | |
73 } | |
74 | |
75 #endif | |
76 | |
65 | 77 |
66 LIR_Opr LIR_OprFact::illegalOpr = LIR_OprFact::illegal(); | 78 LIR_Opr LIR_OprFact::illegalOpr = LIR_OprFact::illegal(); |
67 | 79 |
68 LIR_Opr LIR_OprFact::value_type(ValueType* type) { | 80 LIR_Opr LIR_OprFact::value_type(ValueType* type) { |
69 ValueTag tag = type->tag(); | 81 ValueTag tag = type->tag(); |
117 } | 129 } |
118 | 130 |
119 | 131 |
120 #ifndef PRODUCT | 132 #ifndef PRODUCT |
121 void LIR_Address::verify() const { | 133 void LIR_Address::verify() const { |
122 #ifdef SPARC | 134 #if defined(SPARC) || defined(PPC) |
123 assert(scale() == times_1, "Scaled addressing mode not available on SPARC and should not be used"); | 135 assert(scale() == times_1, "Scaled addressing mode not available on SPARC/PPC and should not be used"); |
124 assert(disp() == 0 || index()->is_illegal(), "can't have both"); | 136 assert(disp() == 0 || index()->is_illegal(), "can't have both"); |
137 #endif | |
138 #ifdef ARM | |
139 assert(disp() == 0 || index()->is_illegal(), "can't have both"); | |
140 assert(-4096 < disp() && disp() < 4096, "architecture constraint"); | |
125 #endif | 141 #endif |
126 #ifdef _LP64 | 142 #ifdef _LP64 |
127 assert(base()->is_cpu_register(), "wrong base operand"); | 143 assert(base()->is_cpu_register(), "wrong base operand"); |
128 assert(index()->is_illegal() || index()->is_double_cpu(), "wrong index operand"); | 144 assert(index()->is_illegal() || index()->is_double_cpu(), "wrong index operand"); |
129 assert(base()->type() == T_OBJECT || base()->type() == T_LONG, | 145 assert(base()->type() == T_OBJECT || base()->type() == T_LONG, |
171 | 187 |
172 #ifdef ASSERT | 188 #ifdef ASSERT |
173 if (!is_pointer() && !is_illegal()) { | 189 if (!is_pointer() && !is_illegal()) { |
174 switch (as_BasicType(type_field())) { | 190 switch (as_BasicType(type_field())) { |
175 case T_LONG: | 191 case T_LONG: |
176 assert((kind_field() == cpu_register || kind_field() == stack_value) && size_field() == double_size, "must match"); | 192 assert((kind_field() == cpu_register || kind_field() == stack_value) && |
193 size_field() == double_size, "must match"); | |
177 break; | 194 break; |
178 case T_FLOAT: | 195 case T_FLOAT: |
179 assert((kind_field() == fpu_register || kind_field() == stack_value) && size_field() == single_size, "must match"); | 196 // FP return values can be also in CPU registers on ARM and PPC (softfp ABI) |
197 assert((kind_field() == fpu_register || kind_field() == stack_value | |
198 ARM_ONLY(|| kind_field() == cpu_register) | |
199 PPC_ONLY(|| kind_field() == cpu_register) ) && | |
200 size_field() == single_size, "must match"); | |
180 break; | 201 break; |
181 case T_DOUBLE: | 202 case T_DOUBLE: |
182 assert((kind_field() == fpu_register || kind_field() == stack_value) && size_field() == double_size, "must match"); | 203 // FP return values can be also in CPU registers on ARM and PPC (softfp ABI) |
204 assert((kind_field() == fpu_register || kind_field() == stack_value | |
205 ARM_ONLY(|| kind_field() == cpu_register) | |
206 PPC_ONLY(|| kind_field() == cpu_register) ) && | |
207 size_field() == double_size, "must match"); | |
183 break; | 208 break; |
184 case T_BOOLEAN: | 209 case T_BOOLEAN: |
185 case T_CHAR: | 210 case T_CHAR: |
186 case T_BYTE: | 211 case T_BYTE: |
187 case T_SHORT: | 212 case T_SHORT: |
188 case T_INT: | 213 case T_INT: |
189 case T_OBJECT: | 214 case T_OBJECT: |
190 case T_ARRAY: | 215 case T_ARRAY: |
191 assert((kind_field() == cpu_register || kind_field() == stack_value) && size_field() == single_size, "must match"); | 216 assert((kind_field() == cpu_register || kind_field() == stack_value) && |
217 size_field() == single_size, "must match"); | |
192 break; | 218 break; |
193 | 219 |
194 case T_ILLEGAL: | 220 case T_ILLEGAL: |
195 // XXX TKR also means unknown right now | 221 // XXX TKR also means unknown right now |
196 // assert(is_illegal(), "must match"); | 222 // assert(is_illegal(), "must match"); |
501 LIR_OpConvert* opConvert = (LIR_OpConvert*)op; | 527 LIR_OpConvert* opConvert = (LIR_OpConvert*)op; |
502 | 528 |
503 assert(opConvert->_info == NULL, "must be"); | 529 assert(opConvert->_info == NULL, "must be"); |
504 if (opConvert->_opr->is_valid()) do_input(opConvert->_opr); | 530 if (opConvert->_opr->is_valid()) do_input(opConvert->_opr); |
505 if (opConvert->_result->is_valid()) do_output(opConvert->_result); | 531 if (opConvert->_result->is_valid()) do_output(opConvert->_result); |
532 #ifdef PPC | |
533 if (opConvert->_tmp1->is_valid()) do_temp(opConvert->_tmp1); | |
534 if (opConvert->_tmp2->is_valid()) do_temp(opConvert->_tmp2); | |
535 #endif | |
506 do_stub(opConvert->_stub); | 536 do_stub(opConvert->_stub); |
507 | 537 |
508 break; | 538 break; |
509 } | 539 } |
510 | 540 |
528 { | 558 { |
529 assert(op->as_OpAllocObj() != NULL, "must be"); | 559 assert(op->as_OpAllocObj() != NULL, "must be"); |
530 LIR_OpAllocObj* opAllocObj = (LIR_OpAllocObj*)op; | 560 LIR_OpAllocObj* opAllocObj = (LIR_OpAllocObj*)op; |
531 | 561 |
532 if (opAllocObj->_info) do_info(opAllocObj->_info); | 562 if (opAllocObj->_info) do_info(opAllocObj->_info); |
533 if (opAllocObj->_opr->is_valid()) do_input(opAllocObj->_opr); | 563 if (opAllocObj->_opr->is_valid()) { do_input(opAllocObj->_opr); |
564 do_temp(opAllocObj->_opr); | |
565 } | |
534 if (opAllocObj->_tmp1->is_valid()) do_temp(opAllocObj->_tmp1); | 566 if (opAllocObj->_tmp1->is_valid()) do_temp(opAllocObj->_tmp1); |
535 if (opAllocObj->_tmp2->is_valid()) do_temp(opAllocObj->_tmp2); | 567 if (opAllocObj->_tmp2->is_valid()) do_temp(opAllocObj->_tmp2); |
536 if (opAllocObj->_tmp3->is_valid()) do_temp(opAllocObj->_tmp3); | 568 if (opAllocObj->_tmp3->is_valid()) do_temp(opAllocObj->_tmp3); |
537 if (opAllocObj->_tmp4->is_valid()) do_temp(opAllocObj->_tmp4); | 569 if (opAllocObj->_tmp4->is_valid()) do_temp(opAllocObj->_tmp4); |
538 if (opAllocObj->_result->is_valid()) do_output(opAllocObj->_result); | 570 if (opAllocObj->_result->is_valid()) do_output(opAllocObj->_result); |
824 case lir_cas_obj: | 856 case lir_cas_obj: |
825 case lir_cas_int: { | 857 case lir_cas_int: { |
826 assert(op->as_OpCompareAndSwap() != NULL, "must be"); | 858 assert(op->as_OpCompareAndSwap() != NULL, "must be"); |
827 LIR_OpCompareAndSwap* opCompareAndSwap = (LIR_OpCompareAndSwap*)op; | 859 LIR_OpCompareAndSwap* opCompareAndSwap = (LIR_OpCompareAndSwap*)op; |
828 | 860 |
861 assert(opCompareAndSwap->_addr->is_valid(), "used"); | |
862 assert(opCompareAndSwap->_cmp_value->is_valid(), "used"); | |
863 assert(opCompareAndSwap->_new_value->is_valid(), "used"); | |
829 if (opCompareAndSwap->_info) do_info(opCompareAndSwap->_info); | 864 if (opCompareAndSwap->_info) do_info(opCompareAndSwap->_info); |
830 if (opCompareAndSwap->_addr->is_valid()) do_input(opCompareAndSwap->_addr); | 865 do_input(opCompareAndSwap->_addr); |
831 if (opCompareAndSwap->_cmp_value->is_valid()) do_input(opCompareAndSwap->_cmp_value); | 866 do_temp(opCompareAndSwap->_addr); |
832 if (opCompareAndSwap->_new_value->is_valid()) do_input(opCompareAndSwap->_new_value); | 867 do_input(opCompareAndSwap->_cmp_value); |
868 do_temp(opCompareAndSwap->_cmp_value); | |
869 do_input(opCompareAndSwap->_new_value); | |
870 do_temp(opCompareAndSwap->_new_value); | |
833 if (opCompareAndSwap->_tmp1->is_valid()) do_temp(opCompareAndSwap->_tmp1); | 871 if (opCompareAndSwap->_tmp1->is_valid()) do_temp(opCompareAndSwap->_tmp1); |
834 if (opCompareAndSwap->_tmp2->is_valid()) do_temp(opCompareAndSwap->_tmp2); | 872 if (opCompareAndSwap->_tmp2->is_valid()) do_temp(opCompareAndSwap->_tmp2); |
835 if (opCompareAndSwap->_result->is_valid()) do_output(opCompareAndSwap->_result); | 873 if (opCompareAndSwap->_result->is_valid()) do_output(opCompareAndSwap->_result); |
836 | 874 |
837 break; | 875 break; |
1301 scratch, | 1339 scratch, |
1302 stub, | 1340 stub, |
1303 info)); | 1341 info)); |
1304 } | 1342 } |
1305 | 1343 |
1306 void LIR_List::unlock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, CodeStub* stub) { | 1344 void LIR_List::unlock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub) { |
1307 append(new LIR_OpLock( | 1345 append(new LIR_OpLock( |
1308 lir_unlock, | 1346 lir_unlock, |
1309 hdr, | 1347 hdr, |
1310 obj, | 1348 obj, |
1311 lock, | 1349 lock, |
1312 LIR_OprFact::illegalOpr, | 1350 scratch, |
1313 stub, | 1351 stub, |
1314 NULL)); | 1352 NULL)); |
1315 } | 1353 } |
1316 | 1354 |
1317 | 1355 |
1340 void LIR_List::store_check(LIR_Opr object, LIR_Opr array, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception) { | 1378 void LIR_List::store_check(LIR_Opr object, LIR_Opr array, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception) { |
1341 append(new LIR_OpTypeCheck(lir_store_check, object, array, tmp1, tmp2, tmp3, info_for_exception, NULL, 0)); | 1379 append(new LIR_OpTypeCheck(lir_store_check, object, array, tmp1, tmp2, tmp3, info_for_exception, NULL, 0)); |
1342 } | 1380 } |
1343 | 1381 |
1344 | 1382 |
1345 void LIR_List::cas_long(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value, LIR_Opr t1, LIR_Opr t2) { | 1383 void LIR_List::cas_long(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value, |
1346 // Compare and swap produces condition code "zero" if contents_of(addr) == cmp_value, | 1384 LIR_Opr t1, LIR_Opr t2, LIR_Opr result) { |
1347 // implying successful swap of new_value into addr | 1385 append(new LIR_OpCompareAndSwap(lir_cas_long, addr, cmp_value, new_value, t1, t2, result)); |
1348 append(new LIR_OpCompareAndSwap(lir_cas_long, addr, cmp_value, new_value, t1, t2)); | 1386 } |
1349 } | 1387 |
1350 | 1388 void LIR_List::cas_obj(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value, |
1351 void LIR_List::cas_obj(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value, LIR_Opr t1, LIR_Opr t2) { | 1389 LIR_Opr t1, LIR_Opr t2, LIR_Opr result) { |
1352 // Compare and swap produces condition code "zero" if contents_of(addr) == cmp_value, | 1390 append(new LIR_OpCompareAndSwap(lir_cas_obj, addr, cmp_value, new_value, t1, t2, result)); |
1353 // implying successful swap of new_value into addr | 1391 } |
1354 append(new LIR_OpCompareAndSwap(lir_cas_obj, addr, cmp_value, new_value, t1, t2)); | 1392 |
1355 } | 1393 void LIR_List::cas_int(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value, |
1356 | 1394 LIR_Opr t1, LIR_Opr t2, LIR_Opr result) { |
1357 void LIR_List::cas_int(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value, LIR_Opr t1, LIR_Opr t2) { | 1395 append(new LIR_OpCompareAndSwap(lir_cas_int, addr, cmp_value, new_value, t1, t2, result)); |
1358 // Compare and swap produces condition code "zero" if contents_of(addr) == cmp_value, | |
1359 // implying successful swap of new_value into addr | |
1360 append(new LIR_OpCompareAndSwap(lir_cas_int, addr, cmp_value, new_value, t1, t2)); | |
1361 } | 1396 } |
1362 | 1397 |
1363 | 1398 |
1364 #ifdef PRODUCT | 1399 #ifdef PRODUCT |
1365 | 1400 |
1398 out->print(as_xmm_double_reg()->name()); | 1433 out->print(as_xmm_double_reg()->name()); |
1399 } else if (is_single_fpu()) { | 1434 } else if (is_single_fpu()) { |
1400 out->print("fpu%d", fpu_regnr()); | 1435 out->print("fpu%d", fpu_regnr()); |
1401 } else if (is_double_fpu()) { | 1436 } else if (is_double_fpu()) { |
1402 out->print("fpu%d", fpu_regnrLo()); | 1437 out->print("fpu%d", fpu_regnrLo()); |
1438 #elif defined(ARM) | |
1439 } else if (is_single_fpu()) { | |
1440 out->print("s%d", fpu_regnr()); | |
1441 } else if (is_double_fpu()) { | |
1442 out->print("d%d", fpu_regnrLo() >> 1); | |
1403 #else | 1443 #else |
1404 } else if (is_single_fpu()) { | 1444 } else if (is_single_fpu()) { |
1405 out->print(as_float_reg()->name()); | 1445 out->print(as_float_reg()->name()); |
1406 } else if (is_double_fpu()) { | 1446 } else if (is_double_fpu()) { |
1407 out->print(as_double_reg()->name()); | 1447 out->print(as_double_reg()->name()); |
1754 // LIR_OpConvert | 1794 // LIR_OpConvert |
1755 void LIR_OpConvert::print_instr(outputStream* out) const { | 1795 void LIR_OpConvert::print_instr(outputStream* out) const { |
1756 print_bytecode(out, bytecode()); | 1796 print_bytecode(out, bytecode()); |
1757 in_opr()->print(out); out->print(" "); | 1797 in_opr()->print(out); out->print(" "); |
1758 result_opr()->print(out); out->print(" "); | 1798 result_opr()->print(out); out->print(" "); |
1799 #ifdef PPC | |
1800 if(tmp1()->is_valid()) { | |
1801 tmp1()->print(out); out->print(" "); | |
1802 tmp2()->print(out); out->print(" "); | |
1803 } | |
1804 #endif | |
1759 } | 1805 } |
1760 | 1806 |
1761 void LIR_OpConvert::print_bytecode(outputStream* out, Bytecodes::Code code) { | 1807 void LIR_OpConvert::print_bytecode(outputStream* out, Bytecodes::Code code) { |
1762 switch(code) { | 1808 switch(code) { |
1763 case Bytecodes::_d2f: out->print("[d2f] "); break; | 1809 case Bytecodes::_d2f: out->print("[d2f] "); break; |