powerpc/math-emu: Fix decoding of some instructions

The decoding of some instructions such as fsqrt{s} was incorrect,
using the wrong registers, and thus could not work.

This fixes it and also adds a couple of place holders for missing
instructions.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent a5e4797b
...@@ -4,7 +4,8 @@ obj-$(CONFIG_MATH_EMULATION) += fabs.o fadd.o fadds.o fcmpo.o fcmpu.o \ ...@@ -4,7 +4,8 @@ obj-$(CONFIG_MATH_EMULATION) += fabs.o fadd.o fadds.o fcmpo.o fcmpu.o \
fmadd.o fmadds.o fmsub.o fmsubs.o \ fmadd.o fmadds.o fmsub.o fmsubs.o \
fmul.o fmuls.o fnabs.o fneg.o \ fmul.o fmuls.o fnabs.o fneg.o \
fnmadd.o fnmadds.o fnmsub.o fnmsubs.o \ fnmadd.o fnmadds.o fnmsub.o fnmsubs.o \
fres.o frsp.o frsqrte.o fsel.o lfs.o \ fres.o fre.o frsp.o fsel.o lfs.o \
frsqrte.o frsqrtes.o \
fsqrt.o fsqrts.o fsub.o fsubs.o \ fsqrt.o fsqrts.o fsub.o fsubs.o \
mcrfs.o mffs.o mtfsb0.o mtfsb1.o \ mcrfs.o mffs.o mtfsb0.o mtfsb1.o \
mtfsf.o mtfsfi.o stfiwx.o stfs.o \ mtfsf.o mtfsfi.o stfiwx.o stfs.o \
......
#include <linux/types.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
int fre(void *frD, void *frB)
{
#ifdef DEBUG
printk("%s: %p %p\n", __func__, frD, frB);
#endif
return -ENOSYS;
}
#include <linux/types.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
int frsqrtes(void *frD, void *frB)
{
#ifdef DEBUG
printk("%s: %p %p\n", __func__, frD, frB);
#endif
return 0;
}
...@@ -58,8 +58,10 @@ FLOATFUNC(fnabs); ...@@ -58,8 +58,10 @@ FLOATFUNC(fnabs);
FLOATFUNC(fneg); FLOATFUNC(fneg);
/* Optional */ /* Optional */
FLOATFUNC(fre);
FLOATFUNC(fres); FLOATFUNC(fres);
FLOATFUNC(frsqrte); FLOATFUNC(frsqrte);
FLOATFUNC(frsqrtes);
FLOATFUNC(fsel); FLOATFUNC(fsel);
FLOATFUNC(fsqrt); FLOATFUNC(fsqrt);
FLOATFUNC(fsqrts); FLOATFUNC(fsqrts);
...@@ -97,6 +99,7 @@ FLOATFUNC(fsqrts); ...@@ -97,6 +99,7 @@ FLOATFUNC(fsqrts);
#define FSQRTS 0x016 /* 22 */ #define FSQRTS 0x016 /* 22 */
#define FRES 0x018 /* 24 */ #define FRES 0x018 /* 24 */
#define FMULS 0x019 /* 25 */ #define FMULS 0x019 /* 25 */
#define FRSQRTES 0x01a /* 26 */
#define FMSUBS 0x01c /* 28 */ #define FMSUBS 0x01c /* 28 */
#define FMADDS 0x01d /* 29 */ #define FMADDS 0x01d /* 29 */
#define FNMSUBS 0x01e /* 30 */ #define FNMSUBS 0x01e /* 30 */
...@@ -109,6 +112,7 @@ FLOATFUNC(fsqrts); ...@@ -109,6 +112,7 @@ FLOATFUNC(fsqrts);
#define FADD 0x015 /* 21 */ #define FADD 0x015 /* 21 */
#define FSQRT 0x016 /* 22 */ #define FSQRT 0x016 /* 22 */
#define FSEL 0x017 /* 23 */ #define FSEL 0x017 /* 23 */
#define FRE 0x018 /* 24 */
#define FMUL 0x019 /* 25 */ #define FMUL 0x019 /* 25 */
#define FRSQRTE 0x01a /* 26 */ #define FRSQRTE 0x01a /* 26 */
#define FMSUB 0x01c /* 28 */ #define FMSUB 0x01c /* 28 */
...@@ -299,9 +303,10 @@ do_mathemu(struct pt_regs *regs) ...@@ -299,9 +303,10 @@ do_mathemu(struct pt_regs *regs)
case FDIVS: func = fdivs; type = AB; break; case FDIVS: func = fdivs; type = AB; break;
case FSUBS: func = fsubs; type = AB; break; case FSUBS: func = fsubs; type = AB; break;
case FADDS: func = fadds; type = AB; break; case FADDS: func = fadds; type = AB; break;
case FSQRTS: func = fsqrts; type = AB; break; case FSQRTS: func = fsqrts; type = XB; break;
case FRES: func = fres; type = AB; break; case FRES: func = fres; type = XB; break;
case FMULS: func = fmuls; type = AC; break; case FMULS: func = fmuls; type = AC; break;
case FRSQRTES: func = frsqrtes;type = XB; break;
case FMSUBS: func = fmsubs; type = ABC; break; case FMSUBS: func = fmsubs; type = ABC; break;
case FMADDS: func = fmadds; type = ABC; break; case FMADDS: func = fmadds; type = ABC; break;
case FNMSUBS: func = fnmsubs; type = ABC; break; case FNMSUBS: func = fnmsubs; type = ABC; break;
...@@ -317,10 +322,11 @@ do_mathemu(struct pt_regs *regs) ...@@ -317,10 +322,11 @@ do_mathemu(struct pt_regs *regs)
case FDIV: func = fdiv; type = AB; break; case FDIV: func = fdiv; type = AB; break;
case FSUB: func = fsub; type = AB; break; case FSUB: func = fsub; type = AB; break;
case FADD: func = fadd; type = AB; break; case FADD: func = fadd; type = AB; break;
case FSQRT: func = fsqrt; type = AB; break; case FSQRT: func = fsqrt; type = XB; break;
case FRE: func = fre; type = XB; break;
case FSEL: func = fsel; type = ABC; break; case FSEL: func = fsel; type = ABC; break;
case FMUL: func = fmul; type = AC; break; case FMUL: func = fmul; type = AC; break;
case FRSQRTE: func = frsqrte; type = AB; break; case FRSQRTE: func = frsqrte; type = XB; break;
case FMSUB: func = fmsub; type = ABC; break; case FMSUB: func = fmsub; type = ABC; break;
case FMADD: func = fmadd; type = ABC; break; case FMADD: func = fmadd; type = ABC; break;
case FNMSUB: func = fnmsub; type = ABC; break; case FNMSUB: func = fnmsub; type = ABC; break;
......
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