From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-f176.google.com (mail-yw1-f176.google.com [209.85.128.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFF07384223 for ; Sat, 10 Oct 2026 02:20:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.176 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791598847; cv=none; b=jUQ+qXfbP9Dl1WjmuCKrlBe8Cl8NXCeO+7AkjTUlVhXvKpGBwwl4HzQjQ8ir7b7kkXPlC2bViBNrx0+nmw6MziQr1bzY4Db6x1MNby06rQM8EiRsNLHRKwxfbAivoGCh2a80DQWl9C2FbQ5g6O4Zxp7YmMr8Xz15MOaQCfKSVUA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791598847; c=relaxed/simple; bh=ajMR9wriE6H4hnRyZehwGFnQ9zm37m15JPxPCyZmK7w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FnEhwxDTdVHFb/018b87ZoSIlAju3QTJClWqC+oX8QRzqA/BLDJwct4M8iNn10awm8OJAEKsCjK4o97wgAsP1o1ZoTWup4Fngj2GzBWcWLGL1QA+QAG80Bm0dcVBI3TGwkaznVhjVRi/U86878sVXDCJsaYnPAwT1X3PYdxyY34= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BTY9/Jc6; arc=none smtp.client-ip=209.85.128.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BTY9/Jc6" Received: by mail-yw1-f176.google.com with SMTP id 00721157ae682-8ac9d666d4eso1755867b3.3 for ; Fri, 09 Oct 2026 19:20:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791598844; x=1792203644; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=nptkRAMUsiGRhK+Kku+TFYLcLth8GwQXjFMlm17rysQ=; b=BTY9/Jc6jU99bNN0v4EZpCH8aGvASm240KakFik6ciDt5il54DMc4Irf/j1Avi7/Gw EGaPr49qsZE3LhSwCOcC5WjBbw4TLhWLUN6nKodFdsRLYmKGnqji3Gavks/W+bV1ivyI 5mNulEIxsRlEPAx4ilajLiviszx79s0wVtFCa3HqGphZLezV6sS4bt4/LqQMoqi0coAg umR1toKIDfO0msclfRELsD/93LrP9FGTFANOackdhhqWCtkTWzHImJQ0pVtXuQ4NLiPK MkLFOlyl3PHismg02Y9iuC0WOwrGsRm0Xdl2Raep5t8WRcHdgB2hutHipzj+t5seiegO yxnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791598844; x=1792203644; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=nptkRAMUsiGRhK+Kku+TFYLcLth8GwQXjFMlm17rysQ=; b=n2RCkXEXZ4vAfNEgx6C6YRkwV0N+E82Ze64jd9qi3DRoDzB3V2zGmxXTwcpNq3vA6a 4lCECYBrmzxGGN4O+pXCmxXbuPXJiSkexjNiLM8ELiMN0y2tt9C6253rm6sQ/HsXt0XR AZn77cbEq8dj/jh7hnHMeKoHNnQOdA/I5Hp1pHc2EsMIxAJ/Iv8Xa2ljWRxNGwUfqHHB HTfwlQ35f9tR6RMSr0zppxf4oJ8TS8cu7z09yKmuY5umppHVLEarwXdXWTMCnMNQL8nK TuikqxCFSkKzwjdR2G1zRAJ+x30bM/LTtm97O5bBXEl63pEatMJ2r6v6Vq4hBUs+pyFn sP3Q== X-Forwarded-Encrypted: i=1; AKwUvBzo4tsidU5wLdKpkcXLPwjzaf0oFXbb6wrQLCYrfbu3sGurtFo/wamr6ljHBrI6VSUdsnpq3z1sfdtvjK4=@vger.kernel.org X-Gm-Message-State: AFq9FYJWfegll968t0EE8Z/u+yMh4PR/+Zim0imJuYjPofQTN54aPqOs H3RiB5CK1k6ri0tI2Dt0FVlPGATQgG+ic42CwpDZRx85NTMIxi1rvNjL X-Gm-Gg: AYBFou2+KlReXpt/jT1DS5tjuT7OsMKp0FAEH03fDsnoTMemPXZg686WPKN8hvDFyf1 cLCdHOTDNkjDHmE2Vl8ssrFNGyLO/iVsAafaHFfC9XRUHS7jDMSLf5/45k02gu1zu08jVgBNyUP Z6gV4s39C2uEVrsbeucGi4Z8Y3of123M4OV4ZrvbxZtkKsCz9OyLH1klSjX/HYb1HkcALf3g4vO ty/cIx4KR83kgyh3j750e6w3DPAXCAewZ81P7+sRGGfAv0+BfZ++aDqvNBhsgQSE/8/Dph0ATRK 7QBox+5WhIespRh0fK2KkQdsKZtt1ZIGWI9IMI9JgrUarJvjRR0LCeOK8yzjZRzE4pe8sdw2JEK 19qm6NvdtyDYsDZ/du/BgH09wevUqs4YN6vAJ++F0+Fjl+KpHY3F5v360u2HUFm8RGqBfNGvXEX P3fWAMpL38CfKC4L8I58V4e9sIQEKXRKOEsNTMoUYybF4efS95uya9ZUGt5pJCMKfbIRGvPXi2e ajUVoXGfs5j+YnaX56EBnvEvzJQ+6MntgfEXFTisSsOHPqY5lXmEExt X-Received: by 2002:a05:690c:6b12:b0:8ab:400f:75ca with SMTP id 00721157ae682-8b07ee8393bmr10390787b3.89.1791598843713; Fri, 09 Oct 2026 19:20:43 -0700 (PDT) Received: from localhost ([2600:1702:7a90:6f9f:8bc4:8aec:108d:7a04]) by smtp.gmail.com with ESMTPSA id 00721157ae682-8b07f281184sm13948507b3.49.2026.10.09.19.20.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Oct 2026 19:20:42 -0700 (PDT) From: Matt Turner To: Magnus Lindholm Cc: Richard Henderson , linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, kernel test robot , oe-kbuild-all@lists.linux.dev, Matt Turner Subject: [PATCH] alpha: add 128-bit shift helpers Date: Fri, 9 Oct 2026 22:20:39 -0400 Message-ID: <20261010022039.1610210-1-mattst88@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Selecting ARCH_SUPPORTS_INT128 lets generic code shift __int128 values by a variable count. gcc open-codes such a shift when optimizing for speed, but with CONFIG_CC_OPTIMIZE_FOR_SIZE=y it calls the libgcc routines __ashlti3, __ashrti3 and __lshrti3 instead. The kernel does not link against libgcc and Alpha does not provide them, so the link fails: alpha-linux-ld: lib/ubsan.o: in function `get_signed_val': (.text+0x1c0): undefined reference to `__ashlti3' (.text+0x1f8): undefined reference to `__ashrti3' alpha-linux-ld: kernel/time/timekeeping.o: in function `delta_to_ns_safe': (.text+0x2ac): undefined reference to `__lshrti3' Provide the three helpers in C, as s390 does, and export them for modules. They are built into the kernel proper rather than lib.a so the exports are present even when nothing built in references them. The 64x64 to 128-bit multiply is always expanded inline with mulq/umulh, so no __multi3 is needed. Fixes: fd04433a5bf3 ("alpha: select ARCH_SUPPORTS_INT128") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202610090831.DSxrGQRc-lkp@intel.com/ Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Matt Turner --- Magnus, this is an alternative to dropping the select. It applies on top of for-next (496e328c6107). If you would rather drop "alpha: select ARCH_SUPPORTS_INT128" for now, I will resend this without the Fixes tag, followed by the select, as a two-patch series. Tested with gcc 16: defconfig plus CONFIG_CC_OPTIMIZE_FOR_SIZE=y and CONFIG_UBSAN=y builds and links (vmlinux and modules, W=1), and the helpers match the compiler's inline shifts for every count from 0 to 127 in a userspace test. Not boot tested. arch/alpha/include/asm/asm-prototypes.h | 6 +++ arch/alpha/lib/Makefile | 2 + arch/alpha/lib/tishift.c | 70 +++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 arch/alpha/lib/tishift.c diff --git a/arch/alpha/include/asm/asm-prototypes.h b/arch/alpha/include/asm/asm-prototypes.h index c8ae46fc2e74..672fea15032f 100644 --- a/arch/alpha/include/asm/asm-prototypes.h +++ b/arch/alpha/include/asm/asm-prototypes.h @@ -17,3 +17,9 @@ extern void __remlu(void); extern void __divqu(void); extern void __remqu(void); extern unsigned long __udiv_qrnnd(unsigned long *, unsigned long, unsigned long , unsigned long); + +#ifdef CONFIG_ARCH_SUPPORTS_INT128 +extern __int128_t __ashlti3(__int128_t a, int shift); +extern __int128_t __ashrti3(__int128_t a, int shift); +extern __int128_t __lshrti3(__int128_t a, int shift); +#endif diff --git a/arch/alpha/lib/Makefile b/arch/alpha/lib/Makefile index 84046e730e6d..f77d4a46f2e6 100644 --- a/arch/alpha/lib/Makefile +++ b/arch/alpha/lib/Makefile @@ -35,6 +35,8 @@ lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \ callback_srm.o srm_puts.o srm_printk.o \ fls.o +obj-$(CONFIG_ARCH_SUPPORTS_INT128) += tishift.o + # The division routines are built from single source, with different defines. AFLAGS___divqu.o = -DDIV AFLAGS___remqu.o = -DREM diff --git a/arch/alpha/lib/tishift.c b/arch/alpha/lib/tishift.c new file mode 100644 index 000000000000..488e1e483d48 --- /dev/null +++ b/arch/alpha/lib/tishift.c @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * 128-bit shift helpers. + * + * gcc open-codes a variable 128-bit shift when optimizing for speed, but + * calls these libgcc routines when optimizing for size. + */ + +#include +#include +#include + +union ti { + __int128_t val; + struct { + u64 low; + u64 high; + }; +}; + +__int128_t __ashlti3(__int128_t a, int shift) +{ + union ti ti = { .val = a }; + + if (!shift) + return ti.val; + if (shift < 64) { + ti.high = (ti.high << shift) | (ti.low >> (64 - shift)); + ti.low <<= shift; + } else { + ti.high = ti.low << (shift - 64); + ti.low = 0; + } + return ti.val; +} +EXPORT_SYMBOL(__ashlti3); + +__int128_t __ashrti3(__int128_t a, int shift) +{ + union ti ti = { .val = a }; + + if (!shift) + return ti.val; + if (shift < 64) { + ti.low = (ti.low >> shift) | (ti.high << (64 - shift)); + ti.high = (s64)ti.high >> shift; + } else { + ti.low = (s64)ti.high >> (shift - 64); + ti.high = (s64)ti.high >> 63; + } + return ti.val; +} +EXPORT_SYMBOL(__ashrti3); + +__int128_t __lshrti3(__int128_t a, int shift) +{ + union ti ti = { .val = a }; + + if (!shift) + return ti.val; + if (shift < 64) { + ti.low = (ti.low >> shift) | (ti.high << (64 - shift)); + ti.high >>= shift; + } else { + ti.low = ti.high >> (shift - 64); + ti.high = 0; + } + return ti.val; +} +EXPORT_SYMBOL(__lshrti3); -- 2.55.0