From: George Spelvin <lkml@sdf.org>
To: linux-alpha@vger.kernel.org, linux-mips@vger.kernel.org,
linux-s390@vger.kernel.org, linuxppc-dev@lists.ozlabs.org
Cc: lkml@sdf.org
Subject: CONFIG_ARCH_SUPPORTS_INT128: Why not mips, s390, powerpc, and alpha?
Date: Fri, 29 Mar 2019 13:07:07 GMT [thread overview]
Message-ID: <201903291307.x2TD772v013534@sdf.org> (raw)
(Cross-posted in case there are generic issues; please trim if
discussion wanders into single-architecture details.)
I was working on some scaling code that can benefit from 64x64->128-bit
multiplies. GCC supports an __int128 type on processors with hardware
support (including z/Arch and MIPS64), but the support was broken on
early compilers, so it's gated behind CONFIG_ARCH_SUPPORTS_INT128.
Currently, of the ten 64-bit architectures Linux supports, that's
only enabled on x86, ARM, and RISC-V.
SPARC and HP-PA don't have support.
But that leaves Alpha, Mips, PowerPC, and S/390x.
Current mips64, powerpc64, and s390x gcc seems to generate sensible code
for mul_u64_u64_shr() in <linux/math64.h> if I cross-compile them.
I don't have easy access to an Alpha cross-compiler to test, but
as it has UMULH, I suspect it would work, too.
Is there a reason it hasn't been enabled on these platforms?
There might be a MIPS64r6 issue, since r6 changed from DMULTU
writing the lo and hi registers to DMULU/DMUHU, and gcc 8.3, at
least, doesn't know how to generate inline code for the latter.
(Note that users *also* check __INT128__, which is defined if GCC
claims to support __int128, so you don't have to worry about 32-bit
compiles or ancient compilers. It only has to be conditional on
*broken* support.)
FWIW, the code I'm working on has this inner loop:
(https://arxiv.org/abs/1805.10941 for details)
u64 get_random_u64(void);
u64 get_random_max64(u64 range, u64 lim)
{
unsigned __int128 prod;
do {
prod = (unsigned __int128)get_random_u64() * range;
} while (unlikely((u64)prod < lim));
return prod >> 64;
}
Which turns into these inner loops:
MIPS:
.L7:
jal get_random_u64
nop
dmultu $2,$17
mflo $3
sltu $4,$3,$16
bne $4,$0,.L7
mfhi $2
PowerPC:
.L9:
bl get_random_u64
nop
mulld 9,3,31
mulhdu 3,3,31
cmpld 7,30,9
bgt 7,.L9
s/390:
.L13:
brasl %r14,get_random_u64@PLT
lgr %r5,%r2
mlgr %r4,%r10
lgr %r2,%r4
clgr %r11,%r5
jh .L13
I like that the MIPS code leaves the high half of the product in
the hi register until it tests the low half; I wish PowerPC would
similarly move the mulhdu *after* the loop, like the following
hypothetical MIPS R6 code:
.L7:
balc get_random_u64
dmulu $3, $2, $17
sltu $3, $3, $16
bnezc $3, .L7
dmuhu $2, $2, $17
Or this handwritten Alpha code:
1:
bsr $26, get_random_u64
mulq $0, $9, $1 # $9 is range
cmpult $1, $10, $1 # $10 is lim
bne $1, 1b
umulh $0, $9, $0
next reply other threads:[~2019-03-29 13:07 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-29 13:07 George Spelvin [this message]
2019-03-29 20:00 ` CONFIG_ARCH_SUPPORTS_INT128: Why not mips, s390, powerpc, and alpha? Michael Cree
2019-03-30 23:14 ` Segher Boessenkool
2019-03-29 20:25 ` Segher Boessenkool
2019-03-30 11:28 ` George Spelvin
2019-03-30 23:52 ` Segher Boessenkool
2019-03-30 8:43 ` Heiko Carstens
2019-03-30 10:30 ` George Spelvin
2019-03-30 13:00 ` George Spelvin
2019-03-31 0:30 ` Segher Boessenkool
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=201903291307.x2TD772v013534@sdf.org \
--to=lkml@sdf.org \
--cc=linux-alpha@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.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).