| From e65d7742727200f7f8c03b423f3223458e7f427e Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Fri, 12 Jul 2019 11:08:05 +0200 |
| Subject: x86: math-emu: Hide clang warnings for 16-bit overflow |
| |
| [ Upstream commit 29e7e9664aec17b94a9c8c5a75f8d216a206aa3a ] |
| |
| clang warns about a few parts of the math-emu implementation |
| where a 16-bit integer becomes negative during assignment: |
| |
| arch/x86/math-emu/poly_tan.c:88:35: error: implicit conversion from 'int' to 'short' changes value from 49216 to -16320 [-Werror,-Wconstant-conversion] |
| (0x41 + EXTENDED_Ebias) | SIGN_Negative); |
| ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~ |
| arch/x86/math-emu/fpu_emu.h:180:58: note: expanded from macro 'setexponent16' |
| #define setexponent16(x,y) { (*(short *)&((x)->exp)) = (y); } |
| ~ ^ |
| arch/x86/math-emu/reg_constant.c:37:32: error: implicit conversion from 'int' to 'short' changes value from 49085 to -16451 [-Werror,-Wconstant-conversion] |
| FPU_REG const CONST_PI2extra = MAKE_REG(NEG, -66, |
| ^~~~~~~~~~~~~~~~~~ |
| arch/x86/math-emu/reg_constant.c:21:25: note: expanded from macro 'MAKE_REG' |
| ((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } |
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~ |
| arch/x86/math-emu/reg_constant.c:48:28: error: implicit conversion from 'int' to 'short' changes value from 65535 to -1 [-Werror,-Wconstant-conversion] |
| FPU_REG const CONST_QNaN = MAKE_REG(NEG, EXP_OVER, 0x00000000, 0xC0000000); |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| arch/x86/math-emu/reg_constant.c:21:25: note: expanded from macro 'MAKE_REG' |
| ((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } |
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The code is correct as is, so add a typecast to shut up the warnings. |
| |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lkml.kernel.org/r/20190712090816.350668-1-arnd@arndb.de |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/math-emu/fpu_emu.h | 2 +- |
| arch/x86/math-emu/reg_constant.c | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/arch/x86/math-emu/fpu_emu.h b/arch/x86/math-emu/fpu_emu.h |
| index afbc4d805d66f..df5aee5402c44 100644 |
| --- a/arch/x86/math-emu/fpu_emu.h |
| +++ b/arch/x86/math-emu/fpu_emu.h |
| @@ -176,7 +176,7 @@ static inline void reg_copy(FPU_REG const *x, FPU_REG *y) |
| #define setexponentpos(x,y) { (*(short *)&((x)->exp)) = \ |
| ((y) + EXTENDED_Ebias) & 0x7fff; } |
| #define exponent16(x) (*(short *)&((x)->exp)) |
| -#define setexponent16(x,y) { (*(short *)&((x)->exp)) = (y); } |
| +#define setexponent16(x,y) { (*(short *)&((x)->exp)) = (u16)(y); } |
| #define addexponent(x,y) { (*(short *)&((x)->exp)) += (y); } |
| #define stdexp(x) { (*(short *)&((x)->exp)) += EXTENDED_Ebias; } |
| |
| diff --git a/arch/x86/math-emu/reg_constant.c b/arch/x86/math-emu/reg_constant.c |
| index 00548354912f4..382093c5072b0 100644 |
| --- a/arch/x86/math-emu/reg_constant.c |
| +++ b/arch/x86/math-emu/reg_constant.c |
| @@ -17,7 +17,7 @@ |
| #include "control_w.h" |
| |
| #define MAKE_REG(s, e, l, h) { l, h, \ |
| - ((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } |
| + (u16)((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } |
| |
| FPU_REG const CONST_1 = MAKE_REG(POS, 0, 0x00000000, 0x80000000); |
| #if 0 |
| -- |
| 2.20.1 |
| |