< prev index next >

src/share/vm/opto/stringopts.cpp

Print this page




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;


< prev index next >