void NeonVectorBackend::visit(const Nodecl::VectorAdd& n) { walk(n.get_lhs()); walk(n.get_rhs()); TL::Type t = n.get_type(); ERROR_CONDITION(!t.is_vector(), "Invalid type", 0); TL::Type element = t.vector_element(); ERROR_CONDITION(!element.is_float(), "Not implemented: %s", print_declarator(element.get_internal_type())); TL::Symbol builtin_fun = TL::Scope::get_global_scope().get_symbol_from_name("vaddq_f32"); ERROR_CONDITION(!builtin_fun.is_valid(), "Symbol not found", 0); n.replace( Nodecl::FunctionCall::make( builtin_fun.make_nodecl(/* set_ref_type */ true), Nodecl::List::make( n.get_lhs(), n.get_rhs()), /* alternate-name */ Nodecl::NodeclBase::null(), /* function-form */ Nodecl::NodeclBase::null(), n.get_type(), n.get_locus() ) ); }
void KNCModuleVisitor::visit(const Nodecl::VectorAdd& node) { TL::Type type = node.get_type().basic_type(); // Intrinsic name file << "_mm512_add"; // Postfix if (type.is_float()) { file << "_ps"; } else if (type.is_double()) { file << "_pd"; } else if (type.is_signed_int() || type.is_unsigned_int()) { file << "_epi32"; } else if (type.is_signed_short_int() || type.is_unsigned_short_int()) { file << "_epi16"; } else if (type.is_char() || type.is_signed_char() || type.is_unsigned_char()) { file << "_epi8"; } else { running_error("KNC Codegen: Node %s at %s has an unsupported type.", ast_print_node_type(node.get_kind()), node.get_locus_str().c_str()); } file << "("; walk(node.get_lhs()); file << ", "; walk(node.get_rhs()); file << ")"; }