Mercurial > hg > truffle
comparison src/share/vm/opto/stringopts.cpp @ 14429:2113136690bc
8024921: PPC64 (part 113): Extend Load and Store nodes to know about memory ordering
Summary: Add a field to C2 LoadNode and StoreNode classes which indicates whether the load/store should do an acquire/release on platforms which support it.
Reviewed-by: kvn
author | goetz |
---|---|
date | Fri, 15 Nov 2013 11:05:32 -0800 |
parents | 90abdd727e64 |
children | 4ca6dc0799b6 |
comparison
equal
deleted
inserted
replaced
14427:eb178e97560c | 14429:2113136690bc |
---|---|
1120 type = Type::get_const_basic_type(bt); | 1120 type = Type::get_const_basic_type(bt); |
1121 } | 1121 } |
1122 | 1122 |
1123 return kit.make_load(NULL, kit.basic_plus_adr(klass_node, field->offset_in_bytes()), | 1123 return kit.make_load(NULL, kit.basic_plus_adr(klass_node, field->offset_in_bytes()), |
1124 type, T_OBJECT, | 1124 type, T_OBJECT, |
1125 C->get_alias_index(mirror_type->add_offset(field->offset_in_bytes()))); | 1125 C->get_alias_index(mirror_type->add_offset(field->offset_in_bytes())), |
1126 MemNode::unordered); | |
1126 } | 1127 } |
1127 | 1128 |
1128 Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) { | 1129 Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) { |
1129 RegionNode *final_merge = new (C) RegionNode(3); | 1130 RegionNode *final_merge = new (C) RegionNode(3); |
1130 kit.gvn().set_type(final_merge, Type::CONTROL); | 1131 kit.gvn().set_type(final_merge, Type::CONTROL); |
1312 __ LShiftI(q, __ intcon(1)))); | 1313 __ LShiftI(q, __ intcon(1)))); |
1313 Node* m1 = __ SubI(charPos, __ intcon(1)); | 1314 Node* m1 = __ SubI(charPos, __ intcon(1)); |
1314 Node* ch = __ AddI(r, __ intcon('0')); | 1315 Node* ch = __ AddI(r, __ intcon('0')); |
1315 | 1316 |
1316 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), | 1317 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), |
1317 ch, T_CHAR, char_adr_idx); | 1318 ch, T_CHAR, char_adr_idx, MemNode::unordered); |
1318 | 1319 |
1319 | 1320 |
1320 IfNode* iff = kit.create_and_map_if(head, __ Bool(__ CmpI(q, __ intcon(0)), BoolTest::ne), | 1321 IfNode* iff = kit.create_and_map_if(head, __ Bool(__ CmpI(q, __ intcon(0)), BoolTest::ne), |
1321 PROB_FAIR, COUNT_UNKNOWN); | 1322 PROB_FAIR, COUNT_UNKNOWN); |
1322 Node* ne = __ IfTrue(iff); | 1323 Node* ne = __ IfTrue(iff); |
1354 final_merge->init_req(1, C->top()); | 1355 final_merge->init_req(1, C->top()); |
1355 final_mem->init_req(1, C->top()); | 1356 final_mem->init_req(1, C->top()); |
1356 } else { | 1357 } else { |
1357 Node* m1 = __ SubI(charPos, __ intcon(1)); | 1358 Node* m1 = __ SubI(charPos, __ intcon(1)); |
1358 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), | 1359 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), |
1359 sign, T_CHAR, char_adr_idx); | 1360 sign, T_CHAR, char_adr_idx, MemNode::unordered); |
1360 | 1361 |
1361 final_merge->init_req(1, kit.control()); | 1362 final_merge->init_req(1, kit.control()); |
1362 final_mem->init_req(1, st); | 1363 final_mem->init_req(1, st); |
1363 } | 1364 } |
1364 | 1365 |
1385 int o = offset->get_int(); | 1386 int o = offset->get_int(); |
1386 const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr(); | 1387 const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr(); |
1387 ciTypeArray* value_array = t->const_oop()->as_type_array(); | 1388 ciTypeArray* value_array = t->const_oop()->as_type_array(); |
1388 for (int e = 0; e < c; e++) { | 1389 for (int e = 0; e < c; e++) { |
1389 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), | 1390 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), |
1390 __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx); | 1391 __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx, |
1392 MemNode::unordered); | |
1391 start = __ AddI(start, __ intcon(1)); | 1393 start = __ AddI(start, __ intcon(1)); |
1392 } | 1394 } |
1393 } else { | 1395 } else { |
1394 Node* src_ptr = kit.array_element_address(value, offset, T_CHAR); | 1396 Node* src_ptr = kit.array_element_address(value, offset, T_CHAR); |
1395 Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR); | 1397 Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR); |
1605 start = copy_string(kit, arg, char_array, start); | 1607 start = copy_string(kit, arg, char_array, start); |
1606 break; | 1608 break; |
1607 } | 1609 } |
1608 case StringConcat::CharMode: { | 1610 case StringConcat::CharMode: { |
1609 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), | 1611 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), |
1610 arg, T_CHAR, char_adr_idx); | 1612 arg, T_CHAR, char_adr_idx, MemNode::unordered); |
1611 start = __ AddI(start, __ intcon(1)); | 1613 start = __ AddI(start, __ intcon(1)); |
1612 break; | 1614 break; |
1613 } | 1615 } |
1614 default: | 1616 default: |
1615 ShouldNotReachHere(); | 1617 ShouldNotReachHere(); |