comparison src/share/vm/shark/sharkBlock.cpp @ 7212:291ffc492eb6

Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author Doug Simon <doug.simon@oracle.com>
date Fri, 14 Dec 2012 14:35:13 +0100
parents 2cd5e15048e6
children f9bda35f4226
comparison
equal deleted inserted replaced
7163:2ed8d74e5984 7212:291ffc492eb6
168 push(SharkValue::jint_constant(iter()->get_constant_u2())); 168 push(SharkValue::jint_constant(iter()->get_constant_u2()));
169 break; 169 break;
170 170
171 case Bytecodes::_ldc: 171 case Bytecodes::_ldc:
172 case Bytecodes::_ldc_w: 172 case Bytecodes::_ldc_w:
173 case Bytecodes::_ldc2_w: 173 case Bytecodes::_ldc2_w: {
174 push(SharkConstant::for_ldc(iter())->value(builder())); 174 SharkConstant* constant = SharkConstant::for_ldc(iter());
175 break; 175 assert(constant->is_loaded(), "trap should handle unloaded classes");
176 176 push(constant->value(builder()));
177 break;
178 }
177 case Bytecodes::_iload_0: 179 case Bytecodes::_iload_0:
178 case Bytecodes::_lload_0: 180 case Bytecodes::_lload_0:
179 case Bytecodes::_fload_0: 181 case Bytecodes::_fload_0:
180 case Bytecodes::_dload_0: 182 case Bytecodes::_dload_0:
181 case Bytecodes::_aload_0: 183 case Bytecodes::_aload_0:
998 builder()->CreateBr(done); 1000 builder()->CreateBr(done);
999 1001
1000 builder()->SetInsertPoint(done); 1002 builder()->SetInsertPoint(done);
1001 PHINode *result; 1003 PHINode *result;
1002 if (is_long) 1004 if (is_long)
1003 result = builder()->CreatePHI(SharkType::jlong_type(), "result"); 1005 result = builder()->CreatePHI(SharkType::jlong_type(), 0, "result");
1004 else 1006 else
1005 result = builder()->CreatePHI(SharkType::jint_type(), "result"); 1007 result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
1006 result->addIncoming(special_result, special_case); 1008 result->addIncoming(special_result, special_case);
1007 result->addIncoming(general_result, general_case); 1009 result->addIncoming(general_result, general_case);
1008 1010
1009 if (is_long) 1011 if (is_long)
1010 push(SharkValue::create_jlong(result, false)); 1012 push(SharkValue::create_jlong(result, false));
1034 SharkConstant *constant = SharkConstant::for_field(iter()); 1036 SharkConstant *constant = SharkConstant::for_field(iter());
1035 if (constant->is_loaded()) 1037 if (constant->is_loaded())
1036 value = constant->value(builder()); 1038 value = constant->value(builder());
1037 } 1039 }
1038 if (!is_get || value == NULL) { 1040 if (!is_get || value == NULL) {
1039 if (!is_field) 1041 if (!is_field) {
1040 object = builder()->CreateInlineOop(field->holder()); 1042 object = builder()->CreateInlineOop(field->holder()->java_mirror());
1041 1043 }
1042 BasicType basic_type = field->type()->basic_type(); 1044 BasicType basic_type = field->type()->basic_type();
1043 const Type *stack_type = SharkType::to_stackType(basic_type); 1045 Type *stack_type = SharkType::to_stackType(basic_type);
1044 const Type *field_type = SharkType::to_arrayType(basic_type); 1046 Type *field_type = SharkType::to_arrayType(basic_type);
1045 1047
1046 Value *addr = builder()->CreateAddressOfStructEntry( 1048 Value *addr = builder()->CreateAddressOfStructEntry(
1047 object, in_ByteSize(field->offset_in_bytes()), 1049 object, in_ByteSize(field->offset_in_bytes()),
1048 PointerType::getUnqual(field_type), 1050 PointerType::getUnqual(field_type),
1049 "addr"); 1051 "addr");
1050 1052
1051 // Do the access 1053 // Do the access
1052 if (is_get) { 1054 if (is_get) {
1053 Value *field_value = builder()->CreateLoad(addr); 1055 Value* field_value;
1054 1056 if (field->is_volatile()) {
1057 field_value = builder()->CreateAtomicLoad(addr);
1058 } else {
1059 field_value = builder()->CreateLoad(addr);
1060 }
1055 if (field_type != stack_type) { 1061 if (field_type != stack_type) {
1056 field_value = builder()->CreateIntCast( 1062 field_value = builder()->CreateIntCast(
1057 field_value, stack_type, basic_type != T_CHAR); 1063 field_value, stack_type, basic_type != T_CHAR);
1058 } 1064 }
1059 1065
1065 if (field_type != stack_type) { 1071 if (field_type != stack_type) {
1066 field_value = builder()->CreateIntCast( 1072 field_value = builder()->CreateIntCast(
1067 field_value, field_type, basic_type != T_CHAR); 1073 field_value, field_type, basic_type != T_CHAR);
1068 } 1074 }
1069 1075
1070 builder()->CreateStore(field_value, addr); 1076 if (field->is_volatile()) {
1071 1077 builder()->CreateAtomicStore(field_value, addr);
1072 if (!field->type()->is_primitive_type()) 1078 } else {
1079 builder()->CreateStore(field_value, addr);
1080 }
1081
1082 if (!field->type()->is_primitive_type()) {
1073 builder()->CreateUpdateBarrierSet(oopDesc::bs(), addr); 1083 builder()->CreateUpdateBarrierSet(oopDesc::bs(), addr);
1074 1084 }
1075 if (field->is_volatile())
1076 builder()->CreateMemoryBarrier(SharkBuilder::BARRIER_STORELOAD);
1077 } 1085 }
1078 } 1086 }
1079 1087
1080 // Push the value onto the stack where necessary 1088 // Push the value onto the stack where necessary
1081 if (is_get) 1089 if (is_get)
1103 1111
1104 builder()->SetInsertPoint(gt); 1112 builder()->SetInsertPoint(gt);
1105 builder()->CreateBr(done); 1113 builder()->CreateBr(done);
1106 1114
1107 builder()->SetInsertPoint(done); 1115 builder()->SetInsertPoint(done);
1108 PHINode *result = builder()->CreatePHI(SharkType::jint_type(), "result"); 1116 PHINode *result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
1109 result->addIncoming(LLVMValue::jint_constant(-1), lt); 1117 result->addIncoming(LLVMValue::jint_constant(-1), lt);
1110 result->addIncoming(LLVMValue::jint_constant(0), eq); 1118 result->addIncoming(LLVMValue::jint_constant(0), eq);
1111 result->addIncoming(LLVMValue::jint_constant(1), gt); 1119 result->addIncoming(LLVMValue::jint_constant(1), gt);
1112 1120
1113 push(SharkValue::create_jint(result, false)); 1121 push(SharkValue::create_jint(result, false));
1150 1158
1151 builder()->SetInsertPoint(eq); 1159 builder()->SetInsertPoint(eq);
1152 builder()->CreateBr(done); 1160 builder()->CreateBr(done);
1153 1161
1154 builder()->SetInsertPoint(done); 1162 builder()->SetInsertPoint(done);
1155 PHINode *result = builder()->CreatePHI(SharkType::jint_type(), "result"); 1163 PHINode *result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
1156 result->addIncoming(LLVMValue::jint_constant(-1), lt); 1164 result->addIncoming(LLVMValue::jint_constant(-1), lt);
1157 result->addIncoming(LLVMValue::jint_constant(0), eq); 1165 result->addIncoming(LLVMValue::jint_constant(0), eq);
1158 result->addIncoming(LLVMValue::jint_constant(1), gt); 1166 result->addIncoming(LLVMValue::jint_constant(1), gt);
1159 1167
1160 push(SharkValue::create_jint(result, false)); 1168 push(SharkValue::create_jint(result, false));