From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
James Hogan <jhogan@kernel.org>,
Waldemar Brodkorb <wbx@openadk.org>,
Ralf Baechle <ralf@linux-mips.org>,
"Maciej W. Rozycki" <macro@mips.com>,
Matthew Fortune <matthew.fortune@mips.com>,
Florian Fainelli <florian@openwrt.org>,
linux-mips@linux-mips.org, Guenter Roeck <linux@roeck-us.net>
Subject: [PATCH 4.9 56/56] MIPS: Implement __multi3 for GCC7 MIPS64r6 builds
Date: Fri, 2 Mar 2018 09:51:42 +0100 [thread overview]
Message-ID: <20180302084452.354487935@linuxfoundation.org> (raw)
In-Reply-To: <20180302084449.568562222@linuxfoundation.org>
4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <jhogan@kernel.org>
commit ebabcf17bcd7ce968b1631ebe08236275698f39b upstream.
GCC7 is a bit too eager to generate suboptimal __multi3 calls (128bit
multiply with 128bit result) for MIPS64r6 builds, even in code which
doesn't explicitly use 128bit types, such as the following:
unsigned long func(unsigned long a, unsigned long b)
{
return a > (~0UL) / b;
}
Which GCC rearanges to:
return (unsigned __int128)a * (unsigned __int128)b > 0xffffffffffffffff;
Therefore implement __multi3, but only for MIPS64r6 with GCC7 as under
normal circumstances we wouldn't expect any calls to __multi3 to be
generated from kernel code.
Reported-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: James Hogan <jhogan@kernel.org>
Tested-by: Waldemar Brodkorb <wbx@openadk.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Maciej W. Rozycki <macro@mips.com>
Cc: Matthew Fortune <matthew.fortune@mips.com>
Cc: Florian Fainelli <florian@openwrt.org>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/17890/
Cc: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/mips/lib/Makefile | 3 +-
arch/mips/lib/libgcc.h | 17 +++++++++++++++
arch/mips/lib/multi3.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 73 insertions(+), 1 deletion(-)
--- a/arch/mips/lib/Makefile
+++ b/arch/mips/lib/Makefile
@@ -15,4 +15,5 @@ obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb
obj-$(CONFIG_CPU_TX39XX) += r3k_dump_tlb.o
# libgcc-style stuff needed in the kernel
-obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o ucmpdi2.o
+obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o multi3.o \
+ ucmpdi2.o
--- a/arch/mips/lib/libgcc.h
+++ b/arch/mips/lib/libgcc.h
@@ -9,10 +9,18 @@ typedef int word_type __attribute__ ((mo
struct DWstruct {
int high, low;
};
+
+struct TWstruct {
+ long long high, low;
+};
#elif defined(__LITTLE_ENDIAN)
struct DWstruct {
int low, high;
};
+
+struct TWstruct {
+ long long low, high;
+};
#else
#error I feel sick.
#endif
@@ -22,4 +30,13 @@ typedef union {
long long ll;
} DWunion;
+#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6)
+typedef int ti_type __attribute__((mode(TI)));
+
+typedef union {
+ struct TWstruct s;
+ ti_type ti;
+} TWunion;
+#endif
+
#endif /* __ASM_LIBGCC_H */
--- /dev/null
+++ b/arch/mips/lib/multi3.c
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/export.h>
+
+#include "libgcc.h"
+
+/*
+ * GCC 7 suboptimally generates __multi3 calls for mips64r6, so for that
+ * specific case only we'll implement it here.
+ *
+ * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82981
+ */
+#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ == 7)
+
+/* multiply 64-bit values, low 64-bits returned */
+static inline long long notrace dmulu(long long a, long long b)
+{
+ long long res;
+
+ asm ("dmulu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b));
+ return res;
+}
+
+/* multiply 64-bit unsigned values, high 64-bits of 128-bit result returned */
+static inline long long notrace dmuhu(long long a, long long b)
+{
+ long long res;
+
+ asm ("dmuhu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b));
+ return res;
+}
+
+/* multiply 128-bit values, low 128-bits returned */
+ti_type notrace __multi3(ti_type a, ti_type b)
+{
+ TWunion res, aa, bb;
+
+ aa.ti = a;
+ bb.ti = b;
+
+ /*
+ * a * b = (a.lo * b.lo)
+ * + 2^64 * (a.hi * b.lo + a.lo * b.hi)
+ * [+ 2^128 * (a.hi * b.hi)]
+ */
+ res.s.low = dmulu(aa.s.low, bb.s.low);
+ res.s.high = dmuhu(aa.s.low, bb.s.low);
+ res.s.high += dmulu(aa.s.high, bb.s.low);
+ res.s.high += dmulu(aa.s.low, bb.s.high);
+
+ return res.ti;
+}
+EXPORT_SYMBOL(__multi3);
+
+#endif /* 64BIT && CPU_MIPSR6 && GCC7 */
next prev parent reply other threads:[~2018-03-02 8:51 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-02 8:50 [PATCH 4.9 00/56] 4.9.86-stable review Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 01/56] hrtimer: Ensure POSIX compliance (relative CLOCK_REALTIME hrtimers) Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 02/56] i2c: designware: must wait for enable Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 03/56] f2fs: fix a bug caused by NULL extent tree Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 04/56] dmaengine: fsl-edma: disable clks on all error paths Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 05/56] nvme: check hw sectors before setting chunk sectors Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 06/56] net: usb: qmi_wwan: add Telit ME910 PID 0x1101 support Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 07/56] mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 08/56] mtd: nand: brcmnand: Zero bitflip is not an error Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 09/56] ipv6: icmp6: Allow icmp messages to be looped back Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 10/56] ARM: 8731/1: Fix csum_partial_copy_from_user() stack mismatch Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 11/56] x86/asm: Allow again using asm.h when building for the bpf clang target Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 12/56] sget(): handle failures of register_shrinker() Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.9 13/56] net: phy: xgene: disable clk on error paths Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 14/56] drm/nouveau/pci: do a msi rearm on init Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 15/56] mac80211_hwsim: Fix a possible sleep-in-atomic bug in hwsim_get_radio_nl Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 16/56] spi: atmel: fixed spin_lock usage inside atmel_spi_remove Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 17/56] ASoC: nau8825: fix issue that pop noise when start capture Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 18/56] net: mediatek: setup proper state for disabled GMAC on the default Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 19/56] net: arc_emac: fix arc_emac_rx() error paths Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 20/56] ip6_tunnel: get the min mtu properly in ip6_tnl_xmit Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 21/56] net: stmmac: Fix TX timestamp calculation Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 22/56] scsi: storvsc: Fix scsi_cmd error assignments in storvsc_handle_error Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 23/56] ARM: dts: ls1021a: fix incorrect clock references Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 24/56] lib/mpi: Fix umul_ppmm() for MIPS64r6 Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 25/56] tipc: error path leak fixes in tipc_enable_bearer() Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 26/56] tipc: fix tipc_mon_delete() oops in tipc_enable_bearer() error path Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 27/56] tg3: Add workaround to restrict 5762 MRRS to 2048 Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 28/56] tg3: Enable PHY reset in MTU change path for 5720 Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 29/56] bnx2x: Improve reliability in case of nested PCI errors Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 30/56] led: core: Fix brightness setting when setting delay_off=0 Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 31/56] IB/mlx5: Fix mlx5_ib_alloc_mr error flow Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 32/56] genirq: Guard handle_bad_irq log messages Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 33/56] s390/dasd: fix wrongly assigned configuration data Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 34/56] IB/mlx4: Fix mlx4_ib_alloc_mr error flow Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 35/56] IB/ipoib: Fix race condition in neigh creation Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 36/56] xfs: quota: fix missed destroy of qi_tree_lock Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 37/56] xfs: quota: check result of register_shrinker() Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 38/56] macvlan: Fix one possible double free Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 39/56] e1000: fix disabling already-disabled warning Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 40/56] NET: usb: qmi_wwan: add support for YUGA CLM920-NC5 PID 0x9625 Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 41/56] drm/ttm: check the return value of kzalloc Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 42/56] uapi libc compat: add fallback for unsupported libcs Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 43/56] i40e/i40evf: Account for frags split over multiple descriptors in check linearize Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 44/56] nl80211: Check for the required netlink attribute presence Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 45/56] mac80211: mesh: drop frames appearing to be from us Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 46/56] can: flex_can: Correct the checking for frame length in flexcan_start_xmit() Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 47/56] bnxt_en: Fix the Invalid VF id check in bnxt_vf_ndo_prep routine Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 48/56] xen-netfront: enable device after manual module load Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 49/56] mdio-sun4i: Fix a memory leak Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 50/56] SolutionEngine771x: fix Ether platform data Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 51/56] xen/gntdev: Fix off-by-one error when unmapping with holes Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 52/56] xen/gntdev: Fix partial gntdev_mmap() cleanup Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 53/56] sctp: make use of pre-calculated len Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 54/56] net: gianfar_ptp: move set_fipers() to spinlock protecting area Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.9 55/56] KVM: arm/arm64: Fix check for hugepage size when allocating at Stage 2 Greg Kroah-Hartman
2018-03-02 8:51 ` Greg Kroah-Hartman [this message]
2018-03-02 17:15 ` [PATCH 4.9 00/56] 4.9.86-stable review Guenter Roeck
2018-03-02 17:52 ` Naresh Kamboju
2018-03-02 21:29 ` Shuah Khan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180302084452.354487935@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=florian@openwrt.org \
--cc=jhogan@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=linux@roeck-us.net \
--cc=macro@mips.com \
--cc=matthew.fortune@mips.com \
--cc=ralf@linux-mips.org \
--cc=stable@vger.kernel.org \
--cc=thomas.petazzoni@free-electrons.com \
--cc=wbx@openadk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox