From patchwork Tue Sep 1 11:21:00 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georg-Johann Lay X-Patchwork-Id: 142621 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E05A64BA798D for ; Tue, 1 Sep 2026 11:22:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E05A64BA798D Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gjlay.de header.i=@gjlay.de header.a=rsa-sha256 header.s=strato-dkim-0002 header.b=TlwYCpCg; dkim=pass header.d=gjlay.de header.i=@gjlay.de header.a=ed25519-sha256 header.s=strato-dkim-0003 header.b=DpC7Ht7K X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de [81.169.146.216]) by sourceware.org (Postfix) with ESMTPS id 0FDC44BA2E1C for ; Tue, 1 Sep 2026 11:21:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0FDC44BA2E1C Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=gjlay.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gjlay.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0FDC44BA2E1C Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=81.169.146.216 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1788261695; cv=pass; b=IN5TgUYoYrU0yAAocMVwbiarwv9B0AUxgRoYmnESnoMTediTjEPK9bSv2RAHXTmzxYJsbKHCWtd5spnFnrQj+3w7TpmfGPxvNo1Babov/sbGm3UDUKOS5xZNEWPfMFSB5pfhwQ+F+yzrfadpSLmPScVkysbkGlK/9MApb+py3oM= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1788261695; c=relaxed/simple; bh=+sSiU0yuZ+cWWJ2vtpRD/8wqTTOhNzAlCQGDXE6omW0=; h=DKIM-Signature:DKIM-Signature:Message-ID:Date:MIME-Version:To: From:Subject; b=sbs0XDytlbYhw2rTdwISD9MDJ/ZXQSle2r8j6OejSulzbiskfefqmGPEBq5zt7f+2PnGNSC6S7ZL/T3NqtEZmN/8CbGvPqGOoeZbO4NnKnTwhWCRWNJ9A4VwnnZY+1DqvjDPlZdzRKG9ZMRkAUNrDfIFz2jlF3iZKxAM4w5vd2M= ARC-Authentication-Results: i=2; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gjlay.de header.i=@gjlay.de header.a=rsa-sha256 header.s=strato-dkim-0002 header.b=TlwYCpCg; dkim=pass header.d=gjlay.de header.i=@gjlay.de header.a=ed25519-sha256 header.s=strato-dkim-0003 header.b=DpC7Ht7K DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0FDC44BA2E1C ARC-Seal: i=1; a=rsa-sha256; t=1788261691; cv=none; d=strato.com; s=strato-dkim-0002; b=LqPFRMnqMMaqezir/s4GfZdCtNRvhC/jRbS9nFKrGY4XuAq+ORc07dIxPYidwzv/0k TTd9kT8fMoQCINLkGVm1881RoOj6TShKh2gKu1QFm0UQxcsr192/eJJV2h/oFCfxBJw2 ggxRL4KLE6myH6H1FQi/VRH3Jw6o5Mit+WQak2sBGGdBtS4yazQOy7V1qLp8ynYq8sTT 0ZHZbNiw8c088G41h3yWKpZtEyFcL9XL4pNV1XTZI8u8CyZ3XaP18NlH7AhgQKHKuKWl Hx4uI554MWC/kdfwL37UNvNlc0XsSojjpu7tNQlhZYEp3hC7wlyBYTIsiQlkPWi/W6VN 2sxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; t=1788261691; s=strato-dkim-0002; d=strato.com; h=Subject:From:To:Date:Message-ID:Cc:Date:From:Subject:Sender; bh=zLBvqr4wTovq+rEbNDyuuJIzEQtZ3ftp3owdqzPHw0o=; b=K9FR87Wzpa/QWeM9TrlgoBmDIAdYv39xoJY/7RPO0N28AUmW5wTDq76FdbLJDJC+Z+ 0oTNPrID8+IVBaJizYcsGKG+bG5FEhusVVyslEUlyVsQGYbBx88wSbhDpLLXg9DIWqx2 X+QzwJVNBw0TFnOSmbVkp6xx885YUQ+SfnvUAYW+nnNNkcw+5Bvn/eUjGXTRi4a4ncey GsecD5vGgELPtFzzho3b+E5g+kKQN3RvEbmoUCaib96bTpcTtSCAcm9AIM34mH4EQUnQ GhGUfAqM7RAnOlN0Rj+foiLStTfZDJovMV1GbPVpYd24ne6cT7lZ2U7kSnqa6eaXzK3P iDLQ== ARC-Authentication-Results: i=1; strato.com; arc=none; dkim=none X-RZG-CLASS-ID: mo00 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1788261691; s=strato-dkim-0002; d=gjlay.de; h=Subject:From:To:Date:Message-ID:Cc:Date:From:Subject:Sender; bh=zLBvqr4wTovq+rEbNDyuuJIzEQtZ3ftp3owdqzPHw0o=; b=TlwYCpCgCv9T3kF41oTEhef4goMXstHmNWIXOk0m+FbqgEV1rHduZkay6RKSXmj3ue 2sqrdSaYlaiRDGFtaqfAsVbev/szIuhSsb4TdXviUuRX441/1Xg2jD7SJixX8uZnd650 gP/7oDd5Icx+FOA/tNQdA68zTSiV7SAlp++VZZxAdnRpLllUP78rMhKl+dOg4VMzAC6j dSEPGj56Gyti0AnK2FBY3uA/FcPcBlDJiRKrYiR+LN3wGWMxkmE35oKbj4l8OdLTwy6K HnDXqOcPq8BahtCNhls7mccxIGFQkgMRui9hgR8XiMAS1nnEvV2ge+YLlgt+dRbfWbBa 2W/w== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1788261691; s=strato-dkim-0003; d=gjlay.de; h=Subject:From:To:Date:Message-ID:Cc:Date:From:Subject:Sender; bh=zLBvqr4wTovq+rEbNDyuuJIzEQtZ3ftp3owdqzPHw0o=; b=DpC7Ht7KJDAFw8+YD0z+//V5HJCIPPDg+IiG/mckafB9+8L1MsKU0tHGU3WqqpC7aZ HSz/TvIq0grSfgSYoIAg== X-RZG-AUTH: ":LXoWVUeid/7A29J/hMvvT3koxZnKXKoq0dKoR0vdoTJLPTbtkmyzs2x+1Vw=" Received: from [192.168.2.106] by smtp.strato.de (RZmta 55.6.2 DYNA|AUTH) with ESMTPSA id xba5ce281BLR3dz (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits)) (Client did not present a certificate); Tue, 1 Sep 2026 13:21:27 +0200 (CEST) Message-ID: Date: Tue, 1 Sep 2026 13:21:00 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US, de-DE To: "gcc-patches@gcc.gnu.org" , Denis Chertykov From: Georg-Johann Lay Subject: [patch,pushed] AVR: Support 32-bit (saturated) fract multiplications X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org The SQmode and USQmode multiplications were still missing, so I added them. They follow the default ABI. Johann --- libgcc/ * config/avr/t-avr (FUNCS_notiny): Add _mulsq3. * config/avr/lib1funcs-fixed.S (__mulsq3, __ssmulsq3): Implement. * config/avr/lib1funcs.S (__umulsidi3): Add ENTRYs __mulusq3, __usmulusq3. diff --git a/libgcc/config/avr/lib1funcs-fixed.S b/libgcc/config/avr/lib1funcs-fixed.S index 1ac7b5cf986..5fac4ae464b 100644 --- a/libgcc/config/avr/lib1funcs-fixed.S +++ b/libgcc/config/avr/lib1funcs-fixed.S @@ -906,6 +906,71 @@ DEFUN __ssmulsa3 #undef C7 #undef SS +/******************************************************** + Fixed signed (saturated) Multiplication s.31 x s.31 +*********************************************************/ + +;;; Argument 1 and result +#define A0 22 +#define A1 A0+1 +#define A2 A0+2 +#define A3 A0+3 + +;;; Argument 2 +#define B0 18 +#define B1 B0+1 +#define B2 B0+2 +#define B3 B0+3 + +#if defined (L_mulsq3) +DEFUN __mulsq3 +ENTRY __ssmulsq3 + ;; tmp.7 = result sign + mov __tmp_reg__, A3 + eor __tmp_reg__, B3 + push __tmp_reg__ + .call_if_neg A3, __negsi2 ; A = |A| + .call_if_neg B3, __negsi2_r18 ; B = |B| + + XCALL __umulsidi3 + ;; Adjust for only 31 fractional bits. + lsl A0 + rol A1 + rol A2 + rol A3 + + ;; r30.7 = result sign + pop r30 + + brcs .Lsaturate + ;; In the negative result case, A = 0x80.. is no overflow, + ;; but treating it as such keeps the value unchanged. + brmi .Lsaturate ; Overflow? + ;; Handle result sign. + sbrs r30, 7 + ret + XJMP __negsi2 +.Lsaturate: + ;; r30.7 = 0 -> C = 1 -> 0x7f.. + ;; r30.7 = 1 -> C = 0 -> 0x80.. + cpi r30, 0x80 + sbc A0, A0 + sbc A1, A1 + wmov A2, A0 + subi A3, 0x80 + ret +ENDF __mulsq3 +#endif /* L_mulsq3 */ + +#undef A0 +#undef A1 +#undef A2 +#undef A3 +#undef B0 +#undef B1 +#undef B2 +#undef B3 + /******************************************************* Fixed 64 x 64 saturated Multiplication *******************************************************/ diff --git a/libgcc/config/avr/lib1funcs.S b/libgcc/config/avr/lib1funcs.S index 1a7ed9483cf..c2df9d92871 100644 --- a/libgcc/config/avr/lib1funcs.S +++ b/libgcc/config/avr/lib1funcs.S @@ -943,6 +943,8 @@ DEFUN __muldi3 ;; X = R20[2] = B2[2] ;; Z = R22[2] = A0[2] DEFUN __umulsidi3 +ENTRY __mulusq3 +ENTRY __usmulusq3 clt ;; FALLTHRU ENDF __umulsidi3 @@ -1091,6 +1093,8 @@ DEFUN __mulsidi3 ENDF __mulsidi3 DEFUN __umulsidi3 +ENTRY __mulusq3 +ENTRY __usmulusq3 clt ; skipped ;; Save 10 Registers: R10..R17, R28, R29 do_prologue_saves 10 diff --git a/libgcc/config/avr/t-avr b/libgcc/config/avr/t-avr index 947666269f7..891afd36473 100644 --- a/libgcc/config/avr/t-avr +++ b/libgcc/config/avr/t-avr @@ -98,6 +98,7 @@ FUNCS_notiny += \ _fractsfhq _fractsfuhq _fractsfha _fractsfuha \ _fractsfsq _fractsfusq _fractsfsa _fractsfusa \ _mulsa3 _mulusa3 \ + _mulsq3 \ _usmulusa3 _ssmulsa3 \ _umulditi3_raw \ _muluda3 _muluta3 _muludq3 \