Commit 20acf7fc authored by Finn Thain's avatar Finn Thain Committed by Michael Ellerman

powerpc/lib: Fix "integer constant is too large" build failure

My powerpc-linux-gnu-gcc v4.4.5 compiler can't build a 32-bit kernel
any more:

arch/powerpc/lib/sstep.c: In function 'do_popcnt':
arch/powerpc/lib/sstep.c:1068: error: integer constant is too large for 'long' type
arch/powerpc/lib/sstep.c:1069: error: integer constant is too large for 'long' type
arch/powerpc/lib/sstep.c:1069: error: integer constant is too large for 'long' type
arch/powerpc/lib/sstep.c:1070: error: integer constant is too large for 'long' type
arch/powerpc/lib/sstep.c:1079: error: integer constant is too large for 'long' type
arch/powerpc/lib/sstep.c: In function 'do_prty':
arch/powerpc/lib/sstep.c:1117: error: integer constant is too large for 'long' type

This file gets compiled with -std=gnu89 which means a constant can be
given the type 'long' even if it won't fit. Fix the errors with a 'ULL'
suffix on the relevant constants.

Fixes: 2c979c48 ("powerpc/lib/sstep: Add prty instruction emulation")
Fixes: dcbd19b4 ("powerpc/lib/sstep: Add popcnt instruction emulation")
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent c0beffc4
...@@ -1065,9 +1065,10 @@ static nokprobe_inline void do_popcnt(const struct pt_regs *regs, ...@@ -1065,9 +1065,10 @@ static nokprobe_inline void do_popcnt(const struct pt_regs *regs,
{ {
unsigned long long out = v1; unsigned long long out = v1;
out -= (out >> 1) & 0x5555555555555555; out -= (out >> 1) & 0x5555555555555555ULL;
out = (0x3333333333333333 & out) + (0x3333333333333333 & (out >> 2)); out = (0x3333333333333333ULL & out) +
out = (out + (out >> 4)) & 0x0f0f0f0f0f0f0f0f; (0x3333333333333333ULL & (out >> 2));
out = (out + (out >> 4)) & 0x0f0f0f0f0f0f0f0fULL;
if (size == 8) { /* popcntb */ if (size == 8) { /* popcntb */
op->val = out; op->val = out;
...@@ -1076,7 +1077,7 @@ static nokprobe_inline void do_popcnt(const struct pt_regs *regs, ...@@ -1076,7 +1077,7 @@ static nokprobe_inline void do_popcnt(const struct pt_regs *regs,
out += out >> 8; out += out >> 8;
out += out >> 16; out += out >> 16;
if (size == 32) { /* popcntw */ if (size == 32) { /* popcntw */
op->val = out & 0x0000003f0000003f; op->val = out & 0x0000003f0000003fULL;
return; return;
} }
...@@ -1114,7 +1115,7 @@ static nokprobe_inline void do_prty(const struct pt_regs *regs, ...@@ -1114,7 +1115,7 @@ static nokprobe_inline void do_prty(const struct pt_regs *regs,
res ^= res >> 16; res ^= res >> 16;
if (size == 32) { /* prtyw */ if (size == 32) { /* prtyw */
op->val = res & 0x0000000100000001; op->val = res & 0x0000000100000001ULL;
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment