All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthias Kaehlcke <mka@chromium.org>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Andrew Morton <akpm@linux-foundation.org>,
	James Y Knight <jyknight@google.com>,
	Chandler Carruth <chandlerc@google.com>,
	Stephen Hines <srhines@google.com>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Kees Cook <keescook@google.com>,
	Guenter Roeck <groeck@chromium.org>,
	Greg Hackmann <ghackmann@google.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: [GIT PULL] x86/build changes for v4.17
Date: Wed, 4 Apr 2018 14:46:39 -0700	[thread overview]
Message-ID: <20180404214639.GH87376@google.com> (raw)
In-Reply-To: <CAK8P3a2tf3v6seq=OeyBakZ1ZXYzzL=tY=aHvKYv-GtD7sWeTA@mail.gmail.com>

El Wed, Apr 04, 2018 at 11:11:36PM +0200 Arnd Bergmann ha dit:

> On Wed, Apr 4, 2018 at 10:58 PM, Matthias Kaehlcke <mka@chromium.org> wrote:
> > El Wed, Apr 04, 2018 at 10:33:19PM +0200 Arnd Bergmann ha dit:
> >>
> >> In most cases, this is used to implement a fast-path for a helper
> >> function, so not doing it the same way as gcc just results in
> >> slower execution, but I assume we also have code that behaves
> >> differently on clang compared to gcc because of this.
> >
> > I think I didn't come (knowingly) across that one yet. Could you point
> > me to an instance that could be used as an example in a bug report?
> 
> This code
> 
> #include <linux/math64.h>
> int f(u64 u)
> {
>         return div_u64(u, 100000);
> }
> 
> results in a call to __do_div64() on 32-bit arm using clang, but
> gets optimized into a set of multiply+shift on gcc.

I understand this is annoying, but it seems I'm missing something:

static inline u64 div_u64(u64 dividend, u32 divisor)
{
        u32 remainder;
        return div_u64_rem(dividend, divisor, &remainder);
}

static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
{
        *remainder = do_div(dividend, divisor);
        return dividend;
}

#define do_div(n, base) __div64_32(&(n), base)

static inline uint32_t __div64_32(uint64_t *n, uint32_t base)
{
        register unsigned int __base      asm("r4") = base;
        register unsigned long long __n   asm("r0") = *n;
        register unsigned long long __res asm("r2");
        register unsigned int __rem       asm(__xh);
        asm(    __asmeq("%0", __xh)
                __asmeq("%1", "r2")
                __asmeq("%2", "r0")
                __asmeq("%3", "r4")
                "bl     __do_div64"
                : "=r" (__rem), "=r" (__res)
                : "r" (__n), "r" (__base)
                : "ip", "lr", "cc");
        *n = __res;
        return __rem;
}

There is no reference to __builtin_constant_p(), could you elaborate?

Also you mentioned there are plenty of cases, maybe there is a more
straightforward one?

In any case it seems this derails a bit from the original topic of the
thread. Shall we take this offline?

  reply	other threads:[~2018-04-04 21:46 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-02  9:50 [GIT PULL] x86/build changes for v4.17 Ingo Molnar
2018-04-02 21:44 ` Linus Torvalds
2018-04-02 22:38   ` Matthias Kaehlcke
2018-04-03  1:26     ` Matthias Kaehlcke
2018-04-03  8:59   ` Peter Zijlstra
2018-04-03  9:51     ` Ingo Molnar
2018-04-03 12:09       ` Peter Zijlstra
2018-04-03 18:06       ` Matthias Kaehlcke
2018-04-03 21:58         ` Nick Desaulniers
2018-04-04  9:19           ` Peter Zijlstra
2018-04-04  9:38           ` Greg KH
2018-04-04 16:49             ` Nick Desaulniers
2018-04-04 17:13               ` Linus Torvalds
2018-04-04 17:46                 ` Nick Desaulniers
2018-04-04 23:10                 ` Nick Desaulniers
2018-04-04 16:53             ` Nick Desaulniers
2018-04-04 16:59               ` Greg KH
2018-04-04 19:26                 ` James Y Knight
2018-04-04 19:42                   ` Linus Torvalds
2018-04-04 22:21                     ` James Y Knight
2018-04-04 22:29                       ` Linus Torvalds
2018-04-05  7:08                       ` Peter Zijlstra
2018-04-05 16:21                         ` James Y Knight
2018-04-04 19:32               ` Josh Poimboeuf
2018-06-07 19:23                 ` Nick Desaulniers
2018-06-07 20:11                   ` Greg KH
2018-04-04  9:30         ` Peter Zijlstra
2018-04-04 19:17           ` Matthias Kaehlcke
2018-04-04 20:33             ` Arnd Bergmann
2018-04-04 20:58               ` Matthias Kaehlcke
2018-04-04 21:11                 ` Arnd Bergmann
2018-04-04 21:46                   ` Matthias Kaehlcke [this message]
2018-04-04 21:59                     ` Linus Torvalds
2018-04-04 22:17                       ` Matthias Kaehlcke
2018-04-04 22:39                         ` Linus Torvalds
2018-04-04 23:31                           ` Matthias Kaehlcke
2018-04-05  0:05                             ` Linus Torvalds
2018-04-05  0:20                               ` Kees Cook
2018-04-05  7:24                               ` Peter Zijlstra
2018-04-05  8:04                                 ` Ingo Molnar
2018-04-05  8:24                                   ` Peter Zijlstra
2018-04-05 16:43                                 ` Linus Torvalds
2018-04-05  7:20                             ` Peter Zijlstra
2018-04-05 17:46                               ` James Y Knight
2018-04-05 18:06                                 ` Linus Torvalds
2018-04-05 20:51                                   ` James Y Knight
2018-04-05 21:13                                     ` Linus Torvalds
2018-04-05 22:51                                       ` James Y Knight
2018-04-06  2:02                                         ` Linus Torvalds
2018-04-05 17:47                               ` James Y Knight
2018-04-04 23:04             ` Nick Desaulniers
2018-04-03 17:36     ` Linus Torvalds

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=20180404214639.GH87376@google.com \
    --to=mka@chromium.org \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=chandlerc@google.com \
    --cc=ghackmann@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=groeck@chromium.org \
    --cc=jyknight@google.com \
    --cc=keescook@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=peterz@infradead.org \
    --cc=srhines@google.com \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.