优化未定义异常时自动开启FPU的判断条件,当FPU末开启时将自动开启。
This commit is contained in:
parent
c5a0df2254
commit
e939ffe355
|
@ -47,30 +47,24 @@ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs)
|
||||||
{
|
{
|
||||||
#ifdef RT_USING_FPU
|
#ifdef RT_USING_FPU
|
||||||
{
|
{
|
||||||
uint32_t ins;
|
uint32_t val;
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
|
|
||||||
if (regs->cpsr & (1 << 5))
|
if (regs->cpsr & (1 << 5))
|
||||||
{
|
{
|
||||||
/* thumb mode */
|
/* thumb mode */
|
||||||
addr = regs->pc - 2;
|
addr = regs->pc - 2;
|
||||||
ins = (uint32_t)*(uint16_t*)addr;
|
|
||||||
if ((ins & (3 << 11)) != 0)
|
|
||||||
{
|
|
||||||
/* 32 bit ins */
|
|
||||||
ins <<= 16;
|
|
||||||
ins += *(uint16_t*)(addr + 2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
addr = regs->pc - 4;
|
addr = regs->pc - 4;
|
||||||
ins = *(uint32_t*)addr;
|
|
||||||
}
|
}
|
||||||
if ((ins & 0xe00) == 0xa00)
|
asm volatile ("vmrs %0, fpexc" : "=r"(val)::"memory");
|
||||||
|
|
||||||
|
if (!(val & 0x40000000))
|
||||||
{
|
{
|
||||||
/* float ins */
|
/* float ins */
|
||||||
uint32_t val = (1U << 30);
|
val = (1U << 30);
|
||||||
|
|
||||||
asm volatile ("vmsr fpexc, %0"::"r"(val):"memory");
|
asm volatile ("vmsr fpexc, %0"::"r"(val):"memory");
|
||||||
regs->pc = addr;
|
regs->pc = addr;
|
||||||
|
|
Loading…
Reference in New Issue