Re: {standard input}:136: Error: number (0x9000000080000000) larger than 32 bits

From: Ralf Baechle
Date: Mon Apr 18 2016 - 11:54:50 EST


On Mon, Apr 18, 2016 at 03:25:56PM +0100, Maciej W. Rozycki wrote:

> On Mon, 18 Apr 2016, Ralf Baechle wrote:
>
> > The old case btw, affects ip22 with a random_config:
> >
> > CC arch/mips/mm/sc-ip22.o
> > {standard input}: Assembler messages:
> > {standard input}:137: Error: number (0x9000000080000000) larger than 32 bits
> > {standard input}:162: Error: number (0x9000000080000000) larger than 32 bits
> > scripts/Makefile.build:258: recipe for target 'arch/mips/mm/sc-ip22.o' failed
> > make[2]: *** [arch/mips/mm/sc-ip22.o] Error 1
> > scripts/Makefile.build:403: recipe for target 'arch/mips/mm' failed
> > make[1]: *** [arch/mips/mm] Error 2
> > Makefile:947: recipe for target 'arch/mips' failed
> > make: *** [arch/mips] Error 2
> >
> > and I was able to reproduce it with binutils 2.26 and commit
> > c517d838eb7d07bbe9507871fab3931deccff539 ("Linux 4.0-rc1"). The code
> > in question looks like:
> >
> > static inline void indy_sc_wipe(unsigned long first, unsigned long last)
> > {
> > unsigned long tmp;
> >
> > __asm__ __volatile__(
> > ".set\tpush\t\t\t# indy_sc_wipe\n\t"
> > ".set\tnoreorder\n\t"
> > ".set\tmips3\n\t"
> > ".set\tnoat\n\t"
> > "mfc0\t%2, $12\n\t"
> > "li\t$1, 0x80\t\t\t# Go 64 bit\n\t"
> > "mtc0\t$1, $12\n\t"
> >
> > "dli\t$1, 0x9000000080000000\n\t"
>
> That does not help me, I'm afraid, I can't trigger the issue with this
> piece of code alone. It may be caused by a particular combination of GAS
> command line options and `.set' directives.
>
> Since you can reproduce it, can you please send me the offending .s file
> (`make arch/mips/mm/sc-ip22.s') and the GAS invocation line used? GCC
> will print the latter along all kinds of diagnostic stuff if -v is passed
> to an invocation involving assembly (e.g. `make V=1 CFLAGS_sc-ip22.o=-v
> arch/mips/mm/sc-ip22.o'). You can send me the whole diagnostics, I'll
> filter what I need.
>
> I think it'll be the most efficient way to move forward; otherwise I may
> keep missing the issue.

I extracted a rather simple test case:

$ echo >> testcase .s << EOF
.set mips3
dli $2, 0x9000000080000000
EOF
$ mips-linux-as -mips3 -march=r4600 -o testcase.o testcase.s
testcase.s: Assembler messages:
testcase.s:2: Error: number (0x9000000080000000) larger than 32 bits
$ mips-linux-as -mips4 -march=vr5000 -o testcase.o testcase.s
$

I can trigger the error message with vanilla 2.25 and 2.26 but not 2.24.

Ralf