1276
1277 kit.gvn().set_type(head, Type::CONTROL);
1278 Node* i_phi = new PhiNode(head, TypeInt::INT);
1279 i_phi->init_req(1, i);
1280 kit.gvn().set_type(i_phi, TypeInt::INT);
1281 Node* charPos = new PhiNode(head, TypeInt::INT);
1282 charPos->init_req(1, end);
1283 kit.gvn().set_type(charPos, TypeInt::INT);
1284 Node* mem = PhiNode::make(head, kit.memory(byte_adr_idx), Type::MEMORY, TypeAryPtr::BYTES);
1285 kit.gvn().set_type(mem, Type::MEMORY);
1286
1287 kit.set_control(head);
1288 kit.set_memory(mem, byte_adr_idx);
1289
1290 Node* q = __ DivI(kit.null(), i_phi, __ intcon(10));
1291 Node* r = __ SubI(i_phi, __ AddI(__ LShiftI(q, __ intcon(3)),
1292 __ LShiftI(q, __ intcon(1))));
1293 Node* index = __ SubI(charPos, __ intcon((bt == T_BYTE) ? 1 : 2));
1294 Node* ch = __ AddI(r, __ intcon('0'));
1295 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(dst_array, index, T_BYTE),
1296 ch, bt, byte_adr_idx, MemNode::unordered);
1297
1298 iff = kit.create_and_map_if(head, __ Bool(__ CmpI(q, __ intcon(0)), BoolTest::ne),
1299 PROB_FAIR, COUNT_UNKNOWN);
1300 Node* ne = __ IfTrue(iff);
1301 Node* eq = __ IfFalse(iff);
1302
1303 head->init_req(2, ne);
1304 mem->init_req(2, st);
1305
1306 i_phi->init_req(2, q);
1307 charPos->init_req(2, index);
1308 charPos = index;
1309
1310 kit.set_control(eq);
1311 kit.set_memory(st, byte_adr_idx);
1312
1313 C->record_for_igvn(head);
1314 C->record_for_igvn(mem);
1315 C->record_for_igvn(i_phi);
1316 C->record_for_igvn(charPos);
1317
1318 // if (sign != 0) {
1319 // buf [--charPos] = sign;
1320 // }
1321 iff = kit.create_and_map_if(kit.control(), __ Bool(__ CmpI(sign, __ intcon(0)), BoolTest::ne),
1322 PROB_FAIR, COUNT_UNKNOWN);
1323
1324 final_merge->init_req(merge_index + 2, __ IfFalse(iff));
1325 final_mem->init_req(merge_index + 2, kit.memory(byte_adr_idx));
1326
1327 kit.set_control(__ IfTrue(iff));
1328 if (kit.stopped()) {
1329 final_merge->init_req(merge_index + 1, C->top());
1330 final_mem->init_req(merge_index + 1, C->top());
1331 } else {
1332 Node* index = __ SubI(charPos, __ intcon((bt == T_BYTE) ? 1 : 2));
1333 st = __ store_to_memory(kit.control(), kit.array_element_address(dst_array, index, T_BYTE),
1334 sign, bt, byte_adr_idx, MemNode::unordered);
1335
1336 final_merge->init_req(merge_index + 1, kit.control());
1337 final_mem->init_req(merge_index + 1, st);
1338 }
1339 }
1340
1341 // Copy the characters representing arg into dst_array starting at start
1342 Node* PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* dst_array, Node* dst_coder, Node* start, Node* size) {
1343 bool dcon = dst_coder->is_Con();
1344 bool dbyte = dcon ? (dst_coder->get_int() == java_lang_String::CODER_LATIN1) : false;
1345 Node* end = __ AddI(start, __ LShiftI(size, dst_coder));
1346
1347 // The final_merge node has 4 entries in case the encoding is known:
1348 // (0) Control, (1) result w/ sign, (2) result w/o sign, (3) result for Integer.min_value
1349 // or 6 entries in case the encoding is not known:
1350 // (0) Control, (1) Latin1 w/ sign, (2) Latin1 w/o sign, (3) min_value, (4) UTF16 w/ sign, (5) UTF16 w/o sign
1351 RegionNode* final_merge = new RegionNode(dcon ? 4 : 6);
1352 kit.gvn().set_type(final_merge, Type::CONTROL);
1353
1354 Node* final_mem = PhiNode::make(final_merge, kit.memory(byte_adr_idx), Type::MEMORY, TypeAryPtr::BYTES);
1507 Node* adr = kit.array_element_address(dst_array, index, T_BYTE);
1508 Node* val = __ ConI(src_array->byte_at(i));
1509 __ store(__ ctrl(), adr, val, T_BYTE, byte_adr_idx, MemNode::unordered);
1510 index = __ AddI(index, __ ConI(1));
1511 }
1512 }
1513 if (!dcon) {
1514 __ else_();
1515 }
1516 if (!dcon || !dbyte) {
1517 // Destination is UTF16. Copy each char of src_array into dst_array.
1518 Node* index = start;
1519 for (int i = 0; i < length; i++) {
1520 Node* adr = kit.array_element_address(dst_array, index, T_BYTE);
1521 jchar val;
1522 if (src_is_byte) {
1523 val = src_array->byte_at(i) & 0xff;
1524 } else {
1525 val = readChar(src_array, i++);
1526 }
1527 __ store(__ ctrl(), adr, __ ConI(val), T_CHAR, byte_adr_idx, MemNode::unordered);
1528 index = __ AddI(index, __ ConI(2));
1529 }
1530 if (src_is_byte) {
1531 // Multiply count by two since we now need two bytes per char
1532 __ set(count, __ ConI(2 * length));
1533 }
1534 }
1535 if (!dcon) {
1536 __ end_if();
1537 }
1538 }
1539
1540 // Compress copy contents of the byte/char String str into dst_array starting at index start.
1541 Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* dst_array, Node* dst_coder, Node* start) {
1542 Node* src_array = kit.load_String_value(kit.control(), str);
1543
1544 IdealKit ideal(&kit, true, true);
1545 IdealVariable count(ideal); __ declarations_done();
1546
1547 if (str->is_Con()) {
1595 Node* PhaseStringOpts::copy_char(GraphKit& kit, Node* val, Node* dst_array, Node* dst_coder, Node* start) {
1596 bool dcon = (dst_coder != NULL) && dst_coder->is_Con();
1597 bool dbyte = dcon ? (dst_coder->get_int() == java_lang_String::CODER_LATIN1) : false;
1598
1599 IdealKit ideal(&kit, true, true);
1600 IdealVariable end(ideal); __ declarations_done();
1601 Node* adr = kit.array_element_address(dst_array, start, T_BYTE);
1602 if (!dcon){
1603 __ if_then(dst_coder, BoolTest::eq, __ ConI(java_lang_String::CODER_LATIN1));
1604 }
1605 if (!dcon || dbyte) {
1606 // Destination is Latin1. Store a byte.
1607 __ store(__ ctrl(), adr, val, T_BYTE, byte_adr_idx, MemNode::unordered);
1608 __ set(end, __ AddI(start, __ ConI(1)));
1609 }
1610 if (!dcon) {
1611 __ else_();
1612 }
1613 if (!dcon || !dbyte) {
1614 // Destination is UTF16. Store a char.
1615 __ store(__ ctrl(), adr, val, T_CHAR, byte_adr_idx, MemNode::unordered);
1616 __ set(end, __ AddI(start, __ ConI(2)));
1617 }
1618 if (!dcon) {
1619 __ end_if();
1620 }
1621 // Finally sync IdealKit and GraphKit.
1622 kit.sync_kit(ideal);
1623 return __ value(end);
1624 }
1625
1626 #undef __
1627 #define __ kit.
1628
1629 // Allocate a byte array of specified length.
1630 Node* PhaseStringOpts::allocate_byte_array(GraphKit& kit, IdealKit* ideal, Node* length) {
1631 if (ideal != NULL) {
1632 // Sync IdealKit and graphKit.
1633 kit.sync_kit(*ideal);
1634 }
1635 Node* byte_array = NULL;
|
1276
1277 kit.gvn().set_type(head, Type::CONTROL);
1278 Node* i_phi = new PhiNode(head, TypeInt::INT);
1279 i_phi->init_req(1, i);
1280 kit.gvn().set_type(i_phi, TypeInt::INT);
1281 Node* charPos = new PhiNode(head, TypeInt::INT);
1282 charPos->init_req(1, end);
1283 kit.gvn().set_type(charPos, TypeInt::INT);
1284 Node* mem = PhiNode::make(head, kit.memory(byte_adr_idx), Type::MEMORY, TypeAryPtr::BYTES);
1285 kit.gvn().set_type(mem, Type::MEMORY);
1286
1287 kit.set_control(head);
1288 kit.set_memory(mem, byte_adr_idx);
1289
1290 Node* q = __ DivI(kit.null(), i_phi, __ intcon(10));
1291 Node* r = __ SubI(i_phi, __ AddI(__ LShiftI(q, __ intcon(3)),
1292 __ LShiftI(q, __ intcon(1))));
1293 Node* index = __ SubI(charPos, __ intcon((bt == T_BYTE) ? 1 : 2));
1294 Node* ch = __ AddI(r, __ intcon('0'));
1295 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(dst_array, index, T_BYTE),
1296 ch, bt, byte_adr_idx, MemNode::unordered, (bt != T_BYTE) /* mismatched */);
1297
1298 iff = kit.create_and_map_if(head, __ Bool(__ CmpI(q, __ intcon(0)), BoolTest::ne),
1299 PROB_FAIR, COUNT_UNKNOWN);
1300 Node* ne = __ IfTrue(iff);
1301 Node* eq = __ IfFalse(iff);
1302
1303 head->init_req(2, ne);
1304 mem->init_req(2, st);
1305
1306 i_phi->init_req(2, q);
1307 charPos->init_req(2, index);
1308 charPos = index;
1309
1310 kit.set_control(eq);
1311 kit.set_memory(st, byte_adr_idx);
1312
1313 C->record_for_igvn(head);
1314 C->record_for_igvn(mem);
1315 C->record_for_igvn(i_phi);
1316 C->record_for_igvn(charPos);
1317
1318 // if (sign != 0) {
1319 // buf [--charPos] = sign;
1320 // }
1321 iff = kit.create_and_map_if(kit.control(), __ Bool(__ CmpI(sign, __ intcon(0)), BoolTest::ne),
1322 PROB_FAIR, COUNT_UNKNOWN);
1323
1324 final_merge->init_req(merge_index + 2, __ IfFalse(iff));
1325 final_mem->init_req(merge_index + 2, kit.memory(byte_adr_idx));
1326
1327 kit.set_control(__ IfTrue(iff));
1328 if (kit.stopped()) {
1329 final_merge->init_req(merge_index + 1, C->top());
1330 final_mem->init_req(merge_index + 1, C->top());
1331 } else {
1332 Node* index = __ SubI(charPos, __ intcon((bt == T_BYTE) ? 1 : 2));
1333 st = __ store_to_memory(kit.control(), kit.array_element_address(dst_array, index, T_BYTE),
1334 sign, bt, byte_adr_idx, MemNode::unordered, (bt != T_BYTE) /* mismatched */);
1335
1336 final_merge->init_req(merge_index + 1, kit.control());
1337 final_mem->init_req(merge_index + 1, st);
1338 }
1339 }
1340
1341 // Copy the characters representing arg into dst_array starting at start
1342 Node* PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* dst_array, Node* dst_coder, Node* start, Node* size) {
1343 bool dcon = dst_coder->is_Con();
1344 bool dbyte = dcon ? (dst_coder->get_int() == java_lang_String::CODER_LATIN1) : false;
1345 Node* end = __ AddI(start, __ LShiftI(size, dst_coder));
1346
1347 // The final_merge node has 4 entries in case the encoding is known:
1348 // (0) Control, (1) result w/ sign, (2) result w/o sign, (3) result for Integer.min_value
1349 // or 6 entries in case the encoding is not known:
1350 // (0) Control, (1) Latin1 w/ sign, (2) Latin1 w/o sign, (3) min_value, (4) UTF16 w/ sign, (5) UTF16 w/o sign
1351 RegionNode* final_merge = new RegionNode(dcon ? 4 : 6);
1352 kit.gvn().set_type(final_merge, Type::CONTROL);
1353
1354 Node* final_mem = PhiNode::make(final_merge, kit.memory(byte_adr_idx), Type::MEMORY, TypeAryPtr::BYTES);
1507 Node* adr = kit.array_element_address(dst_array, index, T_BYTE);
1508 Node* val = __ ConI(src_array->byte_at(i));
1509 __ store(__ ctrl(), adr, val, T_BYTE, byte_adr_idx, MemNode::unordered);
1510 index = __ AddI(index, __ ConI(1));
1511 }
1512 }
1513 if (!dcon) {
1514 __ else_();
1515 }
1516 if (!dcon || !dbyte) {
1517 // Destination is UTF16. Copy each char of src_array into dst_array.
1518 Node* index = start;
1519 for (int i = 0; i < length; i++) {
1520 Node* adr = kit.array_element_address(dst_array, index, T_BYTE);
1521 jchar val;
1522 if (src_is_byte) {
1523 val = src_array->byte_at(i) & 0xff;
1524 } else {
1525 val = readChar(src_array, i++);
1526 }
1527 __ store(__ ctrl(), adr, __ ConI(val), T_CHAR, byte_adr_idx, MemNode::unordered, true /* mismatched */);
1528 index = __ AddI(index, __ ConI(2));
1529 }
1530 if (src_is_byte) {
1531 // Multiply count by two since we now need two bytes per char
1532 __ set(count, __ ConI(2 * length));
1533 }
1534 }
1535 if (!dcon) {
1536 __ end_if();
1537 }
1538 }
1539
1540 // Compress copy contents of the byte/char String str into dst_array starting at index start.
1541 Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* dst_array, Node* dst_coder, Node* start) {
1542 Node* src_array = kit.load_String_value(kit.control(), str);
1543
1544 IdealKit ideal(&kit, true, true);
1545 IdealVariable count(ideal); __ declarations_done();
1546
1547 if (str->is_Con()) {
1595 Node* PhaseStringOpts::copy_char(GraphKit& kit, Node* val, Node* dst_array, Node* dst_coder, Node* start) {
1596 bool dcon = (dst_coder != NULL) && dst_coder->is_Con();
1597 bool dbyte = dcon ? (dst_coder->get_int() == java_lang_String::CODER_LATIN1) : false;
1598
1599 IdealKit ideal(&kit, true, true);
1600 IdealVariable end(ideal); __ declarations_done();
1601 Node* adr = kit.array_element_address(dst_array, start, T_BYTE);
1602 if (!dcon){
1603 __ if_then(dst_coder, BoolTest::eq, __ ConI(java_lang_String::CODER_LATIN1));
1604 }
1605 if (!dcon || dbyte) {
1606 // Destination is Latin1. Store a byte.
1607 __ store(__ ctrl(), adr, val, T_BYTE, byte_adr_idx, MemNode::unordered);
1608 __ set(end, __ AddI(start, __ ConI(1)));
1609 }
1610 if (!dcon) {
1611 __ else_();
1612 }
1613 if (!dcon || !dbyte) {
1614 // Destination is UTF16. Store a char.
1615 __ store(__ ctrl(), adr, val, T_CHAR, byte_adr_idx, MemNode::unordered, true /* mismatched */);
1616 __ set(end, __ AddI(start, __ ConI(2)));
1617 }
1618 if (!dcon) {
1619 __ end_if();
1620 }
1621 // Finally sync IdealKit and GraphKit.
1622 kit.sync_kit(ideal);
1623 return __ value(end);
1624 }
1625
1626 #undef __
1627 #define __ kit.
1628
1629 // Allocate a byte array of specified length.
1630 Node* PhaseStringOpts::allocate_byte_array(GraphKit& kit, IdealKit* ideal, Node* length) {
1631 if (ideal != NULL) {
1632 // Sync IdealKit and graphKit.
1633 kit.sync_kit(*ideal);
1634 }
1635 Node* byte_array = NULL;
|