sh: Subnormal double to float conversion
This patch adds support for the SH4 to convert a subnormal double into a float by catching the FPE and implementing the FCNVDS instruction in software. Signed-off-by: Carl Shaw <carl.shaw@st.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
@@ -36,7 +36,7 @@ extern unsigned long int float32_add(unsigned long int a, unsigned long int b);
|
||||
extern unsigned long long float64_sub(unsigned long long a,
|
||||
unsigned long long b);
|
||||
extern unsigned long int float32_sub(unsigned long int a, unsigned long int b);
|
||||
|
||||
extern unsigned long int float64_to_float32(unsigned long long a);
|
||||
static unsigned int fpu_exception_flags;
|
||||
|
||||
/*
|
||||
@@ -415,6 +415,29 @@ static int ieee_fpe_handler(struct pt_regs *regs)
|
||||
} else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
} else if ((finsn & 0xf0bd) == 0xf0bd) {
|
||||
/* fcnvds - double to single precision convert */
|
||||
struct task_struct *tsk = current;
|
||||
int m;
|
||||
unsigned int hx;
|
||||
|
||||
m = (finsn >> 9) & 0x7;
|
||||
hx = tsk->thread.fpu.hard.fp_regs[m];
|
||||
|
||||
if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR)
|
||||
&& ((hx & 0x7fffffff) < 0x00100000)) {
|
||||
/* subnormal double to float conversion */
|
||||
long long llx;
|
||||
|
||||
llx = ((long long)tsk->thread.fpu.hard.fp_regs[m] << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[m + 1];
|
||||
|
||||
tsk->thread.fpu.hard.fpul = float64_to_float32(llx);
|
||||
} else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user