Vincent Chen <vince...@andestech.com> 於 2018年11月22日 週四 上午11:14寫道: > > 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 v4: > - Fix compilation error > > 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 | 5 + > 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 | 4 + > 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 | 4 +- > 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, 1816 insertions(+), 68 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
Hi Vincent, Thank you. Acked-by: Greentime Hu <greent...@andestech.com>