From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9951 invoked by alias); 1 Aug 2014 23:18:54 -0000 Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org Received: (qmail 9940 invoked by uid 89); 1 Aug 2014 23:18:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-lb0-f194.google.com Received: from mail-lb0-f194.google.com (HELO mail-lb0-f194.google.com) (209.85.217.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Fri, 01 Aug 2014 23:18:52 +0000 Received: by mail-lb0-f194.google.com with SMTP id s7so1194093lbd.5 for ; Fri, 01 Aug 2014 16:18:49 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.112.119.142 with SMTP id ku14mr9039441lbb.34.1406935129192; Fri, 01 Aug 2014 16:18:49 -0700 (PDT) Received: by 10.152.29.134 with HTTP; Fri, 1 Aug 2014 16:18:49 -0700 (PDT) Date: Fri, 01 Aug 2014 23:18:00 -0000 Message-ID: Subject: fuse multiple ops into one new op From: Cherry Vanc To: gcc-help@gcc.gnu.org Content-Type: text/plain; charset=UTF-8 X-SW-Source: 2014-08/txt/msg00010.txt.bz2 I need to fuse multiple instructions into a single one. ... r1 = (r1) op1 (const) ... ... r1 = (r1) op2 (r2) ... ... r3 = op3 (r1) ... I defined a peephole2 pattern in my GCC backend .md file. If these three instructions are contiguous, then I do get my test "testnew" instruction. If these instructions are far apart, I dont. (define_peephole2 [(set (match_operand:DI 0 "register_operand" "") (op1:DI (match_dup 0) (match_operand:SI 1 "immediate_operand" "") )) (set (match_dup 0) (op2:DI (match_operand:DI 2 "register_operand" "") (match_dup 0))) (set (match_dup 0) (sign_extend:DI (op3:SI (match_dup 0))))] "TARGET_MYCORE" [(set (match_dup 0) (sign_extend:DI (op3:SI (op2:SI (op1:SI (match_dup 0) (match_dup 1)) (match_dup 0)))))] "") (define_insn "*testnew" [(set (match_operand:DI 0 "register_operand" "=d") (sign_extend:DI (op3:SI (op2:SI (op1:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "I")) (match_dup 0)))))] "TARGET_MYCORE" "testnew 36" [(set_attr "mode" "DI")]) How can I fuse multiple instructions that are far apart into a new single opcode that MYCORE has ?