This patch set contains basic components for supporting the nds32 FPU, such as exception handlers and context switch for FPU registers. By default, the lazy FPU scheme is supported and the user can configure it via CONFIG_LZAY_FPU. In addition, a floating point emulator is required to handle all arithmetic of denormalized number because it is not supported by the nds32 FPU.
As mentioned above, the nds32 FPU does not support denormalized number This means the denormalized operands and results are not permitted. If an instruction contains denormalized operands, the nds32 FPU will raise an denormalized input exception to inform kernel to deal with this instruction. If the result of the instruction is a denormalized number, normally nds32 FPU will treat it as an underflow case and round the result to an appropriate value based on current rounding mode. Obviously, there is a precision gap for tininess number. To reduce this precision gap, kernel will enable the underflow trap by default to direct all underflow cases to the floating pointer emulator. By the floating pointer emulator, the correct denormalized number can be derived in kernel and return to the user program. The feature can be configured by CONFIG_SUPPORT_DENORMAL_ARITHMETIC, and if the precision requirement is not critical for tininess number, user may disables this feature to keep performance. The implementation of floating point emulator is based on soft-fp which is located in include/math-emu folder. However, soft-fp is too outdated to pass the current compiler check. The needed modifications for soft-fp are included in this patch set Changes in v3: - Kernel with FPU support enabled still can run on a CPU without FPU - Rename CONFIG_UNLAZY_FPU to CONFIG_LAYZ_FPU - Rename _switch() to _switch_fpu() - Store FPU context when kernel suspends - Modify the comments in code and patch Changes in v2: - Remove the initilzation for floating pointer register before entering to signal handler. Vincent Chen (5): nds32: nds32 FPU port nds32: Support FP emulation nds32: support denormalized result through FP emulator math-emu/op-2.h: Use statement expressions to prevent negative constant shift math-emu/soft-fp.h: (_FP_ROUND_ZERO) cast 0 to void to fix warning arch/nds32/Kconfig | 1 + arch/nds32/Kconfig.cpu | 34 +++ arch/nds32/Makefile | 11 + arch/nds32/include/asm/bitfield.h | 15 ++ arch/nds32/include/asm/elf.h | 11 + arch/nds32/include/asm/fpu.h | 126 +++++++++++ arch/nds32/include/asm/fpuemu.h | 32 +++ arch/nds32/include/asm/nds32_fpu_inst.h | 109 +++++++++ arch/nds32/include/asm/processor.h | 7 + arch/nds32/include/asm/sfp-machine.h | 158 +++++++++++++ arch/nds32/include/asm/syscalls.h | 1 + arch/nds32/include/uapi/asm/auxvec.h | 7 + arch/nds32/include/uapi/asm/sigcontext.h | 14 ++ arch/nds32/include/uapi/asm/udftrap.h | 13 + arch/nds32/include/uapi/asm/unistd.h | 2 + arch/nds32/kernel/Makefile | 10 + arch/nds32/kernel/ex-entry.S | 24 ++- arch/nds32/kernel/ex-exit.S | 13 +- arch/nds32/kernel/ex-scall.S | 8 +- arch/nds32/kernel/fpu.c | 269 ++++++++++++++++++++++ arch/nds32/kernel/process.c | 64 +++++- arch/nds32/kernel/setup.c | 12 +- arch/nds32/kernel/signal.c | 62 +++++- arch/nds32/kernel/sleep.S | 2 + arch/nds32/kernel/sys_nds32.c | 32 +++ arch/nds32/kernel/traps.c | 16 ++ arch/nds32/math-emu/Makefile | 7 + arch/nds32/math-emu/faddd.c | 24 ++ arch/nds32/math-emu/fadds.c | 24 ++ arch/nds32/math-emu/fcmpd.c | 24 ++ arch/nds32/math-emu/fcmps.c | 24 ++ arch/nds32/math-emu/fd2s.c | 22 ++ arch/nds32/math-emu/fdivd.c | 27 +++ arch/nds32/math-emu/fdivs.c | 26 +++ arch/nds32/math-emu/fmuld.c | 23 ++ arch/nds32/math-emu/fmuls.c | 23 ++ arch/nds32/math-emu/fnegd.c | 21 ++ arch/nds32/math-emu/fnegs.c | 21 ++ arch/nds32/math-emu/fpuemu.c | 357 ++++++++++++++++++++++++++++++ arch/nds32/math-emu/fs2d.c | 23 ++ arch/nds32/math-emu/fsqrtd.c | 21 ++ arch/nds32/math-emu/fsqrts.c | 21 ++ arch/nds32/math-emu/fsubd.c | 27 +++ arch/nds32/math-emu/fsubs.c | 27 +++ include/math-emu/op-2.h | 97 ++++----- include/math-emu/soft-fp.h | 2 +- 46 files changed, 1827 insertions(+), 67 deletions(-) create mode 100644 arch/nds32/include/asm/fpu.h create mode 100644 arch/nds32/include/asm/fpuemu.h create mode 100644 arch/nds32/include/asm/nds32_fpu_inst.h create mode 100644 arch/nds32/include/asm/sfp-machine.h create mode 100644 arch/nds32/include/uapi/asm/udftrap.h create mode 100644 arch/nds32/kernel/fpu.c create mode 100644 arch/nds32/math-emu/Makefile create mode 100644 arch/nds32/math-emu/faddd.c create mode 100644 arch/nds32/math-emu/fadds.c create mode 100644 arch/nds32/math-emu/fcmpd.c create mode 100644 arch/nds32/math-emu/fcmps.c create mode 100644 arch/nds32/math-emu/fd2s.c create mode 100644 arch/nds32/math-emu/fdivd.c create mode 100644 arch/nds32/math-emu/fdivs.c create mode 100644 arch/nds32/math-emu/fmuld.c create mode 100644 arch/nds32/math-emu/fmuls.c create mode 100644 arch/nds32/math-emu/fnegd.c create mode 100644 arch/nds32/math-emu/fnegs.c create mode 100644 arch/nds32/math-emu/fpuemu.c create mode 100644 arch/nds32/math-emu/fs2d.c create mode 100644 arch/nds32/math-emu/fsqrtd.c create mode 100644 arch/nds32/math-emu/fsqrts.c create mode 100644 arch/nds32/math-emu/fsubd.c create mode 100644 arch/nds32/math-emu/fsubs.c