2836 kit.replace_call(vbox_alloc, vec_obj, true); 2837 C->remove_macro_node(vbox_alloc); 2838 return vec_obj; 2839 } 2840 2841 void Compile::expand_vunbox_node(VectorUnboxNode* vec_unbox) { 2842 if (vec_unbox->outcnt() > 0) { 2843 GraphKit kit; 2844 PhaseGVN& gvn = kit.gvn(); 2845 2846 Node* obj = vec_unbox->obj(); 2847 const TypeInstPtr* tinst = gvn.type(obj)->isa_instptr(); 2848 ciInstanceKlass* from_kls = tinst->klass()->as_instance_klass(); 2849 BasicType bt = vec_unbox->vect_type()->element_basic_type(); 2850 BasicType masktype = bt; 2851 2852 const char* field_name = "vec"; 2853 if (from_kls->is_vectormask()) { 2854 field_name = "bits"; 2855 bt = T_BOOLEAN; 2856 } 2857 2858 ciField* field = from_kls->get_field_by_name(ciSymbol::make(field_name), 2859 ciSymbol::make(TypeArrayKlass::external_name(bt)), false); 2860 2861 int offset = field->offset_in_bytes(); 2862 Node* vec_adr = kit.basic_plus_adr(obj, offset); 2863 2864 Node* mem = vec_unbox->mem(); 2865 Node* ctrl = vec_unbox->in(0); 2866 Node* vec_field_ld = LoadNode::make(gvn, 2867 ctrl, 2868 mem, 2869 vec_adr, 2870 vec_adr->bottom_type()->is_ptr(), 2871 TypeOopPtr::make_from_klass(field->type()->as_klass()), 2872 T_OBJECT, 2873 MemNode::unordered); 2874 vec_field_ld = gvn.transform(vec_field_ld); 2875 2876 Node* adr = kit.array_element_address(vec_field_ld, gvn.intcon(0), bt); 2877 const TypePtr* adr_type = adr->bottom_type()->is_ptr(); 2878 int num_elem = vec_unbox->bottom_type()->is_vect()->length(); 2879 Node* vec_val_load = LoadVectorNode::make(0, 2880 ctrl, 2881 mem, 2882 adr, 2883 adr_type, 2884 num_elem, 2885 bt); 2886 vec_val_load = gvn.transform(vec_val_load); 2887 2888 if (from_kls->is_vectormask() && masktype != T_BOOLEAN) { 2889 assert(vec_unbox->bottom_type()->is_vect()->element_basic_type() == masktype, "expect mask type consistency"); 2890 vec_val_load = gvn.transform(new VectorLoadMaskNode(vec_val_load, TypeVect::make(masktype, num_elem))); 2891 } 2892 2893 gvn.hash_delete(vec_unbox); 2894 vec_unbox->disconnect_inputs(NULL, C); 2895 C->gvn_replace_by(vec_unbox, vec_val_load); 2896 } 2897 C->remove_macro_node(vec_unbox); 2898 } 2899 2900 void Compile::eliminate_vbox_alloc_node(VectorBoxAllocateNode* vbox_alloc) { 2901 JVMState* jvms = clone_jvms(C, vbox_alloc); 2902 GraphKit kit(jvms); 2903 // FIXME replace VBA with a safepoint. Otherwise, no safepoints left in tight loops. 2904 kit.replace_call(vbox_alloc, kit.top(), true); 2905 C->remove_macro_node(vbox_alloc); 2906 } 2907 2908 //------------------------------Code_Gen--------------------------------------- 2909 // Given a graph, generate code for it 2910 void Compile::Code_Gen() { | 2836 kit.replace_call(vbox_alloc, vec_obj, true); 2837 C->remove_macro_node(vbox_alloc); 2838 return vec_obj; 2839 } 2840 2841 void Compile::expand_vunbox_node(VectorUnboxNode* vec_unbox) { 2842 if (vec_unbox->outcnt() > 0) { 2843 GraphKit kit; 2844 PhaseGVN& gvn = kit.gvn(); 2845 2846 Node* obj = vec_unbox->obj(); 2847 const TypeInstPtr* tinst = gvn.type(obj)->isa_instptr(); 2848 ciInstanceKlass* from_kls = tinst->klass()->as_instance_klass(); 2849 BasicType bt = vec_unbox->vect_type()->element_basic_type(); 2850 BasicType masktype = bt; 2851 2852 const char* field_name = "vec"; 2853 if (from_kls->is_vectormask()) { 2854 field_name = "bits"; 2855 bt = T_BOOLEAN; 2856 } else if (from_kls->is_vectorshuffle()) { 2857 field_name = "reorder"; 2858 bt = T_BYTE; 2859 } 2860 2861 ciField* field = from_kls->get_field_by_name(ciSymbol::make(field_name), 2862 ciSymbol::make(TypeArrayKlass::external_name(bt)), false); 2863 2864 int offset = field->offset_in_bytes(); 2865 Node* vec_adr = kit.basic_plus_adr(obj, offset); 2866 2867 Node* mem = vec_unbox->mem(); 2868 Node* ctrl = vec_unbox->in(0); 2869 Node* vec_field_ld = LoadNode::make(gvn, 2870 ctrl, 2871 mem, 2872 vec_adr, 2873 vec_adr->bottom_type()->is_ptr(), 2874 TypeOopPtr::make_from_klass(field->type()->as_klass()), 2875 T_OBJECT, 2876 MemNode::unordered); 2877 vec_field_ld = gvn.transform(vec_field_ld); 2878 2879 Node* adr = kit.array_element_address(vec_field_ld, gvn.intcon(0), bt); 2880 const TypePtr* adr_type = adr->bottom_type()->is_ptr(); 2881 int num_elem = vec_unbox->bottom_type()->is_vect()->length(); 2882 Node* vec_val_load = LoadVectorNode::make(0, 2883 ctrl, 2884 mem, 2885 adr, 2886 adr_type, 2887 num_elem, 2888 bt); 2889 vec_val_load = gvn.transform(vec_val_load); 2890 2891 if (from_kls->is_vectormask() && masktype != T_BOOLEAN) { 2892 assert(vec_unbox->bottom_type()->is_vect()->element_basic_type() == masktype, "expect mask type consistency"); 2893 vec_val_load = gvn.transform(new VectorLoadMaskNode(vec_val_load, TypeVect::make(masktype, num_elem))); 2894 } else if (from_kls->is_vectorshuffle()) { 2895 assert(vec_unbox->bottom_type()->is_vect()->element_basic_type() == masktype, "expect shuffle type consistency"); 2896 vec_val_load = gvn.transform(new VectorLoadShuffleNode(vec_val_load, TypeVect::make(masktype, num_elem))); 2897 } 2898 2899 gvn.hash_delete(vec_unbox); 2900 vec_unbox->disconnect_inputs(NULL, C); 2901 C->gvn_replace_by(vec_unbox, vec_val_load); 2902 } 2903 C->remove_macro_node(vec_unbox); 2904 } 2905 2906 void Compile::eliminate_vbox_alloc_node(VectorBoxAllocateNode* vbox_alloc) { 2907 JVMState* jvms = clone_jvms(C, vbox_alloc); 2908 GraphKit kit(jvms); 2909 // FIXME replace VBA with a safepoint. Otherwise, no safepoints left in tight loops. 2910 kit.replace_call(vbox_alloc, kit.top(), true); 2911 C->remove_macro_node(vbox_alloc); 2912 } 2913 2914 //------------------------------Code_Gen--------------------------------------- 2915 // Given a graph, generate code for it 2916 void Compile::Code_Gen() { |