From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10335 invoked by alias); 29 Jul 2009 16:57:31 -0000 Received: (qmail 10324 invoked by uid 22791); 29 Jul 2009 16:57:30 -0000 X-SWARE-Spam-Status: No, hits=1.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_21,J_CHICKENPOX_31,J_CHICKENPOX_41,J_CHICKENPOX_51,SARE_SUB_ENC_UTF8,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mailout1.go2.pl (HELO mailout1.go2.pl) (193.17.41.11) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 29 Jul 2009 16:57:23 +0000 Received: from mailout1.go2.pl (unknown [10.0.0.103]) by mailout1.go2.pl (Postfix) with ESMTP id E66255D5150; Wed, 29 Jul 2009 18:57:16 +0200 (CEST) Received: from o2.pl (unknown [10.0.0.33]) by mailout1.go2.pl (Postfix) with SMTP; Wed, 29 Jul 2009 18:57:15 +0200 (CEST) Subject: =?UTF-8?Q?Re:_m68k_-_GCC_4.4.0_generates_not_so_good_code_from_asm?= =?UTF-8?Q?_inline?= From: =?UTF-8?Q?ami=5Fstuff?= To: =?UTF-8?Q?ami=5Fstuff?= Cc: gcc@gcc.gnu.org In-Reply-To: <57be0fcf.7526396c.4a703562.deb8b@o2.pl> References: <57be0fcf.7526396c.4a703562.deb8b@o2.pl> Mime-Version: 1.0 Message-ID: <50a927e3.506a88ff.4a707f6a.ca5d5@o2.pl> Date: Wed, 29 Jul 2009 16:57:00 -0000 X-Originator: 212.67.149.145 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org X-SW-Source: 2009-07/txt/msg00605.txt.bz2 When I use -O1 with GCC 4.4.0 (-m68060 -fomit-frame-pointer), I get better = code. #include #include inline int64_t MUL64(int a, int b) { uint32_t resh, resl; uint32_t au =3D a; uint32_t bu =3D b; __asm__ ("move.l %0, d5\n\t" "move.l %1, d4\n\t" "moveq #16, d3\n\t" "move.l %0, d2\n\t" "mulu %1, %0\n\t" "lsr.l d3, d4\n\t" "lsr.l d3, d5\n\t" "mulu d4, d2\n\t" "mulu d5, %1\n\t" "mulu d5, d4\n\t" "move.l d2, d5\n\t" "lsr.l d3, d2\n\t" "add.w %1, d5\n\t" "addx.l d2, d4\n\t" "lsl.l d3, d5\n\t" "lsr.l d3, %1\n\t" "add.l d5, %0\n\t" "addx.l d4, %1\n\t" : "=3Dd"(resl), "=3Dd"(resh) : "0"(au), "1"(bu) : "d2", "d3", "d4", "d5"); if (a < 0) resh -=3D bu; if (b < 0) resh -=3D au; return ((uint64_t)resh << 32) | resl; } GCC 4.4.0 -O3: #NO_APP .text .even .globl _MUL64 _MUL64: movem.l #16128,-(sp) move.l 28(sp),d0 move.l 32(sp),a0 move.l d0,d6 move.l a0,d1 #APP ;# 11 "mul645.c" 1 move.l d6, d5 move.l d1, d4 moveq #16, d3 move.l d6, d2 mulu d1, d6 lsr.l d3, d4 lsr.l d3, d5 mulu d4, d2 mulu d5, d1 mulu d5, d4 move.l d2, d5 lsr.l d3, d2 add.w d1, d5 addx.l d2, d4 lsl.l d3, d5 lsr.l d3, d1 add.l d5, d6 addx.l d4, d1 #NO_APP tst.l d0 jlt L6 tst.l a0 jlt L7 L3: move.l d1,d2 clr.l d3 move.l d2,d0 move.l d3,d1 or.l d6,d1 move.l d0,d6 move.l d1,d7 move.l d7,d1 movem.l (sp)+,#252 rts L7: sub.l d0,d1 move.l d1,d2 clr.l d3 move.l d2,d0 move.l d3,d1 or.l d6,d1 move.l d0,d6 move.l d1,d7 move.l d7,d1 movem.l (sp)+,#252 rts L6: sub.l a0,d1 tst.l a0 jge L3 jra L7 GCC 4.4.0 -O2: #NO_APP .text .even .globl _MUL64 _MUL64: movem.l #16128,-(sp) move.l 28(sp),d0 move.l 32(sp),a0 move.l d0,d6 move.l a0,d1 #APP ;# 11 "mul645.c" 1 move.l d6, d5 move.l d1, d4 moveq #16, d3 move.l d6, d2 mulu d1, d6 lsr.l d3, d4 lsr.l d3, d5 mulu d4, d2 mulu d5, d1 mulu d5, d4 move.l d2, d5 lsr.l d3, d2 add.w d1, d5 addx.l d2, d4 lsl.l d3, d5 lsr.l d3, d1 add.l d5, d6 addx.l d4, d1 #NO_APP tst.l d0 jlt L6 tst.l a0 jlt L7 L3: move.l d1,d2 clr.l d3 move.l d2,d0 move.l d3,d1 or.l d6,d1 move.l d0,d6 move.l d1,d7 move.l d7,d1 movem.l (sp)+,#252 rts L7: sub.l d0,d1 move.l d1,d2 clr.l d3 move.l d2,d0 move.l d3,d1 or.l d6,d1 move.l d0,d6 move.l d1,d7 move.l d7,d1 movem.l (sp)+,#252 rts L6: sub.l a0,d1 tst.l a0 jge L3 jra L7 GCC 4.4.0 -O1: #NO_APP .text .even .globl _MUL64 _MUL64: movem.l #16176,-(sp) move.l 40(sp),d0 move.l 36(sp),a2 move.l a2,d7 move.l d0,d6 #APP ;# 11 "mul645.c" 1 move.l d7, d5 move.l d6, d4 moveq #16, d3 move.l d7, d2 mulu d6, d7 lsr.l d3, d4 lsr.l d3, d5 mulu d4, d2 mulu d5, d6 mulu d5, d4 move.l d2, d5 lsr.l d3, d2 add.w d6, d5 addx.l d2, d4 lsl.l d3, d5 lsr.l d3, d6 add.l d5, d7 addx.l d4, d6 #NO_APP tst.l a2 jge L2 sub.l d0,d6 L2: tst.l d0 jge L3 sub.l a2,d6 L3: move.l d6,d1 clr.l d2 or.l d7,d2 move.l d1,d0 move.l d2,d1 movem.l (sp)+,#3324 rts GCC 4.4.0 -O0: #NO_APP .text .even .globl _MUL64 _MUL64: lea (-16,sp),sp movem.l #16128,-(sp) move.l 44(sp),32(sp) move.l 48(sp),36(sp) move.l 32(sp),d1 move.l 36(sp),d0 #APP ;# 11 "mul645.c" 1 move.l d1, d5 move.l d0, d4 moveq #16, d3 move.l d1, d2 mulu d0, d1 lsr.l d3, d4 lsr.l d3, d5 mulu d4, d2 mulu d5, d0 mulu d5, d4 move.l d2, d5 lsr.l d3, d2 add.w d0, d5 addx.l d2, d4 lsl.l d3, d5 lsr.l d3, d0 add.l d5, d1 addx.l d4, d0 #NO_APP move.l d1,28(sp) move.l d0,24(sp) tst.l 44(sp) jge L2 move.l 36(sp),d0 sub.l d0,24(sp) L2: tst.l 48(sp) jge L3 move.l 32(sp),d2 sub.l d2,24(sp) L3: move.l 24(sp),d7 clr.l d6 move.l d7,d0 clr.l d1 move.l 28(sp),a1 lea 0.w,a0 move.l a0,d2 move.l a1,d3 or.l d2,d0 or.l d3,d1 movem.l (sp)+,#252 lea (16,sp),sp rts=20 Regards