From 592f35ac0ff8d525fad2dc606b53b4cd8b84fd69 Mon Sep 17 00:00:00 2001 From: Ali Saidi Date: Fri, 2 Feb 2007 18:04:42 -0500 Subject: fix mostly floating point related src/arch/sparc/floatregfile.cc: fix fp read/writing to registers... looking for suggestions on cleaner ways if anyone has them src/arch/sparc/isa/decoder.isa: fix some fp implementations src/arch/sparc/isa/formats/basic.isa: add new fp op class that 0 cexec in fsr and sets rounding mode for the up comming op src/arch/sparc/isa/includes.isa: include the appropriate header files for the rounding code src/arch/sparc/miscregfile.cc: print fsr out when it's read/written and the Sparc traceflgas in on src/cpu/exetrace.cc: fix printing of float registers --HG-- extra : convert_revision : 49faab27f2e786a8455f9ca0f3f0132380c9d992 --- src/arch/sparc/isa/formats/basic.isa | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/arch/sparc/isa/formats/basic.isa') diff --git a/src/arch/sparc/isa/formats/basic.isa b/src/arch/sparc/isa/formats/basic.isa index e8762a205..fac523aeb 100644 --- a/src/arch/sparc/isa/formats/basic.isa +++ b/src/arch/sparc/isa/formats/basic.isa @@ -103,3 +103,42 @@ def format BasicOperate(code, *flags) {{ decode_block = BasicDecode.subst(iop) exec_output = BasicExecute.subst(iop) }}; + +def format FpBasic(code, *flags) {{ + fp_code = """ + Fsr = insertBits(Fsr,4,0,0); +#if defined(__sun) || defined (__OpenBSD__) + fp_rnd newrnd = FP_RN; + switch (Fsr<31:30>) { + case 0: newrnd = FP_RN; break; + case 1: newrnd = FP_RZ; break; + case 2: newrnd = FP_RP; break; + case 3: newrnd = FP_RM; break; + } + fp_rnd oldrnd = fpsetround(newrnd); +#else + int newrnd = FE_TONEAREST; + switch (Fsr<31:30>) { + case 0: newrnd = FE_TONEAREST; break; + case 1: newrnd = FE_TOWARDZERO; break; + case 2: newrnd = FE_UPWARD; break; + case 3: newrnd = FE_DOWNWARD; break; + } + int oldrnd = fegetround(); + fesetround(newrnd); +#endif +""" + fp_code += code + fp_code += """ +#if defined(__sun) || defined (__OpenBSD__) + fpsetround(oldrnd); +#else + fesetround(oldrnd); +#endif +""" + iop = InstObjParams(name, Name, 'SparcStaticInst', fp_code, flags) + header_output = BasicDeclare.subst(iop) + decoder_output = BasicConstructor.subst(iop) + decode_block = BasicDecode.subst(iop) + exec_output = BasicExecute.subst(iop) +}}; -- cgit v1.2.3