From patchwork Mon Oct 10 15:23:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Jambor X-Patchwork-Id: 680478 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3st4qL60V2z9ry7 for ; Tue, 11 Oct 2016 03:10:54 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=Q/nnnMT+; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-date:resent-message-id:resent-to:from:date :subject:to:message-id; q=dns; s=default; b=ru8lJqcxnG5I9s3AdSLm WdI2C7zPhLKXyZGuw08UxTU/uns9mIJQTlD1Snf7DC2vlGEHgscs0vkM3mAdbxnx SqdtVkDRCdSd0CI75zDqqyv1sAzLfzPaz9aWnxi6YBkuLhsK20y5pWQSLOieefmg UUFVj7y9COEgiBbdDsN45RM= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-date:resent-message-id:resent-to:from:date :subject:to:message-id; s=default; bh=nBfpwKW2CtjlMK5z7w7+d+9cuZ Y=; b=Q/nnnMT+4758T5+UWXndgUOxtChXhMapfQ55/TKHMvGs7PvHYiaxEnzQRe wPx+hebIzyCUDgeqa/U6I9zuOKQDPCRUM/MBqGRA5U4BoYmSahDuPgF9D96tegoT rGRzeOzRaZ/VhWNZs5LZ5Awqlo0/oVIPmIasQ5R+cnerkRhIQ= Received: (qmail 88595 invoked by alias); 10 Oct 2016 16:09:38 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 88473 invoked by uid 89); 10 Oct 2016 16:09:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=BAYES_00, SPF_SOFTFAIL autolearn=no version=3.3.2 spammy=H*MI:eggs, H*M:eggs, *tmp, multiplication X-HELO: eggs.gnu.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (208.118.235.92) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 10 Oct 2016 16:09:23 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1btd8i-0002Ku-6j for gcc-patches@gcc.gnu.org; Mon, 10 Oct 2016 12:09:21 -0400 Received: from mx2.suse.de ([195.135.220.15]:45035) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1btd8i-0002KX-0b for gcc-patches@gcc.gnu.org; Mon, 10 Oct 2016 12:09:20 -0400 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C61F4ADC5 for ; Mon, 10 Oct 2016 16:09:16 +0000 (UTC) Resent-From: Martin Jambor Resent-Date: Mon, 10 Oct 2016 18:09:16 +0200 Resent-Message-ID: <20161010160916.th7vk6pvnryobufb@virgil.suse.cz> Resent-To: GCC Patches From: Martin Jambor Date: Mon, 10 Oct 2016 17:23:29 +0200 Subject: [hsa-branch 6/9] Expand FMA_EXPR to HSAIL To: GCC Patches X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] Message-ID: X-Received-From: 195.135.220.15 X-IsSubscribed: yes Hi, the following patch adds expansion of fused multiply and add to HSAIL. The scalar variant is straightforwardly converted to an HSAIL equivalent while any vector instance is expanded into separate multiplication and additions. Committed to the branch, queued for merge to trunk soon. Thanks, Martin 2016-10-03 Martin Jambor * hsa-gen.c (gen_hsa_insns_for_operation_assignment): Handle FMA_EXPR and ternary operators in general. Remove obsolete fallthrough comments. --- gcc/hsa-gen.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c index ac83e9e..ad40087 100644 --- a/gcc/hsa-gen.c +++ b/gcc/hsa-gen.c @@ -3076,6 +3076,23 @@ gen_hsa_insns_for_operation_assignment (gimple *assign, hsa_bb *hbb) case NEGATE_EXPR: opcode = BRIG_OPCODE_NEG; break; + case FMA_EXPR: + /* There is a native HSA instruction for scalar FMAs but not for vector + ones. */ + if (TREE_CODE (TREE_TYPE (lhs)) == VECTOR_TYPE) + { + hsa_op_reg *dest + = hsa_cfun->reg_for_gimple_ssa (gimple_assign_lhs (assign)); + hsa_op_with_type *op1 = hsa_reg_or_immed_for_gimple_op (rhs1, hbb); + hsa_op_with_type *op2 = hsa_reg_or_immed_for_gimple_op (rhs2, hbb); + hsa_op_with_type *op3 = hsa_reg_or_immed_for_gimple_op (rhs3, hbb); + hsa_op_reg *tmp = new hsa_op_reg (dest->m_type); + gen_hsa_binary_operation (BRIG_OPCODE_MUL, tmp, op1, op2, hbb); + gen_hsa_binary_operation (BRIG_OPCODE_ADD, dest, tmp, op3, hbb); + return; + } + opcode = BRIG_OPCODE_MAD; + break; case MIN_EXPR: opcode = BRIG_OPCODE_MIN; break; @@ -3275,14 +3292,18 @@ gen_hsa_insns_for_operation_assignment (gimple *assign, hsa_bb *hbb) switch (rhs_class) { case GIMPLE_TERNARY_RHS: - gcc_unreachable (); + { + hsa_op_with_type *op3 = hsa_reg_or_immed_for_gimple_op (rhs3, hbb); + hsa_insn_basic *insn = new hsa_insn_basic (4, opcode, dest->m_type, dest, + op1, op2, op3); + hbb->append_insn (insn); + } return; - /* Fall through */ case GIMPLE_BINARY_RHS: gen_hsa_binary_operation (opcode, dest, op1, op2, hbb); break; - /* Fall through */ + case GIMPLE_UNARY_RHS: gen_hsa_unary_operation (opcode, dest, op1, hbb); break;