From 6d8d6d15cdf5547740afbd41efe7c0f1d62079f3 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 6 Apr 2006 14:52:44 -0400 Subject: [PATCH] Fixed up the isa description. Also added some capability to the isa_parser in the InstObjParams constructor. arch/isa_parser.py: Expanded the capability of the InstObjParams constructor to allow adding in extra keys for use in templates. These are added as key, value tuples as optional arguements. arch/sparc/isa/base.isa: arch/sparc/isa/formats/mem.isa: arch/sparc/isa/formats/priv.isa: The genCompositeIop function is no longer needed, as this functionality is now in the InstObjParams constructor. arch/sparc/isa/decoder.isa: Fixed up alot of instructions, and fixed indentation. arch/sparc/isa/formats/integerop.isa: The genCompositeIop function is no longer needed, as this functionality is now in the InstObjParams constructor. Also changed the immediate values to be signed. base/traceflags.py: Added SPARC traceflag configs/test/hello_sparc: Recompiled without -mflat cpu/cpu_exec_context.cc: Used the regfile clear function rather than memsetting to 0. --HG-- extra : convert_revision : b9da6f264f3ebc4ce1815008dfff7f476b247ee9 --- arch/isa_parser.py | 22 +- arch/sparc/isa/base.isa | 15 +- arch/sparc/isa/decoder.isa | 698 +++++++++++++++------------ arch/sparc/isa/formats/integerop.isa | 20 +- arch/sparc/isa/formats/mem.isa | 53 +- arch/sparc/isa/formats/priv.isa | 88 +--- base/traceflags.py | 1 + configs/test/hello_sparc | Bin 644149 -> 644149 bytes cpu/cpu_exec_context.cc | 4 +- 9 files changed, 490 insertions(+), 411 deletions(-) diff --git a/arch/isa_parser.py b/arch/isa_parser.py index 6fce783b1..8279a6a5d 100755 --- a/arch/isa_parser.py +++ b/arch/isa_parser.py @@ -1618,13 +1618,27 @@ opClassRE = re.compile(r'.*Op|No_OpClass') class InstObjParams: def __init__(self, mnem, class_name, base_class = '', - code_block = None, opt_args = []): + code = None, opt_args = [], *extras): self.mnemonic = mnem self.class_name = class_name self.base_class = base_class - if code_block: - for code_attr in code_block.__dict__.keys(): - setattr(self, code_attr, getattr(code_block, code_attr)) + if code: + #If the user already made a CodeBlock, pick the parts from it + if isinstance(code, CodeBlock): + origCode = code.orig_code + codeBlock = code + else: + origCode = code + codeBlock = CodeBlock(code) + compositeCode = '\n'.join([origCode] + + [pair[1] for pair in extras]) + compositeBlock = CodeBlock(compositeCode) + for code_attr in compositeBlock.__dict__.keys(): + setattr(self, code_attr, getattr(compositeBlock, code_attr)) + for (key, snippet) in extras: + setattr(self, key, CodeBlock(snippet).code) + self.code = codeBlock.code + self.orig_code = origCode else: self.constructor = '' self.flags = [] diff --git a/arch/sparc/isa/base.isa b/arch/sparc/isa/base.isa index b9347a3d0..434426ffa 100644 --- a/arch/sparc/isa/base.isa +++ b/arch/sparc/isa/base.isa @@ -60,7 +60,7 @@ output header {{ inline int64_t sign_ext(uint64_t data, int origWidth) { - int shiftAmount = sizeof(uint64_t) - origWidth; + int shiftAmount = 64 - origWidth; return (((int64_t)data) << shiftAmount) >> shiftAmount; } }}; @@ -84,19 +84,6 @@ let {{ code = matcher.sub('Rs' + rOrImmMatch.group("rNum"), orig_code) imm_code = matcher.sub('imm', orig_code) return (True, code, imm_code, rString, iString) - - def genCompositeIop(code, name, Name, parent, opt_flags, **extras): - origBlock = CodeBlock(code) - composite = code - for snippet in extras.values(): - composite += ('\n' + snippet) - compositeBlock = CodeBlock(composite) - iop = InstObjParams(name, Name, parent, compositeBlock, opt_flags) - iop.code = origBlock.code - iop.orig_code = origBlock.orig_code - for (name, snippet) in extras.items(): - exec "iop.%s = CodeBlock(snippet).code" % name - return iop }}; output decoder {{ diff --git a/arch/sparc/isa/decoder.isa b/arch/sparc/isa/decoder.isa index e9a1bce97..b4084518c 100644 --- a/arch/sparc/isa/decoder.isa +++ b/arch/sparc/isa/decoder.isa @@ -14,7 +14,6 @@ decode OP default Unknown::unknown() format Branch19 { 0x0: bpcci({{ - NNPC = xc->readNextNPC(); if(passesCondition(CcrIcc, COND2)) NNPC = xc->readPC() + disp; }}); @@ -64,7 +63,6 @@ decode OP default Unknown::unknown() 0x6: Trap::fbfcc({{fault = new FpDisabled;}}); } 0x1: Branch30::call({{ - //branch here R15 = xc->readPC(); NNPC = R15 + disp; }}); @@ -74,7 +72,7 @@ decode OP default Unknown::unknown() 0x01: and({{Rd = Rs1.udw & Rs2_or_imm13;}}); 0x02: or({{Rd = Rs1.udw | Rs2_or_imm13;}}); 0x03: xor({{Rd = Rs1.udw ^ Rs2_or_imm13;}}); - 0x04: sub({{Rd = Rs1.sdw + (~Rs2_or_imm13)+1;}}); + 0x04: sub({{Rd = Rs1.sdw - Rs2_or_imm13;}}); 0x05: andn({{Rd = Rs1.udw & ~Rs2_or_imm13;}}); 0x06: orn({{Rd = Rs1.udw | ~Rs2_or_imm13;}}); 0x07: xnor({{Rd = ~(Rs1.udw ^ Rs2_or_imm13);}}); @@ -113,7 +111,7 @@ decode OP default Unknown::unknown() else if(Rd.udw<63:> && Rd.udw<62:31> != 0xFFFFFFFF) Rd.udw = 0xFFFFFFFF80000000; } - }});//SDIV + }}); } format IntOpCc { 0x10: addcc({{ @@ -123,19 +121,19 @@ decode OP default Unknown::unknown() {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}}, {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} - );//ADDcc + ); 0x11: IntOpCcRes::andcc({{Rd = Rs1 & Rs2_or_imm13;}}); 0x12: IntOpCcRes::orcc({{Rd = Rs1 | Rs2_or_imm13;}}); 0x13: IntOpCcRes::xorcc({{Rd = Rs1 ^ Rs2_or_imm13;}}); 0x14: subcc({{ int64_t resTemp, val2 = Rs2_or_imm13; Rd = resTemp = Rs1 - val2;}}, - {{((Rs1 & 0xFFFFFFFF + (~val2) & 0xFFFFFFFF + 1) >> 31)}}, + {{((Rs1 & 0xFFFFFFFF - val2 & 0xFFFFFFFF) >> 31)}}, {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}}, {{(((Rs1 >> 1) + (~val2) >> 1) + ((Rs1 | ~val2) & 0x1))<63:>}}, {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}} - );//SUBcc + ); 0x15: IntOpCcRes::andncc({{Rd = Rs1 & ~Rs2_or_imm13;}}); 0x16: IntOpCcRes::orncc({{Rd = Rs1 | ~Rs2_or_imm13;}}); 0x17: IntOpCcRes::xnorcc({{Rd = ~(Rs1 ^ Rs2_or_imm13);}}); @@ -149,17 +147,17 @@ decode OP default Unknown::unknown() {{((Rs1 >> 1) + (val2 >> 1) + ((Rs1 & val2) | (carryin & (Rs1 | val2)) & 0x1))<63:>}}, {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} - );//ADDCcc + ); 0x1A: umulcc({{ uint64_t resTemp, val2 = Rs2_or_imm13; Rd = resTemp = Rs1.udw<31:0> * val2<31:0>; YValue = resTemp<63:32>;}}, - {{0}},{{0}},{{0}},{{0}});//UMULcc + {{0}},{{0}},{{0}},{{0}}); 0x1B: smulcc({{ int64_t resTemp, val2 = Rs2_or_imm13; Rd = resTemp = Rs1.sdw<31:0> * val2<31:0>; - YValue = resTemp<63:32>;}} - ,{{0}},{{0}},{{0}},{{0}});//SMULcc + YValue = resTemp<63:32>;}}, + {{0}},{{0}},{{0}},{{0}}); 0x1C: subccc({{ int64_t resTemp, val2 = Rs2_or_imm13; int64_t carryin = CcrIccC; @@ -168,11 +166,11 @@ decode OP default Unknown::unknown() {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}}, {{(((Rs1 >> 1) + (~(val2 + carryin)) >> 1) + ((Rs1 | ~(val2+carryin)) & 0x1))<63:>}}, {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}} - );//SUBCcc + ); 0x1D: udivxcc({{ if(Rs2_or_imm13 == 0) fault = new DivisionByZero; else Rd = Rs1.udw / Rs2_or_imm13;}} - ,{{0}},{{0}},{{0}},{{0}});//UDIVXcc + ,{{0}},{{0}},{{0}},{{0}}); 0x1E: udivcc({{ uint32_t resTemp, val2 = Rs2_or_imm13; int32_t overflow; @@ -188,7 +186,7 @@ decode OP default Unknown::unknown() {{overflow}}, {{0}}, {{0}} - );//UDIVcc + ); 0x1F: sdivcc({{ int32_t resTemp, val2 = Rs2_or_imm13; int32_t overflow, underflow; @@ -206,7 +204,7 @@ decode OP default Unknown::unknown() {{overflow || underflow}}, {{0}}, {{0}} - );//SDIVcc + ); 0x20: taddcc({{ int64_t resTemp, val2 = Rs2_or_imm13; Rd = resTemp = Rs1 + val2; @@ -215,7 +213,7 @@ decode OP default Unknown::unknown() {{overflow}}, {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} - );//TADDcc + ); 0x21: tsubcc({{ int64_t resTemp, val2 = Rs2_or_imm13; Rd = resTemp = Rs1 + val2; @@ -224,7 +222,7 @@ decode OP default Unknown::unknown() {{overflow}}, {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} - );//TSUBcc + ); 0x22: taddcctv({{ int64_t resTemp, val2 = Rs2_or_imm13; Rd = resTemp = Rs1 + val2; @@ -234,7 +232,7 @@ decode OP default Unknown::unknown() {{overflow}}, {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} - );//TADDccTV + ); 0x23: tsubcctv({{ int64_t resTemp, val2 = Rs2_or_imm13; Rd = resTemp = Rs1 + val2; @@ -244,7 +242,7 @@ decode OP default Unknown::unknown() {{overflow}}, {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} - );//TSUBccTV + ); 0x24: mulscc({{ int64_t resTemp, multiplicand = Rs2_or_imm13; int32_t multiplier = Rs1<31:0>; @@ -260,305 +258,387 @@ decode OP default Unknown::unknown() {{multiplicand<31:> == multiplier<31:> && multiplier<31:> != resTemp<31:>}}, {{((multiplicand >> 1) + (multiplier >> 1) + (multiplicand & multiplier & 0x1))<63:>}}, {{multiplicand<63:> == multiplier<63:> && multiplier<63:> != resTemp<63:>}} - );//MULScc + ); + } + format IntOp + { + 0x25: decode X { + 0x0: sll({{Rd = Rs1 << (I ? SHCNT32 : Rs2<4:0>);}}); + 0x1: sllx({{Rd = Rs1 << (I ? SHCNT64 : Rs2<5:0>);}}); } - format IntOp + 0x26: decode X { + 0x0: srl({{Rd = Rs1.uw >> (I ? SHCNT32 : Rs2<4:0>);}}); + 0x1: srlx({{Rd = Rs1.udw >> (I ? SHCNT64 : Rs2<5:0>);}}); + } + 0x27: decode X { + 0x0: sra({{Rd = Rs1.sw >> (I ? SHCNT32 : Rs2<4:0>);}}); + 0x1: srax({{Rd = Rs1.sdw >> (I ? SHCNT64 : Rs2<5:0>);}}); + } + 0x28: decode RS1 { + 0x0: rdy({{Rd = YValue;}}); + 0x2: rdccr({{Rd = Ccr;}}); + 0x3: rdasi({{Rd = Asi;}}); + 0x4: PrivTick::rdtick({{Rd = Tick;}}); + 0x5: rdpc({{Rd = xc->readPC();}}); + 0x6: rdfprs({{Rd = Fprs;}}); + 0xF: decode I { + 0x0: Nop::membar({{/*Membar isn't needed yet*/}}); + 0x1: Nop::stbar({{/*Stbar isn't needed yet*/}}); + } + } + 0x2A: decode RS1 { + format Priv + { + 0x0: rdprtpc({{ + Rd = xc->readMiscReg(MISCREG_TPC_BASE + Tl); + }}); + 0x1: rdprtnpc({{ + Rd = xc->readMiscReg(MISCREG_TNPC_BASE + Tl); + }}); + 0x2: rdprtstate({{ + Rd = xc->readMiscReg(MISCREG_TSTATE_BASE + Tl); + }}); + 0x3: rdprtt({{ + Rd = xc->readMiscReg(MISCREG_TT_BASE + Tl); + }}); + 0x4: rdprtick({{Rd = Tick;}}); + 0x5: rdprtba({{Rd = Tba;}}); + 0x6: rdprpstate({{Rd = Pstate;}}); + 0x7: rdprtl({{Rd = Tl;}}); + 0x8: rdprpil({{Rd = Pil;}}); + 0x9: rdprcwp({{Rd = Cwp;}}); + 0xA: rdprcansave({{Rd = Cansave;}}); + 0xB: rdprcanrestore({{Rd = Canrestore;}}); + 0xC: rdprcleanwin({{Rd = Cleanwin;}}); + 0xD: rdprotherwin({{Rd = Otherwin;}}); + 0xE: rdprwstate({{Rd = Wstate;}}); + } + //The floating point queue isn't implemented right now. + 0xF: Trap::rdprfq({{fault = new IllegalInstruction;}}); + 0x1F: Priv::rdprver({{Rd = Ver;}}); + } + 0x2B: BasicOperate::flushw({{ + if(NWindows - 2 - Cansave == 0) + { + if(Otherwin) + fault = new SpillNOther(WstateOther); + else + fault = new SpillNNormal(WstateNormal); + } + }}); + 0x2C: decode MOVCC3 { - 0x25: decode X { - 0x0: sll({{Rd = Rs1 << (I ? SHCNT32 : Rs2<4:0>);}}); - 0x1: sllx({{Rd = Rs1 << (I ? SHCNT64 : Rs2<5:0>);}}); - } - 0x26: decode X { - 0x0: srl({{Rd = Rs1.uw >> (I ? SHCNT32 : Rs2<4:0>);}}); - 0x1: srlx({{Rd = Rs1.udw >> (I ? SHCNT64 : Rs2<5:0>);}}); - } - 0x27: decode X { - 0x0: sra({{Rd = Rs1.sw >> (I ? SHCNT32 : Rs2<4:0>);}}); //SRA - 0x1: srax({{Rd = Rs1.sdw >> (I ? SHCNT64 : Rs2<5:0>);}});//SRAX - } - 0x28: decode RS1 { - 0x0: rdy({{Rd = YValue;}}); //RDY - 0x2: rdccr({{Rd = Ccr;}}); //RDCCR - 0x3: rdasi({{Rd = Asi;}}); //RDASI - 0x4: PrivTick::rdtick({{Rd = Tick;}}); - 0x5: rdpc({{Rd = xc->readPC();}}); //RDPC - 0x6: rdfprs({{Rd = Fprs;}}); //RDFPRS - 0xF: decode I { - 0x0: Nop::membar({{/*Membar isn't needed yet*/}}); - 0x1: Nop::stbar({{/*Stbar isn't needed yet*/}}); - } - } - 0x2A: decode RS1 { - format Priv - { - 0x0: rdprtpc({{ - Rd = xc->readMiscReg(MISCREG_TPC_BASE + Tl); - }}); - 0x1: rdprtnpc({{ - Rd = xc->readMiscReg(MISCREG_TNPC_BASE + Tl); - }}); - 0x2: rdprtstate({{ - Rd = xc->readMiscReg(MISCREG_TSTATE_BASE + Tl); - }}); - 0x3: rdprtt({{ - Rd = xc->readMiscReg(MISCREG_TT_BASE + Tl); - }}); - 0x4: rdprtick({{Rd = Tick;}}); - 0x5: rdprtba({{Rd = Tba;}}); - 0x6: rdprpstate({{Rd = Pstate;}}); - 0x7: rdprtl({{Rd = Tl;}}); - 0x8: rdprpil({{Rd = Pil;}}); - 0x9: rdprcwp({{Rd = Cwp;}}); - 0xA: rdprcansave({{Rd = Cansave;}}); - 0xB: rdprcanrestore({{Rd = Canrestore;}}); - 0xC: rdprcleanwin({{Rd = Cleanwin;}}); - 0xD: rdprotherwin({{Rd = Otherwin;}}); - 0xE: rdprwstate({{Rd = Wstate;}}); - } - //The floating point queue isn't implemented right now. - 0xF: Trap::rdprfq({{fault = new IllegalInstruction;}}); - 0x1F: Priv::rdprver({{Rd = Ver;}}); - } - 0x2B: BasicOperate::flushw({{/*window toilet*/}}); - 0x2C: decode MOVCC3 + 0x0: Trap::movccfcc({{fault = new FpDisabled;}}); + 0x1: decode CC { - 0x0: Trap::movccfcc({{fault = new FpDisabled;}}); - 0x1: decode CC - { - 0x0: movcci({{ - if(passesCondition(CcrIcc, COND4)) - Rd = (I ? SIMM11 : RS2); - }}); - 0x2: movccx({{ - if(passesCondition(CcrXcc, COND4)) - Rd = (I ? SIMM11 : RS2); - }}); - } - } - 0x2D: sdivx({{ - if(Rs2_or_imm13 == 0) fault = new DivisionByZero; - else Rd.sdw = Rs1.sdw / Rs2_or_imm13; - }});//SDIVX - 0x2E: decode RS1 { - 0x0: IntOp::popc({{ - int64_t count = 0; - uint64_t temp = Rs2_or_imm13; - //Count the 1s in the front 4bits until none are left - uint8_t oneBits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}; - while(temp) - { - count += oneBits[temp & 0xF]; - temp = temp >> 4; - } - }});//POPC - } - 0x2F: decode RCOND3 - { - 0x1: movreq({{if(Rs1 == 0) Rd = Rs2_or_imm10;}}); - 0x2: movrle({{if(Rs1 <= 0) Rd = Rs2_or_imm10;}}); - 0x3: movrl({{if(Rs1 < 0) Rd = Rs2_or_imm10;}}); - 0x5: movrne({{if(Rs1 != 0) Rd = Rs2_or_imm10;}}); - 0x6: movrg({{if(Rs1 > 0) Rd = Rs2_or_imm10;}}); - 0x7: movrge({{if(Rs1 >= 0) Rd = Rs2_or_imm10;}}); - } - 0x30: decode RD { - 0x0: wry({{Y = Rs1 ^ Rs2_or_imm13;}}); - 0x2: wrccr({{Ccr = Rs1 ^ Rs2_or_imm13;}}); - 0x3: wrasi({{Asi = Rs1 ^ Rs2_or_imm13;}}); - 0x6: wrfprs({{Asi = Rs1 ^ Rs2_or_imm13;}}); - 0xF: Trap::sir({{fault = new SoftwareInitiatedReset;}}); - } - 0x31: decode FCN { - 0x0: BasicOperate::saved({{/*Boogy Boogy*/}}); - 0x1: BasicOperate::restored({{/*Boogy Boogy*/}}); - } - 0x32: decode RD { - format Priv - { - 0x0: wrprtpc({{ - xc->setMiscReg(MISCREG_TPC_BASE + Tl, - Rs1 ^ Rs2_or_imm13); - }}); - 0x1: wrprtnpc({{ - xc->setMiscReg(MISCREG_TNPC_BASE + Tl, - Rs1 ^ Rs2_or_imm13); - }}); - 0x2: wrprtstate({{ - xc->setMiscReg(MISCREG_TSTATE_BASE + Tl, - Rs1 ^ Rs2_or_imm13); - }}); - 0x3: wrprtt({{ - xc->setMiscReg(MISCREG_TT_BASE + Tl, - Rs1 ^ Rs2_or_imm13); - }}); - 0x4: wrprtick({{Tick = Rs1 ^ Rs2_or_imm13;}}); - 0x5: wrprtba({{Tba = Rs1 ^ Rs2_or_imm13;}}); - 0x6: wrprpstate({{Pstate = Rs1 ^ Rs2_or_imm13;}}); - 0x7: wrprtl({{Tl = Rs1 ^ Rs2_or_imm13;}}); - 0x8: wrprpil({{Pil = Rs1 ^ Rs2_or_imm13;}}); - 0x9: wrprcwp({{Cwp = Rs1 ^ Rs2_or_imm13;}}); - 0xA: wrprcansave({{Cansave = Rs1 ^ Rs2_or_imm13;}}); - 0xB: wrprcanrestore({{Canrestore = Rs1 ^ Rs2_or_imm13;}}); - 0xC: wrprcleanwin({{Cleanwin = Rs1 ^ Rs2_or_imm13;}}); - 0xD: wrprotherwin({{Otherwin = Rs1 ^ Rs2_or_imm13;}}); - 0xE: wrprwstate({{Wstate = Rs1 ^ Rs2_or_imm13;}}); - } - } - - 0x34: Trap::fpop1({{fault = new FpDisabled;}}); - 0x35: Trap::fpop2({{fault = new FpDisabled;}}); - - 0x38: Branch::jmpl({{ - Addr target = Rs1 + Rs2_or_imm13; - if(target && 0x3) - fault = new MemAddressNotAligned; - else - { - Rd = xc->readPC(); - NNPC = target; - } - }}); - 0x39: Branch::return({{ - Addr target = Rs1 + Rs2_or_imm13; - if(target && 0x3) - fault = new MemAddressNotAligned; - else - NNPC = target; - //This needs to change the register window - //like restore does - }}); - 0x3A: decode CC - { - 0x0: Trap::tcci({{ -#if FULL_SYSTEM - fault = new TrapInstruction; -#else - if(passesCondition(CcrIcc, machInst<25:28>)) - // At least glibc only uses trap 0, - // solaris/sunos may use others - assert((I ? Rs1 + Rs2 : Rs1 + SW_TRAP) == 0); - xc->syscall(); -#endif + 0x0: movcci({{ + if(passesCondition(CcrIcc, COND4)) + Rd = (I ? SIMM11 : RS2); }}); - 0x2: Trap::tccx({{ -#if FULL_SYSTEM - fault = new TrapInstruction; -#else - if(passesCondition(CcrXcc, machInst<25:28>)) - // At least glibc only uses trap 0, - // solaris/sunos may use others - assert((I ? Rs1 + Rs2 : Rs1 + SW_TRAP) == 0); - xc->syscall(); -#endif + 0x2: movccx({{ + if(passesCondition(CcrXcc, COND4)) + Rd = (I ? SIMM11 : RS2); }}); } - 0x3B: BasicOperate::flush({{/*Lala*/}}); - 0x3C: BasicOperate::save({{/*leprechauns*/}}); - 0x3D: BasicOperate::restore({{/*Eat my short int*/}}); - 0x3E: decode FCN { - 0x1: BasicOperate::done({{/*Done thing*/}}); - 0x2: BasicOperate::retry({{/*Retry thing*/}}); - } } + 0x2D: sdivx({{ + if(Rs2_or_imm13 == 0) fault = new DivisionByZero; + else Rd.sdw = Rs1.sdw / Rs2_or_imm13; + }}); + 0x2E: decode RS1 { + 0x0: IntOp::popc({{ + int64_t count = 0; + uint64_t temp = Rs2_or_imm13; + //Count the 1s in the front 4bits until none are left + uint8_t oneBits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}; + while(temp) + { + count += oneBits[temp & 0xF]; + temp = temp >> 4; + } + }}); + } + 0x2F: decode RCOND3 + { + 0x1: movreq({{if(Rs1 == 0) Rd = Rs2_or_imm10;}}); + 0x2: movrle({{if(Rs1 <= 0) Rd = Rs2_or_imm10;}}); + 0x3: movrl({{if(Rs1 < 0) Rd = Rs2_or_imm10;}}); + 0x5: movrne({{if(Rs1 != 0) Rd = Rs2_or_imm10;}}); + 0x6: movrg({{if(Rs1 > 0) Rd = Rs2_or_imm10;}}); + 0x7: movrge({{if(Rs1 >= 0) Rd = Rs2_or_imm10;}}); + } + 0x30: decode RD { + 0x0: wry({{Y = Rs1 ^ Rs2_or_imm13;}}); + 0x2: wrccr({{Ccr = Rs1 ^ Rs2_or_imm13;}}); + 0x3: wrasi({{Asi = Rs1 ^ Rs2_or_imm13;}}); + 0x6: wrfprs({{Asi = Rs1 ^ Rs2_or_imm13;}}); + 0xF: Trap::sir({{fault = new SoftwareInitiatedReset;}}); + } + 0x31: decode FCN { + 0x0: BasicOperate::saved({{/*Boogy Boogy*/}}); + 0x1: BasicOperate::restored({{/*Boogy Boogy*/}}); + } + 0x32: decode RD { + format Priv + { + 0x0: wrprtpc({{ + xc->setMiscReg(MISCREG_TPC_BASE + Tl, + Rs1 ^ Rs2_or_imm13); + }}); + 0x1: wrprtnpc({{ + xc->setMiscReg(MISCREG_TNPC_BASE + Tl, + Rs1 ^ Rs2_or_imm13); + }}); + 0x2: wrprtstate({{ + xc->setMiscReg(MISCREG_TSTATE_BASE + Tl, + Rs1 ^ Rs2_or_imm13); + }}); + 0x3: wrprtt({{ + xc->setMiscReg(MISCREG_TT_BASE + Tl, + Rs1 ^ Rs2_or_imm13); + }}); + 0x4: wrprtick({{Tick = Rs1 ^ Rs2_or_imm13;}}); + 0x5: wrprtba({{Tba = Rs1 ^ Rs2_or_imm13;}}); + 0x6: wrprpstate({{Pstate = Rs1 ^ Rs2_or_imm13;}}); + 0x7: wrprtl({{Tl = Rs1 ^ Rs2_or_imm13;}}); + 0x8: wrprpil({{Pil = Rs1 ^ Rs2_or_imm13;}}); + 0x9: wrprcwp({{Cwp = Rs1 ^ Rs2_or_imm13;}}); + 0xA: wrprcansave({{Cansave = Rs1 ^ Rs2_or_imm13;}}); + 0xB: wrprcanrestore({{Canrestore = Rs1 ^ Rs2_or_imm13;}}); + 0xC: wrprcleanwin({{Cleanwin = Rs1 ^ Rs2_or_imm13;}}); + 0xD: wrprotherwin({{Otherwin = Rs1 ^ Rs2_or_imm13;}}); + 0xE: wrprwstate({{Wstate = Rs1 ^ Rs2_or_imm13;}}); + } + } + 0x34: Trap::fpop1({{fault = new FpDisabled;}}); + 0x35: Trap::fpop2({{fault = new FpDisabled;}}); + 0x38: Branch::jmpl({{ + Addr target = Rs1 + Rs2_or_imm13; + if(target & 0x3) + fault = new MemAddressNotAligned; + else + { + Rd = xc->readPC(); + NNPC = target; + } + }}); + 0x39: Branch::return({{ + Addr target = Rs1 + Rs2_or_imm13; + if(target & 0x3) + fault = new MemAddressNotAligned; + else + NNPC = target; + //This needs to change the register window + //like restore does + }}); + 0x3A: decode CC + { + 0x0: Trap::tcci({{ +#if FULL_SYSTEM + fault = new TrapInstruction; +#else + if(passesCondition(CcrIcc, machInst<25:28>)) + { + // At least glibc only uses trap 0, + // solaris/sunos may use others + assert((I ? Rs1 + Rs2 : Rs1 + SW_TRAP) == 0); + xc->syscall(); + } +#endif + }}); + 0x2: Trap::tccx({{ +#if FULL_SYSTEM + fault = new TrapInstruction; +#else + if(passesCondition(CcrXcc, machInst<25:28>)) + { + // At least glibc only uses trap 0, + // solaris/sunos may use others + assert((I ? Rs1 + Rs2 : Rs1 + SW_TRAP) == 0); + xc->syscall(); + } +#endif + }}); + } + 0x3B: Nop::flush({{/*Instruction memory flush*/}}); + 0x3C: save({{ + //CWP should be set directly so that it always happens + //Also, this will allow writing to the new window and + //reading from the old one + if(Cansave == 0) + { + if(Otherwin) + fault = new SpillNOther(WstateOther); + else + fault = new SpillNNormal(WstateNormal); + Cwp = (Cwp + 2) % NWindows; + } + else if(Cleanwin - Canrestore == 0) + { + Cwp = (Cwp + 1) % NWindows; + fault = new CleanWindow; + } + else + { + Cwp = (Cwp + 1) % NWindows; + Rd = Rs1 + Rs2_or_imm13; + Cansave--; + Canrestore++; + } + //This is here to make sure the CWP is written + //no matter what. This ensures that the results + //are written in the new window as well. + xc->setMiscRegWithEffect(MISCREG_CWP, Cwp); + }}); + 0x3D: restore({{ + //CWP should be set directly so that it always happens + //Also, this will allow writing to the new window and + //reading from the old one + Cwp = (Cwp - 1 + NWindows) % NWindows; + if(Canrestore == 0) + { + if(Otherwin) + fault = new FillNOther(WstateOther); + else + fault = new FillNNormal(WstateNormal); + } + else + { + Rd = Rs1 + Rs2_or_imm13; + Cansave++; + Canrestore--; + } + //This is here to make sure the CWP is written + //no matter what. This ensures that the results + //are written in the new window as well. + xc->setMiscRegWithEffect(MISCREG_CWP, Cwp); + }}); + 0x3E: decode FCN { + 0x0: Priv::done({{ + if(Tl == 0) + return new IllegalInstruction; + Cwp = xc->readMiscReg(MISCREG_TSTATE_CWP_BASE + Tl); + Asi = xc->readMiscReg(MISCREG_TSTATE_ASI_BASE + Tl); + Ccr = xc->readMiscReg(MISCREG_TSTATE_CCR_BASE + Tl); + Pstate = xc->readMiscReg(MISCREG_TSTATE_PSTATE_BASE + Tl); + NPC = xc->readMiscReg(MISCREG_TNPC_BASE + Tl); + NNPC = NPC + 4; + Tl = Tl - 1; + }}); + 0x1: BasicOperate::retry({{ + if(Tl == 0) + return new IllegalInstruction; + Cwp = xc->readMiscReg(MISCREG_TSTATE_CWP_BASE + Tl); + Asi = xc->readMiscReg(MISCREG_TSTATE_ASI_BASE + Tl); + Ccr = xc->readMiscReg(MISCREG_TSTATE_CCR_BASE + Tl); + Pstate = xc->readMiscReg(MISCREG_TSTATE_PSTATE_BASE + Tl); + NPC = xc->readMiscReg(MISCREG_TPC_BASE + Tl); + NNPC = xc->readMiscReg(MISCREG_TNPC_BASE + Tl); + Tl = Tl - 1; + }}); + } + } } 0x3: decode OP3 { - format Mem { - 0x00: lduw({{Rd.uw = Mem.uw;}}); //LDUW - 0x01: ldub({{Rd.ub = Mem.ub;}}); //LDUB - 0x02: lduh({{Rd.uhw = Mem.uhw;}}); //LDUH - 0x03: ldd({{ - uint64_t val = Mem.udw; - RdLow = val<31:0>; - RdHigh = val<63:32>; - }});//LDD - 0x04: stw({{Mem.sw = Rd.sw;}}); //STW - 0x05: stb({{Mem.sb = Rd.sb;}}); //STB - 0x06: sth({{Mem.shw = Rd.shw;}}); //STH - 0x07: std({{ - Mem.udw = RdLow<31:0> | RdHigh<31:0> << 32; - }});//STD - 0x08: ldsw({{Rd.sw = Mem.sw;}}); //LDSW - 0x09: ldsb({{Rd.sb = Mem.sb;}}); //LDSB - 0x0A: ldsh({{Rd.shw = Mem.shw;}}); //LDSH - 0x0B: ldx({{Rd.udw = Mem.udw;}}); //LDX - - 0x0D: ldstub({{ - Rd.ub = Mem.ub; - Mem.ub = 0xFF; - }}); //LDSTUB - 0x0E: stx({{Rd.udw = Mem.udw;}}); //STX - 0x0F: swap({{ - uint32_t temp = Rd.uw; - Rd.uw = Mem.uw; - Mem.uw = temp; - }}); //SWAP - 0x10: lduwa({{Rd.uw = Mem.uw;}}); //LDUWA - 0x11: lduba({{Rd.ub = Mem.ub;}}); //LDUBA - 0x12: lduha({{Rd.uhw = Mem.uhw;}}); //LDUHA - 0x13: ldda({{ - uint64_t val = Mem.udw; - RdLow = val<31:0>; - RdHigh = val<63:32>; - }}); //LDDA - 0x14: stwa({{Mem.uw = Rd.uw;}}); //STWA - 0x15: stba({{Mem.ub = Rd.ub;}}); //STBA - 0x16: stha({{Mem.uhw = Rd.uhw;}}); //STHA - 0x17: stda({{ - Mem.udw = RdLow<31:0> | RdHigh<31:0> << 32; - }}); //STDA - 0x18: ldswa({{Rd.sw = Mem.sw;}}); //LDSWA - 0x19: ldsba({{Rd.sb = Mem.sb;}}); //LDSBA - 0x1A: ldsha({{Rd.shw = Mem.shw;}}); //LDSHA - 0x1B: ldxa({{Rd.sdw = Mem.sdw;}}); //LDXA - - 0x1D: ldstuba({{ - Rd.ub = Mem.ub; - Mem.ub = 0xFF; - }}); //LDSTUBA - 0x1E: stxa({{Mem.sdw = Rd.sdw}}); //STXA - 0x1F: swapa({{ - uint32_t temp = Rd.uw; - Rd.uw = Mem.uw; - Mem.uw = temp; - }}); //SWAPA - 0x20: Trap::ldf({{fault = new FpDisabled;}}); - 0x21: decode X { - 0x0: Trap::ldfsr({{fault = new FpDisabled;}}); - 0x1: Trap::ldxfsr({{fault = new FpDisabled;}}); - } - 0x22: Trap::ldqf({{fault = new FpDisabled;}}); - 0x23: Trap::lddf({{fault = new FpDisabled;}}); - 0x24: Trap::stf({{fault = new FpDisabled;}}); - 0x25: decode X { - 0x0: Trap::stfsr({{fault = new FpDisabled;}}); - 0x1: Trap::stxfsr({{fault = new FpDisabled;}}); - } - 0x26: Trap::stqf({{fault = new FpDisabled;}}); - 0x27: Trap::stdf({{fault = new FpDisabled;}}); - - 0x2D: Nop::prefetch({{ }}); //PREFETCH - - 0x30: Trap::ldfa({{return new FpDisabled;}}); - - 0x32: Trap::ldqfa({{fault = new FpDisabled;}}); - 0x33: Trap::lddfa({{fault = new FpDisabled;}}); - 0x34: Trap::stfa({{fault = new FpDisabled;}}); - 0x35: Trap::stqfa({{fault = new FpDisabled;}}); - 0x36: Trap::stdfa({{fault = new FpDisabled;}}); - - 0x3C: Cas::casa( - {{uint64_t val = Mem.uw; - if(Rs2.uw == val) - Mem.uw = Rd.uw; - Rd.uw = val; - }}); //CASA - 0x3D: Nop::prefetcha({{ }}); //PREFETCHA - 0x3E: Cas::casxa({{ - uint64_t val = Mem.udw; - if(Rs2 == val) - Mem.udw = Rd; - Rd = val; - }}); //CASXA + format Load { + 0x00: lduw({{Rd = Mem;}}, {{32}}); + 0x01: ldub({{Rd = Mem;}}, {{8}}); + 0x02: lduh({{Rd = Mem;}}, {{16}}); + 0x03: ldd({{ + uint64_t val = Mem; + RdLow = val<31:0>; + RdHigh = val<63:32>; + }}, {{64}}); + } + format Store { + 0x04: stw({{Mem = Rd.sw;}}, {{32}}); + 0x05: stb({{Mem = Rd.sb;}}, {{8}}); + 0x06: sth({{Mem = Rd.shw;}}, {{16}}); + 0x07: std({{Mem = RdLow<31:0> | RdHigh<31:0> << 32;}}, {{64}}); + } + format Load { + 0x08: ldsw({{Rd = (int32_t)Mem;}}, {{32}}); + 0x09: ldsb({{Rd = (int8_t)Mem;}}, {{8}}); + 0x0A: ldsh({{Rd = (int16_t)Mem;}}, {{16}}); + 0x0B: ldx({{Rd = (int64_t)Mem;}}, {{64}}); + 0x0D: ldstub({{ + Rd = Mem; + Mem = 0xFF; + }}, {{8}}); + } + 0x0E: Store::stx({{Mem = Rd}}, {{64}}); + 0x0F: LoadStore::swap({{ + uint32_t temp = Rd; + Rd = Mem; + Mem = temp; + }}, {{32}}); + format Load { + 0x10: lduwa({{Rd = Mem;}}, {{32}}); + 0x11: lduba({{Rd = Mem;}}, {{8}}); + 0x12: lduha({{Rd = Mem;}}, {{16}}); + 0x13: ldda({{ + uint64_t val = Mem; + RdLow = val<31:0>; + RdHigh = val<63:32>; + }}, {{64}}); + } + format Store { + 0x14: stwa({{Mem = Rd;}}, {{32}}); + 0x15: stba({{Mem = Rd;}}, {{8}}); + 0x16: stha({{Mem = Rd;}}, {{16}}); + 0x17: stda({{Mem = RdLow<31:0> | RdHigh<31:0> << 32;}}, {{64}}); + } + format Load { + 0x18: ldswa({{Rd = (int32_t)Mem;}}, {{32}}); + 0x19: ldsba({{Rd = (int8_t)Mem;}}, {{8}}); + 0x1A: ldsha({{Rd = (int16_t)Mem;}}, {{16}}); + 0x1B: ldxa({{Rd = (int64_t)Mem;}}, {{64}}); + } + 0x1D: LoadStore::ldstuba({{ + Rd = Mem; + Mem = 0xFF; + }}, {{8}}); + 0x1E: Store::stxa({{Mem = Rd}}, {{64}}); + 0x1F: LoadStore::swapa({{ + uint32_t temp = Rd; + Rd = Mem; + Mem = temp; + }}, {{32}}); + format Trap { + 0x20: ldf({{fault = new FpDisabled;}}); + 0x21: decode X { + 0x0: ldfsr({{fault = new FpDisabled;}}); + 0x1: ldxfsr({{fault = new FpDisabled;}}); } + 0x22: ldqf({{fault = new FpDisabled;}}); + 0x23: lddf({{fault = new FpDisabled;}}); + 0x24: stf({{fault = new FpDisabled;}}); + 0x25: decode X { + 0x0: stfsr({{fault = new FpDisabled;}}); + 0x1: stxfsr({{fault = new FpDisabled;}}); + } + 0x26: stqf({{fault = new FpDisabled;}}); + 0x27: stdf({{fault = new FpDisabled;}}); + 0x2D: Nop::prefetch({{ }}); + 0x30: ldfa({{return new FpDisabled;}}); + 0x32: ldqfa({{fault = new FpDisabled;}}); + 0x33: lddfa({{fault = new FpDisabled;}}); + 0x34: stfa({{fault = new FpDisabled;}}); + 0x35: stqfa({{fault = new FpDisabled;}}); + 0x36: stdfa({{fault = new FpDisabled;}}); + 0x3C: Cas::casa({{ + uint64_t val = Mem.uw; + if(Rs2.uw == val) + Mem.uw = Rd.uw; + Rd.uw = val; + }}); + 0x3D: Nop::prefetcha({{ }}); + 0x3E: Cas::casxa({{ + uint64_t val = Mem.udw; + if(Rs2 == val) + Mem.udw = Rd; + Rd = val; + }}); + } } } diff --git a/arch/sparc/isa/formats/integerop.isa b/arch/sparc/isa/formats/integerop.isa index 2c2123f86..f14f9e858 100644 --- a/arch/sparc/isa/formats/integerop.isa +++ b/arch/sparc/isa/formats/integerop.isa @@ -37,7 +37,7 @@ output header {{ { } - uint32_t imm; + int32_t imm; std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; @@ -57,7 +57,7 @@ output header {{ OpClass __opClass) : IntOpImm(mnem, _machInst, __opClass) { - imm = SIMM10; + imm = sign_ext(SIMM10, 10); } }; @@ -72,7 +72,7 @@ output header {{ OpClass __opClass) : IntOpImm(mnem, _machInst, __opClass) { - imm = SIMM13; + imm = sign_ext(SIMM13, 13); } }; @@ -195,7 +195,7 @@ output decoder {{ if(!printPseudoOps(response, pc, symtab)) { printMnemonic(response, mnemonic); - if (_numSrcRegs > 1) + if (_numSrcRegs > 0) { printReg(response, _srcRegIdx[0]); for(int x = 1; x < _numSrcRegs - 1; x++) @@ -254,14 +254,14 @@ let {{ def doIntFormat(code, ccCode, name, Name, opt_flags): (usesImm, code, immCode, rString, iString) = splitOutImm(code) - iop = genCompositeIop(code, name, Name, - 'IntOp', opt_flags, cc_code=ccCode) + iop = InstObjParams(name, Name, 'IntOp', code, + opt_flags, ("cc_code", ccCode)) header_output = BasicDeclare.subst(iop) decoder_output = BasicConstructor.subst(iop) exec_output = IntOpExecute.subst(iop) if usesImm: - imm_iop = genCompositeIop(code, name, Name + 'Imm', - 'IntOpImm' + iString, opt_flags, cc_code=ccCode) + imm_iop = InstObjParams(name, Name + 'Imm', 'IntOpImm' + iString, + immCode, opt_flags, ("cc_code", ccCode)) header_output += BasicDeclare.subst(imm_iop) decoder_output += BasicConstructor.subst(imm_iop) exec_output += IntOpExecute.subst(imm_iop) @@ -316,8 +316,8 @@ def format IntOpCcRes(code, *opt_flags) {{ }}; def format SetHi(code, *opt_flags) {{ - iop = genCompositeIop(code, name, Name, 'SetHi', - opt_flags, cc_code='') + iop = InstObjParams(name, Name, 'SetHi', + code, opt_flags, ("cc_code", '')) header_output = BasicDeclare.subst(iop) decoder_output = BasicConstructor.subst(iop) exec_output = IntOpExecute.subst(iop) diff --git a/arch/sparc/isa/formats/mem.isa b/arch/sparc/isa/formats/mem.isa index 8c9d21c01..db2a4aaaa 100644 --- a/arch/sparc/isa/formats/mem.isa +++ b/arch/sparc/isa/formats/mem.isa @@ -37,7 +37,7 @@ output header {{ std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; - int imm; + int32_t imm; }; }}; @@ -46,7 +46,7 @@ output decoder {{ const SymbolTable *symtab) const { std::stringstream response; - bool load = (_numDestRegs == 1); + bool load = flags[IsLoad]; printMnemonic(response, mnemonic); if(!load) @@ -72,7 +72,7 @@ output decoder {{ const SymbolTable *symtab) const { std::stringstream response; - bool load = (_numDestRegs == 1); + bool load = flags[IsLoad]; printMnemonic(response, mnemonic); if(!load) @@ -102,7 +102,9 @@ def template MemExecute {{ %(op_decl)s; %(op_rd)s; %(ea_code)s; + %(load)s; %(code)s; + %(store)s; if(fault == NoFault) { @@ -114,16 +116,49 @@ def template MemExecute {{ } }}; -// Primary format for memory instructions: -def format Mem(code, *opt_flags) {{ +let {{ + # Leave memAccessFlags at 0 for now + loadString = "xc->read(EA, (uint%(width)s_t&)Mem, 0);" + storeString = "uint64_t write_result = 0; \ + xc->write((uint%(width)s_t)Mem, EA, 0, &write_result);" + + def doMemFormat(code, load, store, name, Name, opt_flags): addrCalcReg = 'EA = Rs1 + Rs2;' addrCalcImm = 'EA = Rs1 + SIMM13;' - iop = genCompositeIop(code, name, Name, 'Mem', - opt_flags, ea_code=addrCalcReg) - iop_imm = genCompositeIop(code, name, Name + 'Imm', 'MemImm', - opt_flags, ea_code=addrCalcImm) + iop = InstObjParams(name, Name, 'Mem', code, + opt_flags, ("ea_code", addrCalcReg), + ("load", load), ("store", store)) + iop_imm = InstObjParams(name, Name + 'Imm', 'MemImm', code, + opt_flags, ("ea_code", addrCalcImm), + ("load", load), ("store", store)) header_output = BasicDeclare.subst(iop) + BasicDeclare.subst(iop_imm) decoder_output = BasicConstructor.subst(iop) + BasicConstructor.subst(iop_imm) decode_block = ROrImmDecode.subst(iop) exec_output = MemExecute.subst(iop) + MemExecute.subst(iop_imm) + return (header_output, decoder_output, exec_output, decode_block) +}}; + +def format Load(code, width, *opt_flags) {{ + (header_output, + decoder_output, + exec_output, + decode_block) = doMemFormat(code, + loadString % {"width":width}, '', name, Name, opt_flags) +}}; + +def format Store(code, width, *opt_flags) {{ + (header_output, + decoder_output, + exec_output, + decode_block) = doMemFormat(code, '', + storeString % {"width":width}, name, Name, opt_flags) +}}; + +def format LoadStore(code, width, *opt_flags) {{ + (header_output, + decoder_output, + exec_output, + decode_block) = doMemFormat(code, + loadString % {"width":width}, storeString % {"width":width}, + name, Name, opt_flags) }}; diff --git a/arch/sparc/isa/formats/priv.isa b/arch/sparc/isa/formats/priv.isa index 162ad5ee0..f9fea01f2 100644 --- a/arch/sparc/isa/formats/priv.isa +++ b/arch/sparc/isa/formats/priv.isa @@ -50,7 +50,7 @@ output header {{ { } - uint32_t imm; + int32_t imm; }; /** @@ -66,7 +66,7 @@ output header {{ { } - uint32_t imm; + int32_t imm; }; }}; @@ -91,35 +91,8 @@ def template PrivExecute {{ %(op_decl)s; %(op_rd)s; - //Since these are processed inside templates and not in codeblocks, - //They aren't translated by the isa_parser. Their names begin with - //underscores so they don't cause conflicts. - uint32_t _PstatePriv = xc->readMiscReg(MISCREG_PSTATE_PRIV); - //If the processor isn't in privileged mode, fault out right away - if(!_PstatePriv) - return new PrivilegedOpcode; - - %(code)s; - %(op_wb)s; - return NoFault; - } -}}; - -def template PrivTickExecute {{ - Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, - Trace::InstRecord *traceData) const - { - %(op_decl)s; - %(op_rd)s; - - //Since these are processed inside templates and not in codeblocks, - //They aren't translated by the isa_parser. Their names begin with - //underscores so they don't cause conflicts. - uint32_t _PstatePriv = xc->readMiscReg(MISCREG_PSTATE_PRIV); - uint32_t _TickNpt = xc->readMiscReg(MISCREG_TICK_NPT); - //If the processor isn't in privileged mode, fault out right away - if(!_PstatePriv && _TickNpt) + if(%(check)s) return new PrivilegedAction; %(code)s; @@ -128,50 +101,39 @@ def template PrivTickExecute {{ } }}; -// Primary format for integer operate instructions: -def format Priv(code, *opt_flags) {{ - uses_imm = (code.find('Rs2_or_imm13') != -1) - if uses_imm: - orig_code = code - code = re.sub(r'Rs2_or_imm13', 'Rs2', orig_code) - imm_code = re.sub(r'Rs2_or_imm13(\.\w+)?', 'imm', orig_code) - cblk = CodeBlock(code) - iop = InstObjParams(name, Name, 'Priv', cblk, opt_flags) +let {{ + def doPrivFormat(code, checkCode, name, Name, opt_flags): + (usesImm, code, immCode, + rString, iString) = splitOutImm(code) + iop = InstObjParams(name, Name, 'Priv', code, + opt_flags, ("check", checkCode)) header_output = BasicDeclare.subst(iop) decoder_output = BasicConstructor.subst(iop) exec_output = PrivExecute.subst(iop) - if uses_imm: - imm_cblk = CodeBlock(imm_code) - imm_iop = InstObjParams(name, Name + 'Imm', 'PrivImm', imm_cblk, - opt_flags) + if usesImm: + imm_iop = InstObjParams(name, Name + 'Imm', 'PrivImm', + immCode, opt_flags, ("check", checkCode)) header_output += BasicDeclare.subst(imm_iop) decoder_output += BasicConstructor.subst(imm_iop) exec_output += PrivExecute.subst(imm_iop) decode_block = ROrImmDecode.subst(iop) else: decode_block = BasicDecode.subst(iop) + return (header_output, decoder_output, exec_output, decode_block) +}}; + +// Primary format for integer operate instructions: +def format Priv(code, *opt_flags) {{ + checkCode = "(!PstatePriv)" + (header_output, decoder_output, + exec_output, decode_block) = doPrivFormat(code, + checkCode, name, Name, opt_flags) }}; // Primary format for integer operate instructions: def format PrivTick(code, *opt_flags) {{ - uses_imm = (code.find('Rs2_or_imm13') != -1) - if uses_imm: - orig_code = code - code = re.sub(r'Rs2_or_imm13', 'Rs2', orig_code) - imm_code = re.sub(r'Rs2_or_imm13(\.\w+)?', 'imm', orig_code) - cblk = CodeBlock(code) - iop = InstObjParams(name, Name, 'PrivTick', cblk, opt_flags) - header_output = BasicDeclare.subst(iop) - decoder_output = BasicConstructor.subst(iop) - exec_output = PrivTickExecute.subst(iop) - if uses_imm: - imm_cblk = CodeBlock(imm_code) - imm_iop = InstObjParams(name, Name + 'Imm', 'PrivTickImm', imm_cblk, - opt_flags) - header_output += BasicDeclare.subst(imm_iop) - decoder_output += BasicConstructor.subst(imm_iop) - exec_output += PrivTickExecute.subst(imm_iop) - decode_block = Rb2OrImmDecode.subst(iop) - else: - decode_block = BasicDecode.subst(iop) + checkCode = "(!PstatePriv && TickNpt)" + (header_output, decoder_output, + exec_output, decode_block) = doPrivFormat(code, + checkCode, name, Name, opt_flags) }}; diff --git a/base/traceflags.py b/base/traceflags.py index c3b878027..7dbaac60e 100644 --- a/base/traceflags.py +++ b/base/traceflags.py @@ -143,6 +143,7 @@ baseFlags = [ 'HWPrefetch', 'Stack', 'SimpleCPU', + 'Sparc', ] # diff --git a/configs/test/hello_sparc b/configs/test/hello_sparc index eac51355bb2ce912ef0ca3778ec036f959ae7aa9..e254ae33f8dfc7af6e57d7d674fdd3252facf6c3 100755 GIT binary patch delta 43633 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 - memset(®s, 0, sizeof(RegFile)); + regs.clear(); if (cpu->params->profile) { profile = new FunctionProfile(system->kernelSymtab); @@ -93,7 +93,7 @@ CPUExecContext::CPUExecContext(BaseCPU *_cpu, int _thread_num, mem_port->setPeer(port); port->setPeer(mem_port); - memset(®s, 0, sizeof(RegFile)); + regs.clear(); proxy = new ProxyExecContext(this); }