From 746ceb93fdb13f74ea2e18f980d122f8bfb5cd0a Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 8 Nov 2006 00:32:04 -0500 Subject: [PATCH] Replaced getArg with a SPARC implementation. --HG-- extra : convert_revision : ba31171a81b6c46de2997de2701d35fcf8c614b7 --- src/arch/sparc/arguments.cc | 16 +++++++++------- src/arch/sparc/arguments.hh | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/arch/sparc/arguments.cc b/src/arch/sparc/arguments.cc index a0a31567e..44adf4a15 100644 --- a/src/arch/sparc/arguments.cc +++ b/src/arch/sparc/arguments.cc @@ -54,16 +54,18 @@ Arguments::Data::alloc(size_t size) uint64_t Arguments::getArg(bool fp) { - //XXX This needs to be replaced with the sparc version + //The caller uses %o0-%05 for the first 6 arguments even if their floating + //point. Double precision floating point values take two registers/args. + //Quads, structs, and unions are passed as pointers. All arguments beyond + //the sixth are passed on the stack past the 16 word window save area, + //space for the struct/union return pointer, and space reserved for the + //first 6 arguments which the caller may use but doesn't have to. if (number < 6) { - if (fp) - return tc->readFloatRegBits(16 + number); - else - return tc->readIntReg(16 + number); + return tc->readIntReg(8 + number); } else { - Addr sp = tc->readIntReg(30); + Addr sp = tc->readIntReg(14); VirtualPort *vp = tc->getVirtPort(tc); - uint64_t arg = vp->read(sp + (number-6) * sizeof(uint64_t)); + uint64_t arg = vp->read(sp + 92 + (number-6) * sizeof(uint64_t)); tc->delVirtPort(vp); return arg; } diff --git a/src/arch/sparc/arguments.hh b/src/arch/sparc/arguments.hh index 0d059a564..8f925dd25 100644 --- a/src/arch/sparc/arguments.hh +++ b/src/arch/sparc/arguments.hh @@ -144,6 +144,6 @@ class Arguments } }; -}; // namespace AlphaISA +}; // namespace SparcISA -#endif // __ARCH_ALPHA_ARGUMENTS_HH__ +#endif // __ARCH_SPARC_ARGUMENTS_HH__ -- 2.30.2