1368 }
1369
1370 kit.set_control(final_merge);
1371 kit.set_memory(final_mem, char_adr_idx);
1372
1373 C->record_for_igvn(final_merge);
1374 C->record_for_igvn(final_mem);
1375 }
1376 }
1377
1378
1379 Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* char_array, Node* start) {
1380 Node* string = str;
1381 Node* offset = kit.load_String_offset(kit.control(), string);
1382 Node* count = kit.load_String_length(kit.control(), string);
1383 Node* value = kit.load_String_value (kit.control(), string);
1384
1385 value = kit.shenandoah_read_barrier(value);
1386
1387 // copy the contents
1388 assert(!(ShenandoahBarrierNode::skip_through_barrier(value)->is_Con() && !value->is_Con()), "barrier prevents optimization");
1389 if (offset->is_Con() && count->is_Con() && value->is_Con() && count->get_int() < unroll_string_copy_length) {
1390 // For small constant strings just emit individual stores.
1391 // A length of 6 seems like a good space/speed tradeof.
1392 int c = count->get_int();
1393 int o = offset->get_int();
1394 const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr();
1395 ciTypeArray* value_array = t->const_oop()->as_type_array();
1396 for (int e = 0; e < c; e++) {
1397 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR),
1398 __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx,
1399 MemNode::unordered);
1400 start = __ AddI(start, __ intcon(1));
1401 }
1402 } else {
1403 Node* src_ptr = kit.array_element_address(value, offset, T_CHAR);
1404 Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR);
1405 Node* c = count;
1406 Node* extra = NULL;
1407 #ifdef _LP64
1408 c = __ ConvI2L(c);
|
1368 }
1369
1370 kit.set_control(final_merge);
1371 kit.set_memory(final_mem, char_adr_idx);
1372
1373 C->record_for_igvn(final_merge);
1374 C->record_for_igvn(final_mem);
1375 }
1376 }
1377
1378
1379 Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* char_array, Node* start) {
1380 Node* string = str;
1381 Node* offset = kit.load_String_offset(kit.control(), string);
1382 Node* count = kit.load_String_length(kit.control(), string);
1383 Node* value = kit.load_String_value (kit.control(), string);
1384
1385 value = kit.shenandoah_read_barrier(value);
1386
1387 // copy the contents
1388 if (offset->is_Con() && count->is_Con() && value->is_Con() && count->get_int() < unroll_string_copy_length) {
1389 // For small constant strings just emit individual stores.
1390 // A length of 6 seems like a good space/speed tradeof.
1391 int c = count->get_int();
1392 int o = offset->get_int();
1393 const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr();
1394 ciTypeArray* value_array = t->const_oop()->as_type_array();
1395 for (int e = 0; e < c; e++) {
1396 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR),
1397 __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx,
1398 MemNode::unordered);
1399 start = __ AddI(start, __ intcon(1));
1400 }
1401 } else {
1402 Node* src_ptr = kit.array_element_address(value, offset, T_CHAR);
1403 Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR);
1404 Node* c = count;
1405 Node* extra = NULL;
1406 #ifdef _LP64
1407 c = __ ConvI2L(c);
|