changeset 47583 | 2dcbf51d0431 |
parent 47216 | 71c04702a3d5 |
child 47584 | b02ea7eb7d93 |
47582:fde01e0fccb4 | 47583:2dcbf51d0431 |
---|---|
252 reg_def SR_CTR( SOC, SOC, Op_RegP, 2, SR_CTR->as_VMReg()); // v |
252 reg_def SR_CTR( SOC, SOC, Op_RegP, 2, SR_CTR->as_VMReg()); // v |
253 reg_def SR_VRSAVE( SOC, SOC, Op_RegP, 3, SR_VRSAVE->as_VMReg()); // v |
253 reg_def SR_VRSAVE( SOC, SOC, Op_RegP, 3, SR_VRSAVE->as_VMReg()); // v |
254 reg_def SR_SPEFSCR(SOC, SOC, Op_RegP, 4, SR_SPEFSCR->as_VMReg()); // v |
254 reg_def SR_SPEFSCR(SOC, SOC, Op_RegP, 4, SR_SPEFSCR->as_VMReg()); // v |
255 reg_def SR_PPR( SOC, SOC, Op_RegP, 5, SR_PPR->as_VMReg()); // v |
255 reg_def SR_PPR( SOC, SOC, Op_RegP, 5, SR_PPR->as_VMReg()); // v |
256 |
256 |
257 // ---------------------------- |
|
258 // Vector-Scalar Registers |
|
259 // ---------------------------- |
|
260 reg_def VSR0 ( SOC, SOC, Op_VecX, 0, NULL); |
|
261 reg_def VSR1 ( SOC, SOC, Op_VecX, 1, NULL); |
|
262 reg_def VSR2 ( SOC, SOC, Op_VecX, 2, NULL); |
|
263 reg_def VSR3 ( SOC, SOC, Op_VecX, 3, NULL); |
|
264 reg_def VSR4 ( SOC, SOC, Op_VecX, 4, NULL); |
|
265 reg_def VSR5 ( SOC, SOC, Op_VecX, 5, NULL); |
|
266 reg_def VSR6 ( SOC, SOC, Op_VecX, 6, NULL); |
|
267 reg_def VSR7 ( SOC, SOC, Op_VecX, 7, NULL); |
|
268 reg_def VSR8 ( SOC, SOC, Op_VecX, 8, NULL); |
|
269 reg_def VSR9 ( SOC, SOC, Op_VecX, 9, NULL); |
|
270 reg_def VSR10 ( SOC, SOC, Op_VecX, 10, NULL); |
|
271 reg_def VSR11 ( SOC, SOC, Op_VecX, 11, NULL); |
|
272 reg_def VSR12 ( SOC, SOC, Op_VecX, 12, NULL); |
|
273 reg_def VSR13 ( SOC, SOC, Op_VecX, 13, NULL); |
|
274 reg_def VSR14 ( SOC, SOC, Op_VecX, 14, NULL); |
|
275 reg_def VSR15 ( SOC, SOC, Op_VecX, 15, NULL); |
|
276 reg_def VSR16 ( SOC, SOC, Op_VecX, 16, NULL); |
|
277 reg_def VSR17 ( SOC, SOC, Op_VecX, 17, NULL); |
|
278 reg_def VSR18 ( SOC, SOC, Op_VecX, 18, NULL); |
|
279 reg_def VSR19 ( SOC, SOC, Op_VecX, 19, NULL); |
|
280 reg_def VSR20 ( SOC, SOC, Op_VecX, 20, NULL); |
|
281 reg_def VSR21 ( SOC, SOC, Op_VecX, 21, NULL); |
|
282 reg_def VSR22 ( SOC, SOC, Op_VecX, 22, NULL); |
|
283 reg_def VSR23 ( SOC, SOC, Op_VecX, 23, NULL); |
|
284 reg_def VSR24 ( SOC, SOC, Op_VecX, 24, NULL); |
|
285 reg_def VSR25 ( SOC, SOC, Op_VecX, 25, NULL); |
|
286 reg_def VSR26 ( SOC, SOC, Op_VecX, 26, NULL); |
|
287 reg_def VSR27 ( SOC, SOC, Op_VecX, 27, NULL); |
|
288 reg_def VSR28 ( SOC, SOC, Op_VecX, 28, NULL); |
|
289 reg_def VSR29 ( SOC, SOC, Op_VecX, 29, NULL); |
|
290 reg_def VSR30 ( SOC, SOC, Op_VecX, 30, NULL); |
|
291 reg_def VSR31 ( SOC, SOC, Op_VecX, 31, NULL); |
|
292 reg_def VSR32 ( SOC, SOC, Op_VecX, 32, NULL); |
|
293 reg_def VSR33 ( SOC, SOC, Op_VecX, 33, NULL); |
|
294 reg_def VSR34 ( SOC, SOC, Op_VecX, 34, NULL); |
|
295 reg_def VSR35 ( SOC, SOC, Op_VecX, 35, NULL); |
|
296 reg_def VSR36 ( SOC, SOC, Op_VecX, 36, NULL); |
|
297 reg_def VSR37 ( SOC, SOC, Op_VecX, 37, NULL); |
|
298 reg_def VSR38 ( SOC, SOC, Op_VecX, 38, NULL); |
|
299 reg_def VSR39 ( SOC, SOC, Op_VecX, 39, NULL); |
|
300 reg_def VSR40 ( SOC, SOC, Op_VecX, 40, NULL); |
|
301 reg_def VSR41 ( SOC, SOC, Op_VecX, 41, NULL); |
|
302 reg_def VSR42 ( SOC, SOC, Op_VecX, 42, NULL); |
|
303 reg_def VSR43 ( SOC, SOC, Op_VecX, 43, NULL); |
|
304 reg_def VSR44 ( SOC, SOC, Op_VecX, 44, NULL); |
|
305 reg_def VSR45 ( SOC, SOC, Op_VecX, 45, NULL); |
|
306 reg_def VSR46 ( SOC, SOC, Op_VecX, 46, NULL); |
|
307 reg_def VSR47 ( SOC, SOC, Op_VecX, 47, NULL); |
|
308 reg_def VSR48 ( SOC, SOC, Op_VecX, 48, NULL); |
|
309 reg_def VSR49 ( SOC, SOC, Op_VecX, 49, NULL); |
|
310 reg_def VSR50 ( SOC, SOC, Op_VecX, 50, NULL); |
|
311 reg_def VSR51 ( SOC, SOC, Op_VecX, 51, NULL); |
|
312 reg_def VSR52 ( SOC, SOC, Op_VecX, 52, NULL); |
|
313 reg_def VSR53 ( SOC, SOC, Op_VecX, 53, NULL); |
|
314 reg_def VSR54 ( SOC, SOC, Op_VecX, 54, NULL); |
|
315 reg_def VSR55 ( SOC, SOC, Op_VecX, 55, NULL); |
|
316 reg_def VSR56 ( SOC, SOC, Op_VecX, 56, NULL); |
|
317 reg_def VSR57 ( SOC, SOC, Op_VecX, 57, NULL); |
|
318 reg_def VSR58 ( SOC, SOC, Op_VecX, 58, NULL); |
|
319 reg_def VSR59 ( SOC, SOC, Op_VecX, 59, NULL); |
|
320 reg_def VSR60 ( SOC, SOC, Op_VecX, 60, NULL); |
|
321 reg_def VSR61 ( SOC, SOC, Op_VecX, 61, NULL); |
|
322 reg_def VSR62 ( SOC, SOC, Op_VecX, 62, NULL); |
|
323 reg_def VSR63 ( SOC, SOC, Op_VecX, 63, NULL); |
|
257 |
324 |
258 // ---------------------------- |
325 // ---------------------------- |
259 // Specify priority of register selection within phases of register |
326 // Specify priority of register selection within phases of register |
260 // allocation. Highest priority is first. A useful heuristic is to |
327 // allocation. Highest priority is first. A useful heuristic is to |
261 // give registers a low priority when they are required by machine |
328 // give registers a low priority when they are required by machine |
391 SR_LR, |
458 SR_LR, |
392 SR_CTR, |
459 SR_CTR, |
393 SR_VRSAVE, |
460 SR_VRSAVE, |
394 SR_SPEFSCR, |
461 SR_SPEFSCR, |
395 SR_PPR |
462 SR_PPR |
463 ); |
|
464 |
|
465 alloc_class chunk4 ( |
|
466 VSR0, |
|
467 VSR1, |
|
468 VSR2, |
|
469 VSR3, |
|
470 VSR4, |
|
471 VSR5, |
|
472 VSR6, |
|
473 VSR7, |
|
474 VSR8, |
|
475 VSR9, |
|
476 VSR10, |
|
477 VSR11, |
|
478 VSR12, |
|
479 VSR13, |
|
480 VSR14, |
|
481 VSR15, |
|
482 VSR16, |
|
483 VSR17, |
|
484 VSR18, |
|
485 VSR19, |
|
486 VSR20, |
|
487 VSR21, |
|
488 VSR22, |
|
489 VSR23, |
|
490 VSR24, |
|
491 VSR25, |
|
492 VSR26, |
|
493 VSR27, |
|
494 VSR28, |
|
495 VSR29, |
|
496 VSR30, |
|
497 VSR31, |
|
498 VSR32, |
|
499 VSR33, |
|
500 VSR34, |
|
501 VSR35, |
|
502 VSR36, |
|
503 VSR37, |
|
504 VSR38, |
|
505 VSR39, |
|
506 VSR40, |
|
507 VSR41, |
|
508 VSR42, |
|
509 VSR43, |
|
510 VSR44, |
|
511 VSR45, |
|
512 VSR46, |
|
513 VSR47, |
|
514 VSR48, |
|
515 VSR49, |
|
516 VSR50, |
|
517 VSR51, |
|
518 VSR52, |
|
519 VSR53, |
|
520 VSR54, |
|
521 VSR55, |
|
522 VSR56, |
|
523 VSR57, |
|
524 VSR58, |
|
525 VSR59, |
|
526 VSR60, |
|
527 VSR61, |
|
528 VSR62, |
|
529 VSR63 |
|
396 ); |
530 ); |
397 |
531 |
398 //-------Architecture Description Register Classes----------------------- |
532 //-------Architecture Description Register Classes----------------------- |
399 |
533 |
400 // Several register classes are automatically defined based upon |
534 // Several register classes are automatically defined based upon |
767 F29, F29_H, // nv! |
901 F29, F29_H, // nv! |
768 F30, F30_H, // nv! |
902 F30, F30_H, // nv! |
769 F31, F31_H // nv! |
903 F31, F31_H // nv! |
770 ); |
904 ); |
771 |
905 |
906 // Class for all 128bit vector registers |
|
907 reg_class vectorx_reg(VSR0, |
|
908 VSR1, |
|
909 VSR2, |
|
910 VSR3, |
|
911 VSR4, |
|
912 VSR5, |
|
913 VSR6, |
|
914 VSR7, |
|
915 VSR8, |
|
916 VSR9, |
|
917 VSR10, |
|
918 VSR11, |
|
919 VSR12, |
|
920 VSR13, |
|
921 VSR14, |
|
922 VSR15, |
|
923 VSR16, |
|
924 VSR17, |
|
925 VSR18, |
|
926 VSR19, |
|
927 VSR20, |
|
928 VSR21, |
|
929 VSR22, |
|
930 VSR23, |
|
931 VSR24, |
|
932 VSR25, |
|
933 VSR26, |
|
934 VSR27, |
|
935 VSR28, |
|
936 VSR29, |
|
937 VSR30, |
|
938 VSR31, |
|
939 VSR32, |
|
940 VSR33, |
|
941 VSR34, |
|
942 VSR35, |
|
943 VSR36, |
|
944 VSR37, |
|
945 VSR38, |
|
946 VSR39, |
|
947 VSR40, |
|
948 VSR41, |
|
949 VSR42, |
|
950 VSR43, |
|
951 VSR44, |
|
952 VSR45, |
|
953 VSR46, |
|
954 VSR47, |
|
955 VSR48, |
|
956 VSR49, |
|
957 VSR50, |
|
958 VSR51, |
|
959 VSR52, |
|
960 VSR53, |
|
961 VSR54, |
|
962 VSR55, |
|
963 VSR56, |
|
964 VSR57, |
|
965 VSR58, |
|
966 VSR59, |
|
967 VSR60, |
|
968 VSR61, |
|
969 VSR62, |
|
970 VSR63 |
|
971 ); |
|
972 |
|
772 %} |
973 %} |
773 |
974 |
774 //----------DEFINITION BLOCK--------------------------------------------------- |
975 //----------DEFINITION BLOCK--------------------------------------------------- |
775 // Define name --> value mappings to inform the ADLC of an integer valued name |
976 // Define name --> value mappings to inform the ADLC of an integer valued name |
776 // Current support includes integer values in the range [0, 0x7FFFFFFF] |
977 // Current support includes integer values in the range [0, 0x7FFFFFFF] |
2046 return VM_Version::has_fcfids(); // False means that conversion is done by runtime call. |
2247 return VM_Version::has_fcfids(); // False means that conversion is done by runtime call. |
2047 } |
2248 } |
2048 |
2249 |
2049 // Vector width in bytes. |
2250 // Vector width in bytes. |
2050 const int Matcher::vector_width_in_bytes(BasicType bt) { |
2251 const int Matcher::vector_width_in_bytes(BasicType bt) { |
2051 assert(MaxVectorSize == 8, ""); |
2252 if (VM_Version::has_vsx()) { |
2052 return 8; |
2253 assert(MaxVectorSize == 16, ""); |
2254 return 16; |
|
2255 } else { |
|
2256 assert(MaxVectorSize == 8, ""); |
|
2257 return 8; |
|
2258 } |
|
2053 } |
2259 } |
2054 |
2260 |
2055 // Vector ideal reg. |
2261 // Vector ideal reg. |
2056 const uint Matcher::vector_ideal_reg(int size) { |
2262 const uint Matcher::vector_ideal_reg(int size) { |
2057 assert(MaxVectorSize == 8 && size == 8, ""); |
2263 if (VM_Version::has_vsx()) { |
2058 return Op_RegL; |
2264 assert(MaxVectorSize == 16 && size == 16, ""); |
2265 return Op_VecX; |
|
2266 } else { |
|
2267 assert(MaxVectorSize == 8 && size == 8, ""); |
|
2268 return Op_RegL; |
|
2269 } |
|
2059 } |
2270 } |
2060 |
2271 |
2061 const uint Matcher::vector_shift_count_ideal_reg(int size) { |
2272 const uint Matcher::vector_shift_count_ideal_reg(int size) { |
2062 fatal("vector shift is not supported"); |
2273 fatal("vector shift is not supported"); |
2063 return Node::NotAMachineReg; |
2274 return Node::NotAMachineReg; |
2073 return max_vector_size(bt); // Same as max. |
2284 return max_vector_size(bt); // Same as max. |
2074 } |
2285 } |
2075 |
2286 |
2076 // PPC doesn't support misaligned vectors store/load. |
2287 // PPC doesn't support misaligned vectors store/load. |
2077 const bool Matcher::misaligned_vectors_ok() { |
2288 const bool Matcher::misaligned_vectors_ok() { |
2078 return false; |
2289 if (VM_Version::has_vsx()) |
2290 return !AlignVector; // can be changed by flag |
|
2291 else |
|
2292 return false; |
|
2079 } |
2293 } |
2080 |
2294 |
2081 // PPC AES support not yet implemented |
2295 // PPC AES support not yet implemented |
2082 const bool Matcher::pass_original_key_for_aes() { |
2296 const bool Matcher::pass_original_key_for_aes() { |
2083 return false; |
2297 return false; |
2215 F5_num, F6_num, F7_num, F8_num, |
2429 F5_num, F6_num, F7_num, F8_num, |
2216 F9_num, F10_num, F11_num, F12_num, |
2430 F9_num, F10_num, F11_num, F12_num, |
2217 F13_num |
2431 F13_num |
2218 }; |
2432 }; |
2219 |
2433 |
2434 const MachRegisterNumbers vsarg_reg[64] = { |
|
2435 VSR0_num, VSR1_num, VSR2_num, VSR3_num, |
|
2436 VSR4_num, VSR5_num, VSR6_num, VSR7_num, |
|
2437 VSR8_num, VSR9_num, VSR10_num, VSR11_num, |
|
2438 VSR12_num, VSR13_num, VSR14_num, VSR15_num, |
|
2439 VSR16_num, VSR17_num, VSR18_num, VSR19_num, |
|
2440 VSR20_num, VSR21_num, VSR22_num, VSR23_num, |
|
2441 VSR24_num, VSR23_num, VSR24_num, VSR25_num, |
|
2442 VSR28_num, VSR29_num, VSR30_num, VSR31_num, |
|
2443 VSR32_num, VSR33_num, VSR34_num, VSR35_num, |
|
2444 VSR36_num, VSR37_num, VSR38_num, VSR39_num, |
|
2445 VSR40_num, VSR41_num, VSR42_num, VSR43_num, |
|
2446 VSR44_num, VSR45_num, VSR46_num, VSR47_num, |
|
2447 VSR48_num, VSR49_num, VSR50_num, VSR51_num, |
|
2448 VSR52_num, VSR53_num, VSR54_num, VSR55_num, |
|
2449 VSR56_num, VSR57_num, VSR58_num, VSR59_num, |
|
2450 VSR60_num, VSR61_num, VSR62_num, VSR63_num |
|
2451 }; |
|
2452 |
|
2220 const int num_iarg_registers = sizeof(iarg_reg) / sizeof(iarg_reg[0]); |
2453 const int num_iarg_registers = sizeof(iarg_reg) / sizeof(iarg_reg[0]); |
2221 |
2454 |
2222 const int num_farg_registers = sizeof(farg_reg) / sizeof(farg_reg[0]); |
2455 const int num_farg_registers = sizeof(farg_reg) / sizeof(farg_reg[0]); |
2456 |
|
2457 const int num_vsarg_registers = sizeof(vsarg_reg) / sizeof(vsarg_reg[0]); |
|
2223 |
2458 |
2224 // Return whether or not this register is ever used as an argument. This |
2459 // Return whether or not this register is ever used as an argument. This |
2225 // function is used on startup to build the trampoline stubs in generateOptoStub. |
2460 // function is used on startup to build the trampoline stubs in generateOptoStub. |
2226 // Registers not mentioned will be killed by the VM call in the trampoline, and |
2461 // Registers not mentioned will be killed by the VM call in the trampoline, and |
2227 // arguments in those registers not be available to the callee. |
2462 // arguments in those registers not be available to the callee. |
2550 } |
2785 } |
2551 |
2786 |
2552 return nodes; |
2787 return nodes; |
2553 } |
2788 } |
2554 |
2789 |
2790 typedef struct { |
|
2791 loadConL_hiNode *_large_hi; |
|
2792 loadConL_loNode *_large_lo; |
|
2793 mtvsrdNode *_moved; |
|
2794 xxspltdNode *_replicated; |
|
2795 loadConLNode *_small; |
|
2796 MachNode *_last; |
|
2797 } loadConLReplicatedNodesTuple; |
|
2798 |
|
2799 loadConLReplicatedNodesTuple loadConLReplicatedNodesTuple_create(Compile *C, PhaseRegAlloc *ra_, Node *toc, immLOper *immSrc, |
|
2800 vecXOper *dst, immI_0Oper *zero, |
|
2801 OptoReg::Name reg_second, OptoReg::Name reg_first, |
|
2802 OptoReg::Name reg_vec_second, OptoReg::Name reg_vec_first) { |
|
2803 loadConLReplicatedNodesTuple nodes; |
|
2804 |
|
2805 const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
|
2806 if (large_constant_pool) { |
|
2807 // Create new nodes. |
|
2808 loadConL_hiNode *m1 = new loadConL_hiNode(); |
|
2809 loadConL_loNode *m2 = new loadConL_loNode(); |
|
2810 mtvsrdNode *m3 = new mtvsrdNode(); |
|
2811 xxspltdNode *m4 = new xxspltdNode(); |
|
2812 |
|
2813 // inputs for new nodes |
|
2814 m1->add_req(NULL, toc); |
|
2815 m2->add_req(NULL, m1); |
|
2816 m3->add_req(NULL, m2); |
|
2817 m4->add_req(NULL, m3); |
|
2818 |
|
2819 // operands for new nodes |
|
2820 m1->_opnds[0] = new iRegLdstOper(); // dst |
|
2821 m1->_opnds[1] = immSrc; // src |
|
2822 m1->_opnds[2] = new iRegPdstOper(); // toc |
|
2823 |
|
2824 m2->_opnds[0] = new iRegLdstOper(); // dst |
|
2825 m2->_opnds[1] = immSrc; // src |
|
2826 m2->_opnds[2] = new iRegLdstOper(); // base |
|
2827 |
|
2828 m3->_opnds[0] = new vecXOper(); // dst |
|
2829 m3->_opnds[1] = new iRegLdstOper(); // src |
|
2830 |
|
2831 m4->_opnds[0] = new vecXOper(); // dst |
|
2832 m4->_opnds[1] = new vecXOper(); // src |
|
2833 m4->_opnds[2] = zero; |
|
2834 |
|
2835 // Initialize ins_attrib TOC fields. |
|
2836 m1->_const_toc_offset = -1; |
|
2837 m2->_const_toc_offset_hi_node = m1; |
|
2838 |
|
2839 // Initialize ins_attrib instruction offset. |
|
2840 m1->_cbuf_insts_offset = -1; |
|
2841 |
|
2842 // register allocation for new nodes |
|
2843 ra_->set_pair(m1->_idx, reg_second, reg_first); |
|
2844 ra_->set_pair(m2->_idx, reg_second, reg_first); |
|
2845 ra_->set1(m3->_idx, reg_second); |
|
2846 ra_->set2(m3->_idx, reg_vec_first); |
|
2847 ra_->set_pair(m4->_idx, reg_vec_second, reg_vec_first); |
|
2848 |
|
2849 // Create result. |
|
2850 nodes._large_hi = m1; |
|
2851 nodes._large_lo = m2; |
|
2852 nodes._moved = m3; |
|
2853 nodes._replicated = m4; |
|
2854 nodes._small = NULL; |
|
2855 nodes._last = nodes._replicated; |
|
2856 assert(m2->bottom_type()->isa_long(), "must be long"); |
|
2857 } else { |
|
2858 loadConLNode *m2 = new loadConLNode(); |
|
2859 mtvsrdNode *m3 = new mtvsrdNode(); |
|
2860 xxspltdNode *m4 = new xxspltdNode(); |
|
2861 |
|
2862 // inputs for new nodes |
|
2863 m2->add_req(NULL, toc); |
|
2864 |
|
2865 // operands for new nodes |
|
2866 m2->_opnds[0] = new iRegLdstOper(); // dst |
|
2867 m2->_opnds[1] = immSrc; // src |
|
2868 m2->_opnds[2] = new iRegPdstOper(); // toc |
|
2869 |
|
2870 m3->_opnds[0] = new vecXOper(); // dst |
|
2871 m3->_opnds[1] = new iRegLdstOper(); // src |
|
2872 |
|
2873 m4->_opnds[0] = new vecXOper(); // dst |
|
2874 m4->_opnds[1] = new vecXOper(); // src |
|
2875 m4->_opnds[2] = zero; |
|
2876 |
|
2877 // Initialize ins_attrib instruction offset. |
|
2878 m2->_cbuf_insts_offset = -1; |
|
2879 ra_->set1(m3->_idx, reg_second); |
|
2880 ra_->set2(m3->_idx, reg_vec_first); |
|
2881 ra_->set_pair(m4->_idx, reg_vec_second, reg_vec_first); |
|
2882 |
|
2883 // register allocation for new nodes |
|
2884 ra_->set_pair(m2->_idx, reg_second, reg_first); |
|
2885 |
|
2886 // Create result. |
|
2887 nodes._large_hi = NULL; |
|
2888 nodes._large_lo = NULL; |
|
2889 nodes._small = m2; |
|
2890 nodes._moved = m3; |
|
2891 nodes._replicated = m4; |
|
2892 nodes._last = nodes._replicated; |
|
2893 assert(m2->bottom_type()->isa_long(), "must be long"); |
|
2894 } |
|
2895 |
|
2896 return nodes; |
|
2897 } |
|
2898 |
|
2555 %} // source |
2899 %} // source |
2556 |
2900 |
2557 encode %{ |
2901 encode %{ |
2558 // Postalloc expand emitter for loading a long constant from the method's TOC. |
2902 // Postalloc expand emitter for loading a long constant from the method's TOC. |
2559 // Enc_class needed as consttanttablebase is not supported by postalloc |
2903 // Enc_class needed as consttanttablebase is not supported by postalloc |
3208 if (loadConLNodes._large_hi) nodes->push(loadConLNodes._large_hi); |
3552 if (loadConLNodes._large_hi) nodes->push(loadConLNodes._large_hi); |
3209 if (loadConLNodes._last) nodes->push(loadConLNodes._last); |
3553 if (loadConLNodes._last) nodes->push(loadConLNodes._last); |
3210 |
3554 |
3211 assert(nodes->length() >= 1, "must have created at least 1 node"); |
3555 assert(nodes->length() >= 1, "must have created at least 1 node"); |
3212 assert(loadConLNodes._last->bottom_type()->isa_long(), "must be long"); |
3556 assert(loadConLNodes._last->bottom_type()->isa_long(), "must be long"); |
3557 %} |
|
3558 |
|
3559 enc_class postalloc_expand_load_replF_constant_vsx(vecX dst, immF src, iRegLdst toc) %{ |
|
3560 // Create new nodes. |
|
3561 |
|
3562 // Make an operand with the bit pattern to load as float. |
|
3563 immLOper *op_repl = new immLOper((jlong)replicate_immF(op_src->constantF())); |
|
3564 immI_0Oper *op_zero = new immI_0Oper(0); |
|
3565 |
|
3566 loadConLReplicatedNodesTuple loadConLNodes = |
|
3567 loadConLReplicatedNodesTuple_create(C, ra_, n_toc, op_repl, op_dst, op_zero, |
|
3568 OptoReg::Name(R20_H_num), OptoReg::Name(R20_num), |
|
3569 OptoReg::Name(VSR11_num), OptoReg::Name(VSR10_num)); |
|
3570 |
|
3571 // Push new nodes. |
|
3572 if (loadConLNodes._large_hi) { nodes->push(loadConLNodes._large_hi); } |
|
3573 if (loadConLNodes._large_lo) { nodes->push(loadConLNodes._large_lo); } |
|
3574 if (loadConLNodes._moved) { nodes->push(loadConLNodes._moved); } |
|
3575 if (loadConLNodes._last) { nodes->push(loadConLNodes._last); } |
|
3576 |
|
3577 assert(nodes->length() >= 1, "must have created at least 1 node"); |
|
3213 %} |
3578 %} |
3214 |
3579 |
3215 // This enc_class is needed so that scheduler gets proper |
3580 // This enc_class is needed so that scheduler gets proper |
3216 // input mapping for latency computation. |
3581 // input mapping for latency computation. |
3217 enc_class enc_poll(immI dst, iRegLdst poll) %{ |
3582 enc_class enc_poll(immI dst, iRegLdst poll) %{ |
3838 // parsing in the ADLC because operands constitute user defined types |
4203 // parsing in the ADLC because operands constitute user defined types |
3839 // which are used in instruction definitions. |
4204 // which are used in instruction definitions. |
3840 // |
4205 // |
3841 // Formats are generated automatically for constants and base registers. |
4206 // Formats are generated automatically for constants and base registers. |
3842 |
4207 |
4208 operand vecX() %{ |
|
4209 constraint(ALLOC_IN_RC(vectorx_reg)); |
|
4210 match(VecX); |
|
4211 |
|
4212 format %{ %} |
|
4213 interface(REG_INTER); |
|
4214 %} |
|
4215 |
|
3843 //----------Simple Operands---------------------------------------------------- |
4216 //----------Simple Operands---------------------------------------------------- |
3844 // Immediate Operands |
4217 // Immediate Operands |
3845 |
4218 |
3846 // Integer Immediate: 32-bit |
4219 // Integer Immediate: 32-bit |
3847 operand immI() %{ |
4220 operand immI() %{ |
5370 size(4); |
5743 size(4); |
5371 ins_encode( enc_ld(dst, mem) ); |
5744 ins_encode( enc_ld(dst, mem) ); |
5372 ins_pipe(pipe_class_memory); |
5745 ins_pipe(pipe_class_memory); |
5373 %} |
5746 %} |
5374 |
5747 |
5748 // Load Aligned Packed Byte |
|
5749 instruct loadV16(vecX dst, indirect mem) %{ |
|
5750 predicate(n->as_LoadVector()->memory_size() == 16); |
|
5751 match(Set dst (LoadVector mem)); |
|
5752 ins_cost(MEMORY_REF_COST); |
|
5753 |
|
5754 format %{ "LXVD2X $dst, $mem \t// load 16-byte Vector" %} |
|
5755 size(4); |
|
5756 ins_encode %{ |
|
5757 __ lxvd2x($dst$$VectorSRegister, $mem$$Register); |
|
5758 %} |
|
5759 ins_pipe(pipe_class_default); |
|
5760 %} |
|
5761 |
|
5375 // Load Range, range = array length (=jint) |
5762 // Load Range, range = array length (=jint) |
5376 instruct loadRange(iRegIdst dst, memory mem) %{ |
5763 instruct loadRange(iRegIdst dst, memory mem) %{ |
5377 match(Set dst (LoadRange mem)); |
5764 match(Set dst (LoadRange mem)); |
5378 ins_cost(MEMORY_REF_COST); |
5765 ins_cost(MEMORY_REF_COST); |
5379 |
5766 |
6364 |
6751 |
6365 format %{ "STD $mem, $src \t// packed8B" %} |
6752 format %{ "STD $mem, $src \t// packed8B" %} |
6366 size(4); |
6753 size(4); |
6367 ins_encode( enc_std(src, mem) ); |
6754 ins_encode( enc_std(src, mem) ); |
6368 ins_pipe(pipe_class_memory); |
6755 ins_pipe(pipe_class_memory); |
6756 %} |
|
6757 |
|
6758 // Store Packed Byte long register to memory |
|
6759 instruct storeV16(indirect mem, vecX src) %{ |
|
6760 predicate(n->as_StoreVector()->memory_size() == 16); |
|
6761 match(Set mem (StoreVector mem src)); |
|
6762 ins_cost(MEMORY_REF_COST); |
|
6763 |
|
6764 format %{ "STXVD2X $mem, $src \t// store 16-byte Vector" %} |
|
6765 size(4); |
|
6766 ins_encode %{ |
|
6767 __ stxvd2x($src$$VectorSRegister, $mem$$Register); |
|
6768 %} |
|
6769 ins_pipe(pipe_class_default); |
|
6369 %} |
6770 %} |
6370 |
6771 |
6371 // Store Compressed Oop |
6772 // Store Compressed Oop |
6372 instruct storeN(memory dst, iRegN_P2N src) %{ |
6773 instruct storeN(memory dst, iRegN_P2N src) %{ |
6373 match(Set dst (StoreN dst src)); |
6774 match(Set dst (StoreN dst src)); |
13237 __ sthbrx($src$$Register, $mem$$Register); |
13638 __ sthbrx($src$$Register, $mem$$Register); |
13238 %} |
13639 %} |
13239 ins_pipe(pipe_class_default); |
13640 ins_pipe(pipe_class_default); |
13240 %} |
13641 %} |
13241 |
13642 |
13643 instruct mtvsrwz(vecX temp1, iRegIsrc src) %{ |
|
13644 effect(DEF temp1, USE src); |
|
13645 |
|
13646 size(4); |
|
13647 ins_encode %{ |
|
13648 __ mtvsrwz($temp1$$VectorSRegister, $src$$Register); |
|
13649 %} |
|
13650 ins_pipe(pipe_class_default); |
|
13651 %} |
|
13652 |
|
13653 instruct xxspltw(vecX dst, vecX src, immI8 imm1) %{ |
|
13654 effect(DEF dst, USE src, USE imm1); |
|
13655 |
|
13656 size(4); |
|
13657 ins_encode %{ |
|
13658 __ xxspltw($dst$$VectorSRegister, $src$$VectorSRegister, $imm1$$constant); |
|
13659 %} |
|
13660 ins_pipe(pipe_class_default); |
|
13661 %} |
|
13662 |
|
13242 //---------- Replicate Vector Instructions ------------------------------------ |
13663 //---------- Replicate Vector Instructions ------------------------------------ |
13243 |
13664 |
13244 // Insrdi does replicate if src == dst. |
13665 // Insrdi does replicate if src == dst. |
13245 instruct repl32(iRegLdst dst) %{ |
13666 instruct repl32(iRegLdst dst) %{ |
13246 predicate(false); |
13667 predicate(false); |
13316 __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); |
13737 __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); |
13317 %} |
13738 %} |
13318 ins_pipe(pipe_class_default); |
13739 ins_pipe(pipe_class_default); |
13319 %} |
13740 %} |
13320 |
13741 |
13742 instruct repl16B_reg_Ex(vecX dst, iRegIsrc src) %{ |
|
13743 match(Set dst (ReplicateB src)); |
|
13744 predicate(n->as_Vector()->length() == 16); |
|
13745 |
|
13746 expand %{ |
|
13747 iRegLdst tmpL; |
|
13748 vecX tmpV; |
|
13749 immI8 imm1 %{ (int) 1 %} |
|
13750 moveReg(tmpL, src); |
|
13751 repl56(tmpL); |
|
13752 repl48(tmpL); |
|
13753 mtvsrwz(tmpV, tmpL); |
|
13754 xxspltw(dst, tmpV, imm1); |
|
13755 %} |
|
13756 %} |
|
13757 |
|
13758 instruct repl16B_immI0(vecX dst, immI_0 zero) %{ |
|
13759 match(Set dst (ReplicateB zero)); |
|
13760 predicate(n->as_Vector()->length() == 16); |
|
13761 |
|
13762 format %{ "XXLXOR $dst, $zero \t// replicate16B" %} |
|
13763 size(4); |
|
13764 ins_encode %{ |
|
13765 __ xxlxor($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
13766 %} |
|
13767 ins_pipe(pipe_class_default); |
|
13768 %} |
|
13769 |
|
13770 instruct repl16B_immIminus1(vecX dst, immI_minus1 src) %{ |
|
13771 match(Set dst (ReplicateB src)); |
|
13772 predicate(n->as_Vector()->length() == 16); |
|
13773 |
|
13774 format %{ "XXLEQV $dst, $src \t// replicate16B" %} |
|
13775 size(4); |
|
13776 ins_encode %{ |
|
13777 __ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
13778 %} |
|
13779 ins_pipe(pipe_class_default); |
|
13780 %} |
|
13781 |
|
13321 instruct repl4S_reg_Ex(iRegLdst dst, iRegIsrc src) %{ |
13782 instruct repl4S_reg_Ex(iRegLdst dst, iRegIsrc src) %{ |
13322 match(Set dst (ReplicateS src)); |
13783 match(Set dst (ReplicateS src)); |
13323 predicate(n->as_Vector()->length() == 4); |
13784 predicate(n->as_Vector()->length() == 4); |
13324 expand %{ |
13785 expand %{ |
13325 moveReg(dst, src); |
13786 moveReg(dst, src); |
13350 __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); |
13811 __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); |
13351 %} |
13812 %} |
13352 ins_pipe(pipe_class_default); |
13813 ins_pipe(pipe_class_default); |
13353 %} |
13814 %} |
13354 |
13815 |
13816 instruct repl8S_reg_Ex(vecX dst, iRegIsrc src) %{ |
|
13817 match(Set dst (ReplicateS src)); |
|
13818 predicate(n->as_Vector()->length() == 8); |
|
13819 |
|
13820 expand %{ |
|
13821 iRegLdst tmpL; |
|
13822 vecX tmpV; |
|
13823 immI8 zero %{ (int) 0 %} |
|
13824 moveReg(tmpL, src); |
|
13825 repl48(tmpL); |
|
13826 repl32(tmpL); |
|
13827 mtvsrd(tmpV, tmpL); |
|
13828 xxpermdi(dst, tmpV, tmpV, zero); |
|
13829 %} |
|
13830 %} |
|
13831 |
|
13832 instruct repl8S_immI0(vecX dst, immI_0 zero) %{ |
|
13833 match(Set dst (ReplicateS zero)); |
|
13834 predicate(n->as_Vector()->length() == 8); |
|
13835 |
|
13836 format %{ "XXLXOR $dst, $zero \t// replicate8S" %} |
|
13837 size(4); |
|
13838 ins_encode %{ |
|
13839 __ xxlxor($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
13840 %} |
|
13841 ins_pipe(pipe_class_default); |
|
13842 %} |
|
13843 |
|
13844 instruct repl8S_immIminus1(vecX dst, immI_minus1 src) %{ |
|
13845 match(Set dst (ReplicateS src)); |
|
13846 predicate(n->as_Vector()->length() == 8); |
|
13847 |
|
13848 format %{ "XXLEQV $dst, $src \t// replicate16B" %} |
|
13849 size(4); |
|
13850 ins_encode %{ |
|
13851 __ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
13852 %} |
|
13853 ins_pipe(pipe_class_default); |
|
13854 %} |
|
13855 |
|
13355 instruct repl2I_reg_Ex(iRegLdst dst, iRegIsrc src) %{ |
13856 instruct repl2I_reg_Ex(iRegLdst dst, iRegIsrc src) %{ |
13356 match(Set dst (ReplicateI src)); |
13857 match(Set dst (ReplicateI src)); |
13357 predicate(n->as_Vector()->length() == 2); |
13858 predicate(n->as_Vector()->length() == 2); |
13358 ins_cost(2 * DEFAULT_COST); |
13859 ins_cost(2 * DEFAULT_COST); |
13359 expand %{ |
13860 expand %{ |
13380 format %{ "LI $dst, -1 \t// replicate4C" %} |
13881 format %{ "LI $dst, -1 \t// replicate4C" %} |
13381 size(4); |
13882 size(4); |
13382 ins_encode %{ |
13883 ins_encode %{ |
13383 // TODO: PPC port $archOpcode(ppc64Opcode_addi); |
13884 // TODO: PPC port $archOpcode(ppc64Opcode_addi); |
13384 __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); |
13885 __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); |
13886 %} |
|
13887 ins_pipe(pipe_class_default); |
|
13888 %} |
|
13889 |
|
13890 instruct repl4I_reg_Ex(vecX dst, iRegIsrc src) %{ |
|
13891 match(Set dst (ReplicateI src)); |
|
13892 predicate(n->as_Vector()->length() == 4); |
|
13893 ins_cost(2 * DEFAULT_COST); |
|
13894 |
|
13895 expand %{ |
|
13896 iRegLdst tmpL; |
|
13897 vecX tmpV; |
|
13898 immI8 zero %{ (int) 0 %} |
|
13899 moveReg(tmpL, src); |
|
13900 repl32(tmpL); |
|
13901 mtvsrd(tmpV, tmpL); |
|
13902 xxpermdi(dst, tmpV, tmpV, zero); |
|
13903 %} |
|
13904 %} |
|
13905 |
|
13906 instruct repl4I_immI0(vecX dst, immI_0 zero) %{ |
|
13907 match(Set dst (ReplicateI zero)); |
|
13908 predicate(n->as_Vector()->length() == 4); |
|
13909 |
|
13910 format %{ "XXLXOR $dst, $zero \t// replicate4I" %} |
|
13911 size(4); |
|
13912 ins_encode %{ |
|
13913 __ xxlxor($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
13914 %} |
|
13915 ins_pipe(pipe_class_default); |
|
13916 %} |
|
13917 |
|
13918 instruct repl4I_immIminus1(vecX dst, immI_minus1 src) %{ |
|
13919 match(Set dst (ReplicateI src)); |
|
13920 predicate(n->as_Vector()->length() == 4); |
|
13921 |
|
13922 format %{ "XXLEQV $dst, $dst, $dst \t// replicate4I" %} |
|
13923 size(4); |
|
13924 ins_encode %{ |
|
13925 __ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
13385 %} |
13926 %} |
13386 ins_pipe(pipe_class_default); |
13927 ins_pipe(pipe_class_default); |
13387 %} |
13928 %} |
13388 |
13929 |
13389 // Move float to int register via stack, replicate. |
13930 // Move float to int register via stack, replicate. |
13481 __ mulldo_(R0, $op1$$Register, $op2$$Register); |
14022 __ mulldo_(R0, $op1$$Register, $op2$$Register); |
13482 %} |
14023 %} |
13483 ins_pipe(pipe_class_default); |
14024 ins_pipe(pipe_class_default); |
13484 %} |
14025 %} |
13485 |
14026 |
14027 |
|
14028 instruct repl4F_reg_Ex(vecX dst, regF src) %{ |
|
14029 match(Set dst (ReplicateF src)); |
|
14030 predicate(n->as_Vector()->length() == 4); |
|
14031 ins_cost(2 * MEMORY_REF_COST + DEFAULT_COST); |
|
14032 expand %{ |
|
14033 stackSlotL tmpS; |
|
14034 iRegIdst tmpI; |
|
14035 iRegLdst tmpL; |
|
14036 vecX tmpV; |
|
14037 immI8 zero %{ (int) 0 %} |
|
14038 |
|
14039 moveF2I_reg_stack(tmpS, src); // Move float to stack. |
|
14040 moveF2I_stack_reg(tmpI, tmpS); // Move stack to int reg. |
|
14041 moveReg(tmpL, tmpI); // Move int to long reg. |
|
14042 repl32(tmpL); // Replicate bitpattern. |
|
14043 mtvsrd(tmpV, tmpL); |
|
14044 xxpermdi(dst, tmpV, tmpV, zero); |
|
14045 %} |
|
14046 %} |
|
14047 |
|
14048 instruct repl4F_immF_Ex(vecX dst, immF src) %{ |
|
14049 match(Set dst (ReplicateF src)); |
|
14050 predicate(n->as_Vector()->length() == 4); |
|
14051 ins_cost(10 * DEFAULT_COST); |
|
14052 |
|
14053 postalloc_expand( postalloc_expand_load_replF_constant_vsx(dst, src, constanttablebase) ); |
|
14054 %} |
|
14055 |
|
14056 instruct repl4F_immF0(vecX dst, immF_0 zero) %{ |
|
14057 match(Set dst (ReplicateF zero)); |
|
14058 predicate(n->as_Vector()->length() == 4); |
|
14059 |
|
14060 format %{ "XXLXOR $dst, $zero \t// replicate4F" %} |
|
14061 ins_encode %{ |
|
14062 __ xxlxor($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
14063 %} |
|
14064 ins_pipe(pipe_class_default); |
|
14065 %} |
|
14066 |
|
14067 instruct repl2D_reg_Ex(vecX dst, regD src) %{ |
|
14068 match(Set dst (ReplicateD src)); |
|
14069 predicate(n->as_Vector()->length() == 2); |
|
14070 expand %{ |
|
14071 stackSlotL tmpS; |
|
14072 iRegLdst tmpL; |
|
14073 iRegLdst tmp; |
|
14074 vecX tmpV; |
|
14075 immI8 zero %{ (int) 0 %} |
|
14076 moveD2L_reg_stack(tmpS, src); |
|
14077 moveD2L_stack_reg(tmpL, tmpS); |
|
14078 mtvsrd(tmpV, tmpL); |
|
14079 xxpermdi(dst, tmpV, tmpV, zero); |
|
14080 %} |
|
14081 %} |
|
14082 |
|
14083 instruct repl2D_immI0(vecX dst, immI_0 zero) %{ |
|
14084 match(Set dst (ReplicateD zero)); |
|
14085 predicate(n->as_Vector()->length() == 2); |
|
14086 |
|
14087 format %{ "XXLXOR $dst, $zero \t// replicate2D" %} |
|
14088 size(4); |
|
14089 ins_encode %{ |
|
14090 __ xxlxor($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
14091 %} |
|
14092 ins_pipe(pipe_class_default); |
|
14093 %} |
|
14094 |
|
14095 instruct repl2D_immIminus1(vecX dst, immI_minus1 src) %{ |
|
14096 match(Set dst (ReplicateD src)); |
|
14097 predicate(n->as_Vector()->length() == 2); |
|
14098 |
|
14099 format %{ "XXLEQV $dst, $src \t// replicate16B" %} |
|
14100 size(4); |
|
14101 ins_encode %{ |
|
14102 __ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
14103 %} |
|
14104 ins_pipe(pipe_class_default); |
|
14105 %} |
|
14106 |
|
14107 instruct mtvsrd(vecX dst, iRegLsrc src) %{ |
|
14108 predicate(false); |
|
14109 effect(DEF dst, USE src); |
|
14110 |
|
14111 format %{ "MTVSRD $dst, $src \t// Move to 16-byte register"%} |
|
14112 size(4); |
|
14113 ins_encode %{ |
|
14114 __ mtvsrd($dst$$VectorSRegister, $src$$Register); |
|
14115 %} |
|
14116 ins_pipe(pipe_class_default); |
|
14117 %} |
|
14118 |
|
14119 instruct xxspltd(vecX dst, vecX src, immI8 zero) %{ |
|
14120 effect(DEF dst, USE src, USE zero); |
|
14121 |
|
14122 format %{ "XXSPLATD $dst, $src, $zero \t// Permute 16-byte register"%} |
|
14123 size(4); |
|
14124 ins_encode %{ |
|
14125 __ xxpermdi($dst$$VectorSRegister, $src$$VectorSRegister, $src$$VectorSRegister, $zero$$constant); |
|
14126 %} |
|
14127 ins_pipe(pipe_class_default); |
|
14128 %} |
|
14129 |
|
14130 instruct xxpermdi(vecX dst, vecX src1, vecX src2, immI8 zero) %{ |
|
14131 effect(DEF dst, USE src1, USE src2, USE zero); |
|
14132 |
|
14133 format %{ "XXPERMDI $dst, $src1, $src2, $zero \t// Permute 16-byte register"%} |
|
14134 size(4); |
|
14135 ins_encode %{ |
|
14136 __ xxpermdi($dst$$VectorSRegister, $src1$$VectorSRegister, $src2$$VectorSRegister, $zero$$constant); |
|
14137 %} |
|
14138 ins_pipe(pipe_class_default); |
|
14139 %} |
|
14140 |
|
14141 instruct repl2L_reg_Ex(vecX dst, iRegLsrc src) %{ |
|
14142 match(Set dst (ReplicateL src)); |
|
14143 predicate(n->as_Vector()->length() == 2); |
|
14144 expand %{ |
|
14145 vecX tmpV; |
|
14146 immI8 zero %{ (int) 0 %} |
|
14147 mtvsrd(tmpV, src); |
|
14148 xxpermdi(dst, tmpV, tmpV, zero); |
|
14149 %} |
|
14150 %} |
|
14151 |
|
14152 instruct repl2L_immI0(vecX dst, immI_0 zero) %{ |
|
14153 match(Set dst (ReplicateL zero)); |
|
14154 predicate(n->as_Vector()->length() == 2); |
|
14155 |
|
14156 format %{ "XXLXOR $dst, $zero \t// replicate2L" %} |
|
14157 size(4); |
|
14158 ins_encode %{ |
|
14159 __ xxlxor($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
14160 %} |
|
14161 ins_pipe(pipe_class_default); |
|
14162 %} |
|
14163 |
|
14164 instruct repl2L_immIminus1(vecX dst, immI_minus1 src) %{ |
|
14165 match(Set dst (ReplicateL src)); |
|
14166 predicate(n->as_Vector()->length() == 2); |
|
14167 |
|
14168 format %{ "XXLEQV $dst, $src \t// replicate16B" %} |
|
14169 size(4); |
|
14170 ins_encode %{ |
|
14171 __ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister); |
|
14172 %} |
|
14173 ins_pipe(pipe_class_default); |
|
14174 %} |
|
13486 |
14175 |
13487 // ============================================================================ |
14176 // ============================================================================ |
13488 // Safepoint Instruction |
14177 // Safepoint Instruction |
13489 |
14178 |
13490 instruct safePoint_poll(iRegPdst poll) %{ |
14179 instruct safePoint_poll(iRegPdst poll) %{ |