linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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.4 34/34] MIPS: Implement __multi3 for GCC7 MIPS64r6 builds
Date: Fri,  2 Mar 2018 09:51:30 +0100	[thread overview]
Message-ID: <20180302084438.206438236@linuxfoundation.org> (raw)
In-Reply-To: <20180302084435.842679610@linuxfoundation.org>

4.4-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 */

  parent reply	other threads:[~2018-03-02  8:51 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-02  8:50 [PATCH 4.4 00/34] 4.4.120-stable review Greg Kroah-Hartman
2018-03-02  8:50 ` [PATCH 4.4 01/34] hrtimer: Ensure POSIX compliance (relative CLOCK_REALTIME hrtimers) Greg Kroah-Hartman
2018-03-02  8:50 ` [PATCH 4.4 02/34] f2fs: fix a bug caused by NULL extent tree Greg Kroah-Hartman
2018-03-02  8:50 ` [PATCH 4.4 03/34] mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM Greg Kroah-Hartman
2018-03-06 21:22   ` Ben Hutchings
2018-03-07  8:12     ` Boris Brezillon
2018-03-07  8:19       ` Richard Weinberger
2018-03-07 14:58       ` Sasha Levin
2018-03-02  8:51 ` [PATCH 4.4 04/34] ipv6: icmp6: Allow icmp messages to be looped back Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 05/34] ARM: 8731/1: Fix csum_partial_copy_from_user() stack mismatch Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 06/34] sget(): handle failures of register_shrinker() Greg Kroah-Hartman
2018-03-07  2:16   ` Ben Hutchings
2018-03-02  8:51 ` [PATCH 4.4 07/34] drm/nouveau/pci: do a msi rearm on init Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 08/34] spi: atmel: fixed spin_lock usage inside atmel_spi_remove Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 09/34] net: arc_emac: fix arc_emac_rx() error paths Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 10/34] scsi: storvsc: Fix scsi_cmd error assignments in storvsc_handle_error Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 11/34] ARM: dts: ls1021a: fix incorrect clock references Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 12/34] lib/mpi: Fix umul_ppmm() for MIPS64r6 Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 13/34] tg3: Add workaround to restrict 5762 MRRS to 2048 Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 14/34] tg3: Enable PHY reset in MTU change path for 5720 Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 15/34] bnx2x: Improve reliability in case of nested PCI errors Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 16/34] led: core: Fix brightness setting when setting delay_off=0 Greg Kroah-Hartman
2018-03-07 15:30   ` Ben Hutchings
2018-03-07 15:32   ` Ben Hutchings
2018-03-07 20:39     ` Jacek Anaszewski
2018-03-08 17:24       ` Greg Kroah-Hartman
2018-03-08 18:04         ` Pavel Machek
2018-03-08 20:48         ` Jacek Anaszewski
2018-03-09  1:09           ` Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 17/34] s390/dasd: fix wrongly assigned configuration data Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 18/34] IB/mlx4: Fix mlx4_ib_alloc_mr error flow Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 19/34] IB/ipoib: Fix race condition in neigh creation Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 20/34] xfs: quota: fix missed destroy of qi_tree_lock Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 21/34] xfs: quota: check result of register_shrinker() Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 22/34] e1000: fix disabling already-disabled warning Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 23/34] drm/ttm: check the return value of kzalloc Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 24/34] mac80211: mesh: drop frames appearing to be from us Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 25/34] can: flex_can: Correct the checking for frame length in flexcan_start_xmit() Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 26/34] bnxt_en: Fix the Invalid VF id check in bnxt_vf_ndo_prep routine Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 27/34] xen-netfront: enable device after manual module load Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 28/34] mdio-sun4i: Fix a memory leak Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 29/34] SolutionEngine771x: fix Ether platform data Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 30/34] xen/gntdev: Fix off-by-one error when unmapping with holes Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 31/34] xen/gntdev: Fix partial gntdev_mmap() cleanup Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 32/34] sctp: make use of pre-calculated len Greg Kroah-Hartman
2018-03-02  8:51 ` [PATCH 4.4 33/34] net: gianfar_ptp: move set_fipers() to spinlock protecting area Greg Kroah-Hartman
2018-03-02  8:51 ` Greg Kroah-Hartman [this message]
2018-03-02 12:22 ` [PATCH 4.4 00/34] 4.4.120-stable review Nathan Chancellor
2018-03-02 18:53   ` Greg Kroah-Hartman
2018-03-02 13:58 ` kernelci.org bot
2018-03-02 16:59 ` Naresh Kamboju
2018-03-02 17:16 ` Guenter Roeck
2018-03-02 21:30 ` 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=20180302084438.206438236@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;
as well as URLs for NNTP newsgroup(s).