1 /* |
1 /* |
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
83 LIR_Opr LIR_OprFact::illegalOpr = LIR_OprFact::illegal(); |
83 LIR_Opr LIR_OprFact::illegalOpr = LIR_OprFact::illegal(); |
84 |
84 |
85 LIR_Opr LIR_OprFact::value_type(ValueType* type) { |
85 LIR_Opr LIR_OprFact::value_type(ValueType* type) { |
86 ValueTag tag = type->tag(); |
86 ValueTag tag = type->tag(); |
87 switch (tag) { |
87 switch (tag) { |
88 case objectTag : { |
88 case metaDataTag : { |
89 ClassConstant* c = type->as_ClassConstant(); |
89 ClassConstant* c = type->as_ClassConstant(); |
90 if (c != NULL && !c->value()->is_loaded()) { |
90 if (c != NULL && !c->value()->is_loaded()) { |
91 return LIR_OprFact::oopConst(NULL); |
91 return LIR_OprFact::metadataConst(NULL); |
92 } else { |
92 } else { |
|
93 return LIR_OprFact::metadataConst(c->value()->constant_encoding()); |
|
94 } |
|
95 } |
|
96 case objectTag : { |
93 return LIR_OprFact::oopConst(type->as_ObjectType()->encoding()); |
97 return LIR_OprFact::oopConst(type->as_ObjectType()->encoding()); |
94 } |
98 } |
95 } |
|
96 case addressTag: return LIR_OprFact::addressConst(type->as_AddressConstant()->value()); |
99 case addressTag: return LIR_OprFact::addressConst(type->as_AddressConstant()->value()); |
97 case intTag : return LIR_OprFact::intConst(type->as_IntConstant()->value()); |
100 case intTag : return LIR_OprFact::intConst(type->as_IntConstant()->value()); |
98 case floatTag : return LIR_OprFact::floatConst(type->as_FloatConstant()->value()); |
101 case floatTag : return LIR_OprFact::floatConst(type->as_FloatConstant()->value()); |
99 case longTag : return LIR_OprFact::longConst(type->as_LongConstant()->value()); |
102 case longTag : return LIR_OprFact::longConst(type->as_LongConstant()->value()); |
100 case doubleTag : return LIR_OprFact::doubleConst(type->as_DoubleConstant()->value()); |
103 case doubleTag : return LIR_OprFact::doubleConst(type->as_DoubleConstant()->value()); |
146 // be handled by the back-end or will be rejected if not. |
149 // be handled by the back-end or will be rejected if not. |
147 #endif |
150 #endif |
148 #ifdef _LP64 |
151 #ifdef _LP64 |
149 assert(base()->is_cpu_register(), "wrong base operand"); |
152 assert(base()->is_cpu_register(), "wrong base operand"); |
150 assert(index()->is_illegal() || index()->is_double_cpu(), "wrong index operand"); |
153 assert(index()->is_illegal() || index()->is_double_cpu(), "wrong index operand"); |
151 assert(base()->type() == T_OBJECT || base()->type() == T_LONG, |
154 assert(base()->type() == T_OBJECT || base()->type() == T_LONG || base()->type() == T_METADATA, |
152 "wrong type for addresses"); |
155 "wrong type for addresses"); |
153 #else |
156 #else |
154 assert(base()->is_single_cpu(), "wrong base operand"); |
157 assert(base()->is_single_cpu(), "wrong base operand"); |
155 assert(index()->is_illegal() || index()->is_single_cpu(), "wrong index operand"); |
158 assert(index()->is_illegal() || index()->is_single_cpu(), "wrong index operand"); |
156 assert(base()->type() == T_OBJECT || base()->type() == T_INT, |
159 assert(base()->type() == T_OBJECT || base()->type() == T_INT || base()->type() == T_METADATA, |
157 "wrong type for addresses"); |
160 "wrong type for addresses"); |
158 #endif |
161 #endif |
159 } |
162 } |
160 #endif |
163 #endif |
161 |
164 |
1162 |
1167 |
1163 void LIR_List::oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info) { |
1168 void LIR_List::oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info) { |
1164 append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o), reg, T_OBJECT, lir_patch_normal, info)); |
1169 append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o), reg, T_OBJECT, lir_patch_normal, info)); |
1165 } |
1170 } |
1166 |
1171 |
|
1172 void LIR_List::klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info) { |
|
1173 append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg, T_METADATA, lir_patch_normal, info)); |
|
1174 } |
1167 |
1175 |
1168 void LIR_List::load(LIR_Address* addr, LIR_Opr src, CodeEmitInfo* info, LIR_PatchCode patch_code) { |
1176 void LIR_List::load(LIR_Address* addr, LIR_Opr src, CodeEmitInfo* info, LIR_PatchCode patch_code) { |
1169 append(new LIR_Op1( |
1177 append(new LIR_Op1( |
1170 lir_move, |
1178 lir_move, |
1171 LIR_OprFact::address(addr), |
1179 LIR_OprFact::address(addr), |
1541 case T_INT: out->print("int:%d", as_jint()); break; |
1549 case T_INT: out->print("int:%d", as_jint()); break; |
1542 case T_LONG: out->print("lng:%lld", as_jlong()); break; |
1550 case T_LONG: out->print("lng:%lld", as_jlong()); break; |
1543 case T_FLOAT: out->print("flt:%f", as_jfloat()); break; |
1551 case T_FLOAT: out->print("flt:%f", as_jfloat()); break; |
1544 case T_DOUBLE: out->print("dbl:%f", as_jdouble()); break; |
1552 case T_DOUBLE: out->print("dbl:%f", as_jdouble()); break; |
1545 case T_OBJECT: out->print("obj:0x%x", as_jobject()); break; |
1553 case T_OBJECT: out->print("obj:0x%x", as_jobject()); break; |
|
1554 case T_METADATA: out->print("metadata:0x%x", as_metadata());break; |
1546 default: out->print("%3d:0x%x",type(), as_jdouble()); break; |
1555 default: out->print("%3d:0x%x",type(), as_jdouble()); break; |
1547 } |
1556 } |
1548 } |
1557 } |
1549 |
1558 |
1550 // LIR_Address |
1559 // LIR_Address |