tree: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next head: c28c2d4abdf95655001992c4f52dc243ba00cac3 commit: 7245fc5bb7a966852d5bd7779d1f5855530b461a [26/63] powerpc/math-emu: Remove -w build flag and fix warnings config: powerpc-tqm8540_defconfig (https://download.01.org/0day-ci/archive/20220908/202209080432.farx6r6a-...@intel.com/config) compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project c55b41d5199d2394dd6cdb8f52180d8b81d809d4) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install powerpc cross compiling tool for clang build # apt-get install binutils-powerpc-linux-gnu # https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id=7245fc5bb7a966852d5bd7779d1f5855530b461a git remote add powerpc https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git git fetch --no-tags powerpc next git checkout 7245fc5bb7a966852d5bd7779d1f5855530b461a # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash arch/powerpc/math-emu/
If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <l...@intel.com> All errors (new ones prefixed by >>): >> arch/powerpc/math-emu/fre.c:6:5: error: no previous prototype for function >> 'fre' [-Werror,-Wmissing-prototypes] int fre(void *frD, void *frB) ^ arch/powerpc/math-emu/fre.c:6:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int fre(void *frD, void *frB) ^ static 1 error generated. -- >> arch/powerpc/math-emu/fsqrt.c:11:1: error: no previous prototype for >> function 'fsqrt' [-Werror,-Wmissing-prototypes] fsqrt(void *frD, void *frB) ^ arch/powerpc/math-emu/fsqrt.c:10:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/fsqrts.c:12:1: error: no previous prototype for >> function 'fsqrts' [-Werror,-Wmissing-prototypes] fsqrts(void *frD, void *frB) ^ arch/powerpc/math-emu/fsqrts.c:11:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/frsqrtes.c:6:5: error: no previous prototype for >> function 'frsqrtes' [-Werror,-Wmissing-prototypes] int frsqrtes(void *frD, void *frB) ^ arch/powerpc/math-emu/frsqrtes.c:6:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int frsqrtes(void *frD, void *frB) ^ static 1 error generated. -- >> arch/powerpc/math-emu/mtfsf.c:10:1: error: no previous prototype for >> function 'mtfsf' [-Werror,-Wmissing-prototypes] mtfsf(unsigned int FM, u32 *frB) ^ arch/powerpc/math-emu/mtfsf.c:9:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/mtfsfi.c:10:1: error: no previous prototype for >> function 'mtfsfi' [-Werror,-Wmissing-prototypes] mtfsfi(unsigned int crfD, unsigned int IMM) ^ arch/powerpc/math-emu/mtfsfi.c:9:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/fabs.c:7:1: error: no previous prototype for function >> 'fabs' [-Werror,-Wmissing-prototypes] fabs(u32 *frD, u32 *frB) ^ arch/powerpc/math-emu/fabs.c:6:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/fadd.c:11:1: error: no previous prototype for function >> 'fadd' [-Werror,-Wmissing-prototypes] fadd(void *frD, void *frA, void *frB) ^ arch/powerpc/math-emu/fadd.c:10:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/fadds.c:12:1: error: no previous prototype for >> function 'fadds' [-Werror,-Wmissing-prototypes] fadds(void *frD, void *frA, void *frB) ^ arch/powerpc/math-emu/fadds.c:11:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/fcmpo.c:11:1: error: no previous prototype for >> function 'fcmpo' [-Werror,-Wmissing-prototypes] fcmpo(u32 *ccr, int crfD, void *frA, void *frB) ^ arch/powerpc/math-emu/fcmpo.c:10:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 1 error generated. -- >> arch/powerpc/math-emu/fcmpu.c:13:2: error: variable 'A_c' set but not used >> [-Werror,-Wunused-but-set-variable] FP_DECL_D(A); ^ include/math-emu/double.h:73:23: note: expanded from macro 'FP_DECL_D' #define FP_DECL_D(X) _FP_DECL(2,X) ^ include/math-emu/op-common.h:28:14: note: expanded from macro '_FP_DECL' _FP_I_TYPE X##_c=0, X##_s=0, X##_e=0; \ ^ <scratch space>:139:1: note: expanded from here A_c ^ >> arch/powerpc/math-emu/fcmpu.c:14:2: error: variable 'B_c' set but not used >> [-Werror,-Wunused-but-set-variable] FP_DECL_D(B); ^ include/math-emu/double.h:73:23: note: expanded from macro 'FP_DECL_D' #define FP_DECL_D(X) _FP_DECL(2,X) ^ include/math-emu/op-common.h:28:14: note: expanded from macro '_FP_DECL' _FP_I_TYPE X##_c=0, X##_s=0, X##_e=0; \ ^ <scratch space>:145:1: note: expanded from here B_c ^ >> arch/powerpc/math-emu/fcmpu.c:15:2: error: variable '_fex' set but not used >> [-Werror,-Wunused-but-set-variable] FP_DECL_EX; ^ include/math-emu/soft-fp.h:94:24: note: expanded from macro 'FP_DECL_EX' #define FP_DECL_EX int _fex = 0 ^ >> arch/powerpc/math-emu/fcmpu.c:11:1: error: no previous prototype for >> function 'fcmpu' [-Werror,-Wmissing-prototypes] fcmpu(u32 *ccr, int crfD, void *frA, void *frB) ^ arch/powerpc/math-emu/fcmpu.c:10:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int ^ static 4 errors generated. .. vim +/do_spe_mathemu +177 arch/powerpc/math-emu/math_efp.c 6a800f36acd5bf Liu Yu 2008-10-28 176 6a800f36acd5bf Liu Yu 2008-10-28 @177 int do_spe_mathemu(struct pt_regs *regs) 6a800f36acd5bf Liu Yu 2008-10-28 178 { 6a800f36acd5bf Liu Yu 2008-10-28 179 FP_DECL_EX; 6a800f36acd5bf Liu Yu 2008-10-28 180 int IR, cmp; 6a800f36acd5bf Liu Yu 2008-10-28 181 6a800f36acd5bf Liu Yu 2008-10-28 182 unsigned long type, func, fc, fa, fb, src, speinsn; 6a800f36acd5bf Liu Yu 2008-10-28 183 union dw_union vc, va, vb; 6a800f36acd5bf Liu Yu 2008-10-28 184 6a800f36acd5bf Liu Yu 2008-10-28 185 if (get_user(speinsn, (unsigned int __user *) regs->nip)) 6a800f36acd5bf Liu Yu 2008-10-28 186 return -EFAULT; 6a800f36acd5bf Liu Yu 2008-10-28 187 if ((speinsn >> 26) != EFAPU) 6a800f36acd5bf Liu Yu 2008-10-28 188 return -EINVAL; /* not an spe instruction */ 6a800f36acd5bf Liu Yu 2008-10-28 189 6a800f36acd5bf Liu Yu 2008-10-28 190 type = insn_type(speinsn); 6a800f36acd5bf Liu Yu 2008-10-28 191 if (type == NOTYPE) 09af52f78e58d9 Liu Yu 2011-09-05 192 goto illegal; 6a800f36acd5bf Liu Yu 2008-10-28 193 6a800f36acd5bf Liu Yu 2008-10-28 194 func = speinsn & 0x7ff; 6a800f36acd5bf Liu Yu 2008-10-28 195 fc = (speinsn >> 21) & 0x1f; 6a800f36acd5bf Liu Yu 2008-10-28 196 fa = (speinsn >> 16) & 0x1f; 6a800f36acd5bf Liu Yu 2008-10-28 197 fb = (speinsn >> 11) & 0x1f; 6a800f36acd5bf Liu Yu 2008-10-28 198 src = (speinsn >> 5) & 0x7; 6a800f36acd5bf Liu Yu 2008-10-28 199 6a800f36acd5bf Liu Yu 2008-10-28 200 vc.wp[0] = current->thread.evr[fc]; 6a800f36acd5bf Liu Yu 2008-10-28 201 vc.wp[1] = regs->gpr[fc]; 6a800f36acd5bf Liu Yu 2008-10-28 202 va.wp[0] = current->thread.evr[fa]; 6a800f36acd5bf Liu Yu 2008-10-28 203 va.wp[1] = regs->gpr[fa]; 6a800f36acd5bf Liu Yu 2008-10-28 204 vb.wp[0] = current->thread.evr[fb]; 6a800f36acd5bf Liu Yu 2008-10-28 205 vb.wp[1] = regs->gpr[fb]; 6a800f36acd5bf Liu Yu 2008-10-28 206 6a800f36acd5bf Liu Yu 2008-10-28 207 __FPU_FPSCR = mfspr(SPRN_SPEFSCR); 6a800f36acd5bf Liu Yu 2008-10-28 208 b430abc4d10537 Liu Yu 2011-09-05 209 pr_debug("speinsn:%08lx spefscr:%08lx\n", speinsn, __FPU_FPSCR); b430abc4d10537 Liu Yu 2011-09-05 210 pr_debug("vc: %08x %08x\n", vc.wp[0], vc.wp[1]); b430abc4d10537 Liu Yu 2011-09-05 211 pr_debug("va: %08x %08x\n", va.wp[0], va.wp[1]); b430abc4d10537 Liu Yu 2011-09-05 212 pr_debug("vb: %08x %08x\n", vb.wp[0], vb.wp[1]); 6a800f36acd5bf Liu Yu 2008-10-28 213 6a800f36acd5bf Liu Yu 2008-10-28 214 switch (src) { 6a800f36acd5bf Liu Yu 2008-10-28 215 case SPFP: { 6a800f36acd5bf Liu Yu 2008-10-28 216 FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR); 6a800f36acd5bf Liu Yu 2008-10-28 217 6a800f36acd5bf Liu Yu 2008-10-28 218 switch (type) { 6a800f36acd5bf Liu Yu 2008-10-28 219 case AB: 6a800f36acd5bf Liu Yu 2008-10-28 220 case XCR: 6a800f36acd5bf Liu Yu 2008-10-28 221 FP_UNPACK_SP(SA, va.wp + 1); 7245fc5bb7a966 Christophe Leroy 2022-09-02 222 fallthrough; 6a800f36acd5bf Liu Yu 2008-10-28 223 case XB: 6a800f36acd5bf Liu Yu 2008-10-28 224 FP_UNPACK_SP(SB, vb.wp + 1); 6a800f36acd5bf Liu Yu 2008-10-28 225 break; 6a800f36acd5bf Liu Yu 2008-10-28 226 case XA: 6a800f36acd5bf Liu Yu 2008-10-28 227 FP_UNPACK_SP(SA, va.wp + 1); 6a800f36acd5bf Liu Yu 2008-10-28 228 break; 6a800f36acd5bf Liu Yu 2008-10-28 229 } 6a800f36acd5bf Liu Yu 2008-10-28 230 7245fc5bb7a966 Christophe Leroy 2022-09-02 231 pr_debug("SA: %d %08x %d (%d)\n", SA_s, SA_f, SA_e, SA_c); 7245fc5bb7a966 Christophe Leroy 2022-09-02 232 pr_debug("SB: %d %08x %d (%d)\n", SB_s, SB_f, SB_e, SB_c); 6a800f36acd5bf Liu Yu 2008-10-28 233 6a800f36acd5bf Liu Yu 2008-10-28 234 switch (func) { 6a800f36acd5bf Liu Yu 2008-10-28 235 case EFSABS: 6a800f36acd5bf Liu Yu 2008-10-28 236 vc.wp[1] = va.wp[1] & ~SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 237 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 238 6a800f36acd5bf Liu Yu 2008-10-28 239 case EFSNABS: 6a800f36acd5bf Liu Yu 2008-10-28 240 vc.wp[1] = va.wp[1] | SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 241 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 242 6a800f36acd5bf Liu Yu 2008-10-28 243 case EFSNEG: 6a800f36acd5bf Liu Yu 2008-10-28 244 vc.wp[1] = va.wp[1] ^ SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 245 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 246 6a800f36acd5bf Liu Yu 2008-10-28 247 case EFSADD: 6a800f36acd5bf Liu Yu 2008-10-28 248 FP_ADD_S(SR, SA, SB); 6a800f36acd5bf Liu Yu 2008-10-28 249 goto pack_s; 6a800f36acd5bf Liu Yu 2008-10-28 250 6a800f36acd5bf Liu Yu 2008-10-28 251 case EFSSUB: 6a800f36acd5bf Liu Yu 2008-10-28 252 FP_SUB_S(SR, SA, SB); 6a800f36acd5bf Liu Yu 2008-10-28 253 goto pack_s; 6a800f36acd5bf Liu Yu 2008-10-28 254 6a800f36acd5bf Liu Yu 2008-10-28 255 case EFSMUL: 6a800f36acd5bf Liu Yu 2008-10-28 256 FP_MUL_S(SR, SA, SB); 6a800f36acd5bf Liu Yu 2008-10-28 257 goto pack_s; 6a800f36acd5bf Liu Yu 2008-10-28 258 6a800f36acd5bf Liu Yu 2008-10-28 259 case EFSDIV: 6a800f36acd5bf Liu Yu 2008-10-28 260 FP_DIV_S(SR, SA, SB); 6a800f36acd5bf Liu Yu 2008-10-28 261 goto pack_s; 6a800f36acd5bf Liu Yu 2008-10-28 262 6a800f36acd5bf Liu Yu 2008-10-28 263 case EFSCMPEQ: 6a800f36acd5bf Liu Yu 2008-10-28 264 cmp = 0; 6a800f36acd5bf Liu Yu 2008-10-28 265 goto cmp_s; 6a800f36acd5bf Liu Yu 2008-10-28 266 6a800f36acd5bf Liu Yu 2008-10-28 267 case EFSCMPGT: 6a800f36acd5bf Liu Yu 2008-10-28 268 cmp = 1; 6a800f36acd5bf Liu Yu 2008-10-28 269 goto cmp_s; 6a800f36acd5bf Liu Yu 2008-10-28 270 6a800f36acd5bf Liu Yu 2008-10-28 271 case EFSCMPLT: 6a800f36acd5bf Liu Yu 2008-10-28 272 cmp = -1; 6a800f36acd5bf Liu Yu 2008-10-28 273 goto cmp_s; 6a800f36acd5bf Liu Yu 2008-10-28 274 6a800f36acd5bf Liu Yu 2008-10-28 275 case EFSCTSF: 6a800f36acd5bf Liu Yu 2008-10-28 276 case EFSCTUF: 28fbf1d540920a Joseph Myers 2013-11-04 277 if (SB_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 278 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 279 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 280 } else { 28fbf1d540920a Joseph Myers 2013-11-04 281 SB_e += (func == EFSCTSF ? 31 : 32); 28fbf1d540920a Joseph Myers 2013-11-04 282 FP_TO_INT_ROUND_S(vc.wp[1], SB, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 283 (func == EFSCTSF) ? 1 : 0); 6a800f36acd5bf Liu Yu 2008-10-28 284 } 6a800f36acd5bf Liu Yu 2008-10-28 285 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 286 6a800f36acd5bf Liu Yu 2008-10-28 287 case EFSCFD: { 6a800f36acd5bf Liu Yu 2008-10-28 288 FP_DECL_D(DB); 6a800f36acd5bf Liu Yu 2008-10-28 289 FP_CLEAR_EXCEPTIONS; 6a800f36acd5bf Liu Yu 2008-10-28 290 FP_UNPACK_DP(DB, vb.dp); b430abc4d10537 Liu Yu 2011-09-05 291 7245fc5bb7a966 Christophe Leroy 2022-09-02 292 pr_debug("DB: %d %08x %08x %d (%d)\n", 6a800f36acd5bf Liu Yu 2008-10-28 293 DB_s, DB_f1, DB_f0, DB_e, DB_c); b430abc4d10537 Liu Yu 2011-09-05 294 6a800f36acd5bf Liu Yu 2008-10-28 295 FP_CONV(S, D, 1, 2, SR, DB); 6a800f36acd5bf Liu Yu 2008-10-28 296 goto pack_s; 6a800f36acd5bf Liu Yu 2008-10-28 297 } 6a800f36acd5bf Liu Yu 2008-10-28 298 6a800f36acd5bf Liu Yu 2008-10-28 299 case EFSCTSI: 6a800f36acd5bf Liu Yu 2008-10-28 300 case EFSCTUI: 28fbf1d540920a Joseph Myers 2013-11-04 301 if (SB_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 302 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 303 FP_SET_EXCEPTION(FP_EX_INVALID); 6a800f36acd5bf Liu Yu 2008-10-28 304 } else { 28fbf1d540920a Joseph Myers 2013-11-04 305 FP_TO_INT_ROUND_S(vc.wp[1], SB, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 306 ((func & 0x3) != 0) ? 1 : 0); 6a800f36acd5bf Liu Yu 2008-10-28 307 } 28fbf1d540920a Joseph Myers 2013-11-04 308 goto update_regs; 28fbf1d540920a Joseph Myers 2013-11-04 309 28fbf1d540920a Joseph Myers 2013-11-04 310 case EFSCTSIZ: 28fbf1d540920a Joseph Myers 2013-11-04 311 case EFSCTUIZ: 28fbf1d540920a Joseph Myers 2013-11-04 312 if (SB_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 313 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 314 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 315 } else { afc0a07d4a2835 Shan Hai 2010-11-17 316 FP_TO_INT_S(vc.wp[1], SB, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 317 ((func & 0x3) != 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 318 } 6a800f36acd5bf Liu Yu 2008-10-28 319 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 320 6a800f36acd5bf Liu Yu 2008-10-28 321 default: 6a800f36acd5bf Liu Yu 2008-10-28 322 goto illegal; 6a800f36acd5bf Liu Yu 2008-10-28 323 } 6a800f36acd5bf Liu Yu 2008-10-28 324 break; 6a800f36acd5bf Liu Yu 2008-10-28 325 6a800f36acd5bf Liu Yu 2008-10-28 326 pack_s: 7245fc5bb7a966 Christophe Leroy 2022-09-02 327 pr_debug("SR: %d %08x %d (%d)\n", SR_s, SR_f, SR_e, SR_c); b430abc4d10537 Liu Yu 2011-09-05 328 6a800f36acd5bf Liu Yu 2008-10-28 329 FP_PACK_SP(vc.wp + 1, SR); 6a800f36acd5bf Liu Yu 2008-10-28 330 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 331 6a800f36acd5bf Liu Yu 2008-10-28 332 cmp_s: 6a800f36acd5bf Liu Yu 2008-10-28 333 FP_CMP_S(IR, SA, SB, 3); 6a800f36acd5bf Liu Yu 2008-10-28 334 if (IR == 3 && (FP_ISSIGNAN_S(SA) || FP_ISSIGNAN_S(SB))) 6a800f36acd5bf Liu Yu 2008-10-28 335 FP_SET_EXCEPTION(FP_EX_INVALID); 6a800f36acd5bf Liu Yu 2008-10-28 336 if (IR == cmp) { 6a800f36acd5bf Liu Yu 2008-10-28 337 IR = 0x4; 6a800f36acd5bf Liu Yu 2008-10-28 338 } else { 6a800f36acd5bf Liu Yu 2008-10-28 339 IR = 0; 6a800f36acd5bf Liu Yu 2008-10-28 340 } 6a800f36acd5bf Liu Yu 2008-10-28 341 goto update_ccr; 6a800f36acd5bf Liu Yu 2008-10-28 342 } 6a800f36acd5bf Liu Yu 2008-10-28 343 6a800f36acd5bf Liu Yu 2008-10-28 344 case DPFP: { 6a800f36acd5bf Liu Yu 2008-10-28 345 FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR); 6a800f36acd5bf Liu Yu 2008-10-28 346 6a800f36acd5bf Liu Yu 2008-10-28 347 switch (type) { 6a800f36acd5bf Liu Yu 2008-10-28 348 case AB: 6a800f36acd5bf Liu Yu 2008-10-28 349 case XCR: 6a800f36acd5bf Liu Yu 2008-10-28 350 FP_UNPACK_DP(DA, va.dp); 7245fc5bb7a966 Christophe Leroy 2022-09-02 351 fallthrough; 6a800f36acd5bf Liu Yu 2008-10-28 352 case XB: 6a800f36acd5bf Liu Yu 2008-10-28 353 FP_UNPACK_DP(DB, vb.dp); 6a800f36acd5bf Liu Yu 2008-10-28 354 break; 6a800f36acd5bf Liu Yu 2008-10-28 355 case XA: 6a800f36acd5bf Liu Yu 2008-10-28 356 FP_UNPACK_DP(DA, va.dp); 6a800f36acd5bf Liu Yu 2008-10-28 357 break; 6a800f36acd5bf Liu Yu 2008-10-28 358 } 6a800f36acd5bf Liu Yu 2008-10-28 359 7245fc5bb7a966 Christophe Leroy 2022-09-02 360 pr_debug("DA: %d %08x %08x %d (%d)\n", 6a800f36acd5bf Liu Yu 2008-10-28 361 DA_s, DA_f1, DA_f0, DA_e, DA_c); 7245fc5bb7a966 Christophe Leroy 2022-09-02 362 pr_debug("DB: %d %08x %08x %d (%d)\n", 6a800f36acd5bf Liu Yu 2008-10-28 363 DB_s, DB_f1, DB_f0, DB_e, DB_c); 6a800f36acd5bf Liu Yu 2008-10-28 364 6a800f36acd5bf Liu Yu 2008-10-28 365 switch (func) { 6a800f36acd5bf Liu Yu 2008-10-28 366 case EFDABS: 6a800f36acd5bf Liu Yu 2008-10-28 367 vc.dp[0] = va.dp[0] & ~SIGN_BIT_D; 6a800f36acd5bf Liu Yu 2008-10-28 368 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 369 6a800f36acd5bf Liu Yu 2008-10-28 370 case EFDNABS: 6a800f36acd5bf Liu Yu 2008-10-28 371 vc.dp[0] = va.dp[0] | SIGN_BIT_D; 6a800f36acd5bf Liu Yu 2008-10-28 372 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 373 6a800f36acd5bf Liu Yu 2008-10-28 374 case EFDNEG: 6a800f36acd5bf Liu Yu 2008-10-28 375 vc.dp[0] = va.dp[0] ^ SIGN_BIT_D; 6a800f36acd5bf Liu Yu 2008-10-28 376 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 377 6a800f36acd5bf Liu Yu 2008-10-28 378 case EFDADD: 6a800f36acd5bf Liu Yu 2008-10-28 379 FP_ADD_D(DR, DA, DB); 6a800f36acd5bf Liu Yu 2008-10-28 380 goto pack_d; 6a800f36acd5bf Liu Yu 2008-10-28 381 6a800f36acd5bf Liu Yu 2008-10-28 382 case EFDSUB: 6a800f36acd5bf Liu Yu 2008-10-28 383 FP_SUB_D(DR, DA, DB); 6a800f36acd5bf Liu Yu 2008-10-28 384 goto pack_d; 6a800f36acd5bf Liu Yu 2008-10-28 385 6a800f36acd5bf Liu Yu 2008-10-28 386 case EFDMUL: 6a800f36acd5bf Liu Yu 2008-10-28 387 FP_MUL_D(DR, DA, DB); 6a800f36acd5bf Liu Yu 2008-10-28 388 goto pack_d; 6a800f36acd5bf Liu Yu 2008-10-28 389 6a800f36acd5bf Liu Yu 2008-10-28 390 case EFDDIV: 6a800f36acd5bf Liu Yu 2008-10-28 391 FP_DIV_D(DR, DA, DB); 6a800f36acd5bf Liu Yu 2008-10-28 392 goto pack_d; 6a800f36acd5bf Liu Yu 2008-10-28 393 6a800f36acd5bf Liu Yu 2008-10-28 394 case EFDCMPEQ: 6a800f36acd5bf Liu Yu 2008-10-28 395 cmp = 0; 6a800f36acd5bf Liu Yu 2008-10-28 396 goto cmp_d; 6a800f36acd5bf Liu Yu 2008-10-28 397 6a800f36acd5bf Liu Yu 2008-10-28 398 case EFDCMPGT: 6a800f36acd5bf Liu Yu 2008-10-28 399 cmp = 1; 6a800f36acd5bf Liu Yu 2008-10-28 400 goto cmp_d; 6a800f36acd5bf Liu Yu 2008-10-28 401 6a800f36acd5bf Liu Yu 2008-10-28 402 case EFDCMPLT: 6a800f36acd5bf Liu Yu 2008-10-28 403 cmp = -1; 6a800f36acd5bf Liu Yu 2008-10-28 404 goto cmp_d; 6a800f36acd5bf Liu Yu 2008-10-28 405 6a800f36acd5bf Liu Yu 2008-10-28 406 case EFDCTSF: 6a800f36acd5bf Liu Yu 2008-10-28 407 case EFDCTUF: 28fbf1d540920a Joseph Myers 2013-11-04 408 if (DB_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 409 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 410 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 411 } else { 28fbf1d540920a Joseph Myers 2013-11-04 412 DB_e += (func == EFDCTSF ? 31 : 32); 28fbf1d540920a Joseph Myers 2013-11-04 413 FP_TO_INT_ROUND_D(vc.wp[1], DB, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 414 (func == EFDCTSF) ? 1 : 0); 6a800f36acd5bf Liu Yu 2008-10-28 415 } 6a800f36acd5bf Liu Yu 2008-10-28 416 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 417 6a800f36acd5bf Liu Yu 2008-10-28 418 case EFDCFS: { 6a800f36acd5bf Liu Yu 2008-10-28 419 FP_DECL_S(SB); 6a800f36acd5bf Liu Yu 2008-10-28 420 FP_CLEAR_EXCEPTIONS; 6a800f36acd5bf Liu Yu 2008-10-28 421 FP_UNPACK_SP(SB, vb.wp + 1); b430abc4d10537 Liu Yu 2011-09-05 422 7245fc5bb7a966 Christophe Leroy 2022-09-02 423 pr_debug("SB: %d %08x %d (%d)\n", 6a800f36acd5bf Liu Yu 2008-10-28 424 SB_s, SB_f, SB_e, SB_c); b430abc4d10537 Liu Yu 2011-09-05 425 6a800f36acd5bf Liu Yu 2008-10-28 426 FP_CONV(D, S, 2, 1, DR, SB); 6a800f36acd5bf Liu Yu 2008-10-28 427 goto pack_d; 6a800f36acd5bf Liu Yu 2008-10-28 428 } 6a800f36acd5bf Liu Yu 2008-10-28 429 6a800f36acd5bf Liu Yu 2008-10-28 430 case EFDCTUIDZ: 6a800f36acd5bf Liu Yu 2008-10-28 431 case EFDCTSIDZ: 28fbf1d540920a Joseph Myers 2013-11-04 432 if (DB_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 433 vc.dp[0] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 434 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 435 } else { 28fbf1d540920a Joseph Myers 2013-11-04 436 FP_TO_INT_D(vc.dp[0], DB, 64, 7245fc5bb7a966 Christophe Leroy 2022-09-02 437 ((func & 0x1) == 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 438 } 6a800f36acd5bf Liu Yu 2008-10-28 439 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 440 6a800f36acd5bf Liu Yu 2008-10-28 441 case EFDCTUI: 6a800f36acd5bf Liu Yu 2008-10-28 442 case EFDCTSI: 28fbf1d540920a Joseph Myers 2013-11-04 443 if (DB_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 444 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 445 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 446 } else { 28fbf1d540920a Joseph Myers 2013-11-04 447 FP_TO_INT_ROUND_D(vc.wp[1], DB, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 448 ((func & 0x3) != 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 449 } 28fbf1d540920a Joseph Myers 2013-11-04 450 goto update_regs; 28fbf1d540920a Joseph Myers 2013-11-04 451 6a800f36acd5bf Liu Yu 2008-10-28 452 case EFDCTUIZ: 6a800f36acd5bf Liu Yu 2008-10-28 453 case EFDCTSIZ: 28fbf1d540920a Joseph Myers 2013-11-04 454 if (DB_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 455 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 456 FP_SET_EXCEPTION(FP_EX_INVALID); 6a800f36acd5bf Liu Yu 2008-10-28 457 } else { afc0a07d4a2835 Shan Hai 2010-11-17 458 FP_TO_INT_D(vc.wp[1], DB, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 459 ((func & 0x3) != 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 460 } 6a800f36acd5bf Liu Yu 2008-10-28 461 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 462 6a800f36acd5bf Liu Yu 2008-10-28 463 default: 6a800f36acd5bf Liu Yu 2008-10-28 464 goto illegal; 6a800f36acd5bf Liu Yu 2008-10-28 465 } 6a800f36acd5bf Liu Yu 2008-10-28 466 break; 6a800f36acd5bf Liu Yu 2008-10-28 467 6a800f36acd5bf Liu Yu 2008-10-28 468 pack_d: 7245fc5bb7a966 Christophe Leroy 2022-09-02 469 pr_debug("DR: %d %08x %08x %d (%d)\n", 6a800f36acd5bf Liu Yu 2008-10-28 470 DR_s, DR_f1, DR_f0, DR_e, DR_c); b430abc4d10537 Liu Yu 2011-09-05 471 6a800f36acd5bf Liu Yu 2008-10-28 472 FP_PACK_DP(vc.dp, DR); 6a800f36acd5bf Liu Yu 2008-10-28 473 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 474 6a800f36acd5bf Liu Yu 2008-10-28 475 cmp_d: 6a800f36acd5bf Liu Yu 2008-10-28 476 FP_CMP_D(IR, DA, DB, 3); 6a800f36acd5bf Liu Yu 2008-10-28 477 if (IR == 3 && (FP_ISSIGNAN_D(DA) || FP_ISSIGNAN_D(DB))) 6a800f36acd5bf Liu Yu 2008-10-28 478 FP_SET_EXCEPTION(FP_EX_INVALID); 6a800f36acd5bf Liu Yu 2008-10-28 479 if (IR == cmp) { 6a800f36acd5bf Liu Yu 2008-10-28 480 IR = 0x4; 6a800f36acd5bf Liu Yu 2008-10-28 481 } else { 6a800f36acd5bf Liu Yu 2008-10-28 482 IR = 0; 6a800f36acd5bf Liu Yu 2008-10-28 483 } 6a800f36acd5bf Liu Yu 2008-10-28 484 goto update_ccr; 6a800f36acd5bf Liu Yu 2008-10-28 485 6a800f36acd5bf Liu Yu 2008-10-28 486 } 6a800f36acd5bf Liu Yu 2008-10-28 487 6a800f36acd5bf Liu Yu 2008-10-28 488 case VCT: { 6a800f36acd5bf Liu Yu 2008-10-28 489 FP_DECL_S(SA0); FP_DECL_S(SB0); FP_DECL_S(SR0); 6a800f36acd5bf Liu Yu 2008-10-28 490 FP_DECL_S(SA1); FP_DECL_S(SB1); FP_DECL_S(SR1); 6a800f36acd5bf Liu Yu 2008-10-28 491 int IR0, IR1; 6a800f36acd5bf Liu Yu 2008-10-28 492 6a800f36acd5bf Liu Yu 2008-10-28 493 switch (type) { 6a800f36acd5bf Liu Yu 2008-10-28 494 case AB: 6a800f36acd5bf Liu Yu 2008-10-28 495 case XCR: 6a800f36acd5bf Liu Yu 2008-10-28 496 FP_UNPACK_SP(SA0, va.wp); 6a800f36acd5bf Liu Yu 2008-10-28 497 FP_UNPACK_SP(SA1, va.wp + 1); 7245fc5bb7a966 Christophe Leroy 2022-09-02 498 fallthrough; 6a800f36acd5bf Liu Yu 2008-10-28 499 case XB: 6a800f36acd5bf Liu Yu 2008-10-28 500 FP_UNPACK_SP(SB0, vb.wp); 6a800f36acd5bf Liu Yu 2008-10-28 501 FP_UNPACK_SP(SB1, vb.wp + 1); 6a800f36acd5bf Liu Yu 2008-10-28 502 break; 6a800f36acd5bf Liu Yu 2008-10-28 503 case XA: 6a800f36acd5bf Liu Yu 2008-10-28 504 FP_UNPACK_SP(SA0, va.wp); 6a800f36acd5bf Liu Yu 2008-10-28 505 FP_UNPACK_SP(SA1, va.wp + 1); 6a800f36acd5bf Liu Yu 2008-10-28 506 break; 6a800f36acd5bf Liu Yu 2008-10-28 507 } 6a800f36acd5bf Liu Yu 2008-10-28 508 7245fc5bb7a966 Christophe Leroy 2022-09-02 509 pr_debug("SA0: %d %08x %d (%d)\n", b430abc4d10537 Liu Yu 2011-09-05 510 SA0_s, SA0_f, SA0_e, SA0_c); 7245fc5bb7a966 Christophe Leroy 2022-09-02 511 pr_debug("SA1: %d %08x %d (%d)\n", b430abc4d10537 Liu Yu 2011-09-05 512 SA1_s, SA1_f, SA1_e, SA1_c); 7245fc5bb7a966 Christophe Leroy 2022-09-02 513 pr_debug("SB0: %d %08x %d (%d)\n", b430abc4d10537 Liu Yu 2011-09-05 514 SB0_s, SB0_f, SB0_e, SB0_c); 7245fc5bb7a966 Christophe Leroy 2022-09-02 515 pr_debug("SB1: %d %08x %d (%d)\n", b430abc4d10537 Liu Yu 2011-09-05 516 SB1_s, SB1_f, SB1_e, SB1_c); 6a800f36acd5bf Liu Yu 2008-10-28 517 6a800f36acd5bf Liu Yu 2008-10-28 518 switch (func) { 6a800f36acd5bf Liu Yu 2008-10-28 519 case EVFSABS: 6a800f36acd5bf Liu Yu 2008-10-28 520 vc.wp[0] = va.wp[0] & ~SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 521 vc.wp[1] = va.wp[1] & ~SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 522 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 523 6a800f36acd5bf Liu Yu 2008-10-28 524 case EVFSNABS: 6a800f36acd5bf Liu Yu 2008-10-28 525 vc.wp[0] = va.wp[0] | SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 526 vc.wp[1] = va.wp[1] | SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 527 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 528 6a800f36acd5bf Liu Yu 2008-10-28 529 case EVFSNEG: 6a800f36acd5bf Liu Yu 2008-10-28 530 vc.wp[0] = va.wp[0] ^ SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 531 vc.wp[1] = va.wp[1] ^ SIGN_BIT_S; 6a800f36acd5bf Liu Yu 2008-10-28 532 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 533 6a800f36acd5bf Liu Yu 2008-10-28 534 case EVFSADD: 6a800f36acd5bf Liu Yu 2008-10-28 535 FP_ADD_S(SR0, SA0, SB0); 6a800f36acd5bf Liu Yu 2008-10-28 536 FP_ADD_S(SR1, SA1, SB1); 6a800f36acd5bf Liu Yu 2008-10-28 537 goto pack_vs; 6a800f36acd5bf Liu Yu 2008-10-28 538 6a800f36acd5bf Liu Yu 2008-10-28 539 case EVFSSUB: 6a800f36acd5bf Liu Yu 2008-10-28 540 FP_SUB_S(SR0, SA0, SB0); 6a800f36acd5bf Liu Yu 2008-10-28 541 FP_SUB_S(SR1, SA1, SB1); 6a800f36acd5bf Liu Yu 2008-10-28 542 goto pack_vs; 6a800f36acd5bf Liu Yu 2008-10-28 543 6a800f36acd5bf Liu Yu 2008-10-28 544 case EVFSMUL: 6a800f36acd5bf Liu Yu 2008-10-28 545 FP_MUL_S(SR0, SA0, SB0); 6a800f36acd5bf Liu Yu 2008-10-28 546 FP_MUL_S(SR1, SA1, SB1); 6a800f36acd5bf Liu Yu 2008-10-28 547 goto pack_vs; 6a800f36acd5bf Liu Yu 2008-10-28 548 6a800f36acd5bf Liu Yu 2008-10-28 549 case EVFSDIV: 6a800f36acd5bf Liu Yu 2008-10-28 550 FP_DIV_S(SR0, SA0, SB0); 6a800f36acd5bf Liu Yu 2008-10-28 551 FP_DIV_S(SR1, SA1, SB1); 6a800f36acd5bf Liu Yu 2008-10-28 552 goto pack_vs; 6a800f36acd5bf Liu Yu 2008-10-28 553 6a800f36acd5bf Liu Yu 2008-10-28 554 case EVFSCMPEQ: 6a800f36acd5bf Liu Yu 2008-10-28 555 cmp = 0; 6a800f36acd5bf Liu Yu 2008-10-28 556 goto cmp_vs; 6a800f36acd5bf Liu Yu 2008-10-28 557 6a800f36acd5bf Liu Yu 2008-10-28 558 case EVFSCMPGT: 6a800f36acd5bf Liu Yu 2008-10-28 559 cmp = 1; 6a800f36acd5bf Liu Yu 2008-10-28 560 goto cmp_vs; 6a800f36acd5bf Liu Yu 2008-10-28 561 6a800f36acd5bf Liu Yu 2008-10-28 562 case EVFSCMPLT: 6a800f36acd5bf Liu Yu 2008-10-28 563 cmp = -1; 6a800f36acd5bf Liu Yu 2008-10-28 564 goto cmp_vs; 6a800f36acd5bf Liu Yu 2008-10-28 565 6a800f36acd5bf Liu Yu 2008-10-28 566 case EVFSCTUF: 28fbf1d540920a Joseph Myers 2013-11-04 567 case EVFSCTSF: 28fbf1d540920a Joseph Myers 2013-11-04 568 if (SB0_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 569 vc.wp[0] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 570 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 571 } else { 28fbf1d540920a Joseph Myers 2013-11-04 572 SB0_e += (func == EVFSCTSF ? 31 : 32); 28fbf1d540920a Joseph Myers 2013-11-04 573 FP_TO_INT_ROUND_S(vc.wp[0], SB0, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 574 (func == EVFSCTSF) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 575 } 28fbf1d540920a Joseph Myers 2013-11-04 576 if (SB1_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 577 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 578 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 579 } else { 28fbf1d540920a Joseph Myers 2013-11-04 580 SB1_e += (func == EVFSCTSF ? 31 : 32); 28fbf1d540920a Joseph Myers 2013-11-04 581 FP_TO_INT_ROUND_S(vc.wp[1], SB1, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 582 (func == EVFSCTSF) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 583 } 6a800f36acd5bf Liu Yu 2008-10-28 584 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 585 6a800f36acd5bf Liu Yu 2008-10-28 586 case EVFSCTUI: 6a800f36acd5bf Liu Yu 2008-10-28 587 case EVFSCTSI: 28fbf1d540920a Joseph Myers 2013-11-04 588 if (SB0_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 589 vc.wp[0] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 590 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 591 } else { 28fbf1d540920a Joseph Myers 2013-11-04 592 FP_TO_INT_ROUND_S(vc.wp[0], SB0, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 593 ((func & 0x3) != 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 594 } 28fbf1d540920a Joseph Myers 2013-11-04 595 if (SB1_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 596 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 597 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 598 } else { 28fbf1d540920a Joseph Myers 2013-11-04 599 FP_TO_INT_ROUND_S(vc.wp[1], SB1, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 600 ((func & 0x3) != 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 601 } 28fbf1d540920a Joseph Myers 2013-11-04 602 goto update_regs; 28fbf1d540920a Joseph Myers 2013-11-04 603 6a800f36acd5bf Liu Yu 2008-10-28 604 case EVFSCTUIZ: 6a800f36acd5bf Liu Yu 2008-10-28 605 case EVFSCTSIZ: 28fbf1d540920a Joseph Myers 2013-11-04 606 if (SB0_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 607 vc.wp[0] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 608 FP_SET_EXCEPTION(FP_EX_INVALID); 6a800f36acd5bf Liu Yu 2008-10-28 609 } else { afc0a07d4a2835 Shan Hai 2010-11-17 610 FP_TO_INT_S(vc.wp[0], SB0, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 611 ((func & 0x3) != 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 612 } 28fbf1d540920a Joseph Myers 2013-11-04 613 if (SB1_c == FP_CLS_NAN) { 28fbf1d540920a Joseph Myers 2013-11-04 614 vc.wp[1] = 0; 28fbf1d540920a Joseph Myers 2013-11-04 615 FP_SET_EXCEPTION(FP_EX_INVALID); 28fbf1d540920a Joseph Myers 2013-11-04 616 } else { afc0a07d4a2835 Shan Hai 2010-11-17 617 FP_TO_INT_S(vc.wp[1], SB1, 32, 7245fc5bb7a966 Christophe Leroy 2022-09-02 618 ((func & 0x3) != 0) ? 1 : 0); 28fbf1d540920a Joseph Myers 2013-11-04 619 } 6a800f36acd5bf Liu Yu 2008-10-28 620 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 621 6a800f36acd5bf Liu Yu 2008-10-28 622 default: 6a800f36acd5bf Liu Yu 2008-10-28 623 goto illegal; 6a800f36acd5bf Liu Yu 2008-10-28 624 } 6a800f36acd5bf Liu Yu 2008-10-28 625 break; 6a800f36acd5bf Liu Yu 2008-10-28 626 6a800f36acd5bf Liu Yu 2008-10-28 627 pack_vs: 7245fc5bb7a966 Christophe Leroy 2022-09-02 628 pr_debug("SR0: %d %08x %d (%d)\n", b430abc4d10537 Liu Yu 2011-09-05 629 SR0_s, SR0_f, SR0_e, SR0_c); 7245fc5bb7a966 Christophe Leroy 2022-09-02 630 pr_debug("SR1: %d %08x %d (%d)\n", b430abc4d10537 Liu Yu 2011-09-05 631 SR1_s, SR1_f, SR1_e, SR1_c); b430abc4d10537 Liu Yu 2011-09-05 632 6a800f36acd5bf Liu Yu 2008-10-28 633 FP_PACK_SP(vc.wp, SR0); 6a800f36acd5bf Liu Yu 2008-10-28 634 FP_PACK_SP(vc.wp + 1, SR1); 6a800f36acd5bf Liu Yu 2008-10-28 635 goto update_regs; 6a800f36acd5bf Liu Yu 2008-10-28 636 6a800f36acd5bf Liu Yu 2008-10-28 637 cmp_vs: 6a800f36acd5bf Liu Yu 2008-10-28 638 { 6a800f36acd5bf Liu Yu 2008-10-28 639 int ch, cl; 6a800f36acd5bf Liu Yu 2008-10-28 640 6a800f36acd5bf Liu Yu 2008-10-28 641 FP_CMP_S(IR0, SA0, SB0, 3); 6a800f36acd5bf Liu Yu 2008-10-28 642 FP_CMP_S(IR1, SA1, SB1, 3); 6a800f36acd5bf Liu Yu 2008-10-28 643 if (IR0 == 3 && (FP_ISSIGNAN_S(SA0) || FP_ISSIGNAN_S(SB0))) 6a800f36acd5bf Liu Yu 2008-10-28 644 FP_SET_EXCEPTION(FP_EX_INVALID); 6a800f36acd5bf Liu Yu 2008-10-28 645 if (IR1 == 3 && (FP_ISSIGNAN_S(SA1) || FP_ISSIGNAN_S(SB1))) 6a800f36acd5bf Liu Yu 2008-10-28 646 FP_SET_EXCEPTION(FP_EX_INVALID); 6a800f36acd5bf Liu Yu 2008-10-28 647 ch = (IR0 == cmp) ? 1 : 0; 6a800f36acd5bf Liu Yu 2008-10-28 648 cl = (IR1 == cmp) ? 1 : 0; 6a800f36acd5bf Liu Yu 2008-10-28 649 IR = (ch << 3) | (cl << 2) | ((ch | cl) << 1) | 6a800f36acd5bf Liu Yu 2008-10-28 650 ((ch & cl) << 0); 6a800f36acd5bf Liu Yu 2008-10-28 651 goto update_ccr; 6a800f36acd5bf Liu Yu 2008-10-28 652 } 6a800f36acd5bf Liu Yu 2008-10-28 653 } 6a800f36acd5bf Liu Yu 2008-10-28 654 default: 6a800f36acd5bf Liu Yu 2008-10-28 655 return -EINVAL; 6a800f36acd5bf Liu Yu 2008-10-28 656 } 6a800f36acd5bf Liu Yu 2008-10-28 657 6a800f36acd5bf Liu Yu 2008-10-28 658 update_ccr: 6a800f36acd5bf Liu Yu 2008-10-28 659 regs->ccr &= ~(15 << ((7 - ((speinsn >> 23) & 0x7)) << 2)); 6a800f36acd5bf Liu Yu 2008-10-28 660 regs->ccr |= (IR << ((7 - ((speinsn >> 23) & 0x7)) << 2)); 6a800f36acd5bf Liu Yu 2008-10-28 661 6a800f36acd5bf Liu Yu 2008-10-28 662 update_regs: 640e922501103a Joseph Myers 2013-12-10 663 /* 640e922501103a Joseph Myers 2013-12-10 664 * If the "invalid" exception sticky bit was set by the 640e922501103a Joseph Myers 2013-12-10 665 * processor for non-finite input, but was not set before the 640e922501103a Joseph Myers 2013-12-10 666 * instruction being emulated, clear it. Likewise for the 640e922501103a Joseph Myers 2013-12-10 667 * "underflow" bit, which may have been set by the processor 640e922501103a Joseph Myers 2013-12-10 668 * for exact underflow, not just inexact underflow when the 640e922501103a Joseph Myers 2013-12-10 669 * flag should be set for IEEE 754 semantics. Other sticky 640e922501103a Joseph Myers 2013-12-10 670 * exceptions will only be set by the processor when they are 640e922501103a Joseph Myers 2013-12-10 671 * correct according to IEEE 754 semantics, and we must not 640e922501103a Joseph Myers 2013-12-10 672 * clear sticky bits that were already set before the emulated 640e922501103a Joseph Myers 2013-12-10 673 * instruction as they represent the user-visible sticky 640e922501103a Joseph Myers 2013-12-10 674 * exception status. "inexact" traps to kernel are not 640e922501103a Joseph Myers 2013-12-10 675 * required for IEEE semantics and are not enabled by default, 640e922501103a Joseph Myers 2013-12-10 676 * so the "inexact" sticky bit may have been set by a previous 640e922501103a Joseph Myers 2013-12-10 677 * instruction without the kernel being aware of it. 640e922501103a Joseph Myers 2013-12-10 678 */ 640e922501103a Joseph Myers 2013-12-10 679 __FPU_FPSCR 640e922501103a Joseph Myers 2013-12-10 680 &= ~(FP_EX_INVALID | FP_EX_UNDERFLOW) | current->thread.spefscr_last; 6a800f36acd5bf Liu Yu 2008-10-28 681 __FPU_FPSCR |= (FP_CUR_EXCEPTIONS & FP_EX_MASK); 6a800f36acd5bf Liu Yu 2008-10-28 682 mtspr(SPRN_SPEFSCR, __FPU_FPSCR); 640e922501103a Joseph Myers 2013-12-10 683 current->thread.spefscr_last = __FPU_FPSCR; 6a800f36acd5bf Liu Yu 2008-10-28 684 6a800f36acd5bf Liu Yu 2008-10-28 685 current->thread.evr[fc] = vc.wp[0]; 6a800f36acd5bf Liu Yu 2008-10-28 686 regs->gpr[fc] = vc.wp[1]; 6a800f36acd5bf Liu Yu 2008-10-28 687 b430abc4d10537 Liu Yu 2011-09-05 688 pr_debug("ccr = %08lx\n", regs->ccr); b430abc4d10537 Liu Yu 2011-09-05 689 pr_debug("cur exceptions = %08x spefscr = %08lx\n", 6a800f36acd5bf Liu Yu 2008-10-28 690 FP_CUR_EXCEPTIONS, __FPU_FPSCR); b430abc4d10537 Liu Yu 2011-09-05 691 pr_debug("vc: %08x %08x\n", vc.wp[0], vc.wp[1]); b430abc4d10537 Liu Yu 2011-09-05 692 pr_debug("va: %08x %08x\n", va.wp[0], va.wp[1]); b430abc4d10537 Liu Yu 2011-09-05 693 pr_debug("vb: %08x %08x\n", vb.wp[0], vb.wp[1]); 6a800f36acd5bf Liu Yu 2008-10-28 694 01c9ccee3c3051 Joseph Myers 2013-11-04 695 if (current->thread.fpexc_mode & PR_FP_EXC_SW_ENABLE) { 01c9ccee3c3051 Joseph Myers 2013-11-04 696 if ((FP_CUR_EXCEPTIONS & FP_EX_DIVZERO) 01c9ccee3c3051 Joseph Myers 2013-11-04 697 && (current->thread.fpexc_mode & PR_FP_EXC_DIV)) 01c9ccee3c3051 Joseph Myers 2013-11-04 698 return 1; 01c9ccee3c3051 Joseph Myers 2013-11-04 699 if ((FP_CUR_EXCEPTIONS & FP_EX_OVERFLOW) 01c9ccee3c3051 Joseph Myers 2013-11-04 700 && (current->thread.fpexc_mode & PR_FP_EXC_OVF)) 01c9ccee3c3051 Joseph Myers 2013-11-04 701 return 1; 01c9ccee3c3051 Joseph Myers 2013-11-04 702 if ((FP_CUR_EXCEPTIONS & FP_EX_UNDERFLOW) 01c9ccee3c3051 Joseph Myers 2013-11-04 703 && (current->thread.fpexc_mode & PR_FP_EXC_UND)) 01c9ccee3c3051 Joseph Myers 2013-11-04 704 return 1; 01c9ccee3c3051 Joseph Myers 2013-11-04 705 if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) 01c9ccee3c3051 Joseph Myers 2013-11-04 706 && (current->thread.fpexc_mode & PR_FP_EXC_RES)) 01c9ccee3c3051 Joseph Myers 2013-11-04 707 return 1; 01c9ccee3c3051 Joseph Myers 2013-11-04 708 if ((FP_CUR_EXCEPTIONS & FP_EX_INVALID) 01c9ccee3c3051 Joseph Myers 2013-11-04 709 && (current->thread.fpexc_mode & PR_FP_EXC_INV)) 01c9ccee3c3051 Joseph Myers 2013-11-04 710 return 1; 01c9ccee3c3051 Joseph Myers 2013-11-04 711 } 6a800f36acd5bf Liu Yu 2008-10-28 712 return 0; 6a800f36acd5bf Liu Yu 2008-10-28 713 6a800f36acd5bf Liu Yu 2008-10-28 714 illegal: ac6f120369ffe6 Liu Yu 2011-01-25 715 if (have_e500_cpu_a005_erratum) { ac6f120369ffe6 Liu Yu 2011-01-25 716 /* according to e500 cpu a005 erratum, reissue efp inst */ 59dc5bfca0cb6a Nicholas Piggin 2021-06-18 717 regs_add_return_ip(regs, -4); b430abc4d10537 Liu Yu 2011-09-05 718 pr_debug("re-issue efp inst: %08lx\n", speinsn); ac6f120369ffe6 Liu Yu 2011-01-25 719 return 0; ac6f120369ffe6 Liu Yu 2011-01-25 720 } ac6f120369ffe6 Liu Yu 2011-01-25 721 6a800f36acd5bf Liu Yu 2008-10-28 722 printk(KERN_ERR "\nOoops! IEEE-754 compliance handler encountered un-supported instruction.\ninst code: %08lx\n", speinsn); 6a800f36acd5bf Liu Yu 2008-10-28 723 return -ENOSYS; 6a800f36acd5bf Liu Yu 2008-10-28 724 } 6a800f36acd5bf Liu Yu 2008-10-28 725 :::::: The code at line 177 was first introduced by commit :::::: 6a800f36acd5bf06b5fe2cb27c4d0524d60c3df5 powerpc: Add SPE/EFP math emulation for E500v1/v2 processors. :::::: TO: Liu Yu <yu....@freescale.com> :::::: CC: Kumar Gala <ga...@kernel.crashing.org> -- 0-DAY CI Kernel Test Service https://01.org/lkp