decoder.isa revision 2591
17259Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 211574SCurtis.Dunham@arm.com// 37259Sgblack@eecs.umich.edu// The actual decoder specification 47259Sgblack@eecs.umich.edu// 57259Sgblack@eecs.umich.edu 67259Sgblack@eecs.umich.edudecode OP default Unknown::unknown() 77259Sgblack@eecs.umich.edu{ 87259Sgblack@eecs.umich.edu 0x0: decode OP2 97259Sgblack@eecs.umich.edu { 107259Sgblack@eecs.umich.edu //Throw an illegal instruction acception 117259Sgblack@eecs.umich.edu 0x0: Trap::illtrap({{fault = new IllegalInstruction;}}); 127259Sgblack@eecs.umich.edu 0x1: decode BPCC 137259Sgblack@eecs.umich.edu { 147259Sgblack@eecs.umich.edu format Branch19 157259Sgblack@eecs.umich.edu { 167259Sgblack@eecs.umich.edu 0x0: bpcci({{ 177259Sgblack@eecs.umich.edu if(passesCondition(CcrIcc, COND2)) 187259Sgblack@eecs.umich.edu NNPC = xc->readPC() + disp; 197259Sgblack@eecs.umich.edu else 207259Sgblack@eecs.umich.edu handle_annul 217259Sgblack@eecs.umich.edu }}); 227259Sgblack@eecs.umich.edu 0x2: bpccx({{ 237259Sgblack@eecs.umich.edu if(passesCondition(CcrXcc, COND2)) 247259Sgblack@eecs.umich.edu NNPC = xc->readPC() + disp; 257259Sgblack@eecs.umich.edu else 267259Sgblack@eecs.umich.edu handle_annul 277259Sgblack@eecs.umich.edu }}); 287259Sgblack@eecs.umich.edu } 297259Sgblack@eecs.umich.edu } 307259Sgblack@eecs.umich.edu 0x2: Branch22::bicc({{ 317259Sgblack@eecs.umich.edu if(passesCondition(CcrIcc, COND2)) 327259Sgblack@eecs.umich.edu NNPC = xc->readPC() + disp; 337259Sgblack@eecs.umich.edu else 347259Sgblack@eecs.umich.edu handle_annul 357259Sgblack@eecs.umich.edu }}); 367259Sgblack@eecs.umich.edu 0x3: decode RCOND2 377259Sgblack@eecs.umich.edu { 387405SAli.Saidi@ARM.com format BranchSplit 3910037SARM gem5 Developers { 407259Sgblack@eecs.umich.edu 0x1: bpreq({{ 417259Sgblack@eecs.umich.edu if(Rs1.sdw == 0) 427405SAli.Saidi@ARM.com NNPC = xc->readPC() + disp; 437259Sgblack@eecs.umich.edu else 447404SAli.Saidi@ARM.com handle_annul 4510037SARM gem5 Developers }}); 4610828SGiacomo.Gabrielli@arm.com 0x2: bprle({{ 477259Sgblack@eecs.umich.edu if(Rs1.sdw <= 0) 487259Sgblack@eecs.umich.edu NNPC = xc->readPC() + disp; 497259Sgblack@eecs.umich.edu else 507259Sgblack@eecs.umich.edu handle_annul 517259Sgblack@eecs.umich.edu }}); 528868SMatt.Horsnell@arm.com 0x3: bprl({{ 538868SMatt.Horsnell@arm.com if(Rs1.sdw < 0) 548868SMatt.Horsnell@arm.com NNPC = xc->readPC() + disp; 558868SMatt.Horsnell@arm.com else 5610037SARM gem5 Developers handle_annul 578868SMatt.Horsnell@arm.com }}); 5810037SARM gem5 Developers 0x5: bprne({{ 598868SMatt.Horsnell@arm.com if(Rs1.sdw != 0) 6010037SARM gem5 Developers NNPC = xc->readPC() + disp; 6110037SARM gem5 Developers else 6210037SARM gem5 Developers handle_annul 6310037SARM gem5 Developers }}); 6410037SARM gem5 Developers 0x6: bprg({{ 6510037SARM gem5 Developers if(Rs1.sdw > 0) 6610037SARM gem5 Developers NNPC = xc->readPC() + disp; 678868SMatt.Horsnell@arm.com else 6810037SARM gem5 Developers handle_annul 6910037SARM gem5 Developers }}); 7010037SARM gem5 Developers 0x7: bprge({{ 7110037SARM gem5 Developers if(Rs1.sdw >= 0) 7210037SARM gem5 Developers NNPC = xc->readPC() + disp; 7310037SARM gem5 Developers else 7410037SARM gem5 Developers handle_annul 7510037SARM gem5 Developers }}); 7610037SARM gem5 Developers } 7710037SARM gem5 Developers } 7810037SARM gem5 Developers //SETHI (or NOP if rd == 0 and imm == 0) 799959Schander.sudanthi@arm.com 0x4: SetHi::sethi({{Rd = imm;}}); 8010037SARM gem5 Developers 0x5: Trap::fbpfcc({{fault = new FpDisabled;}}); 819959Schander.sudanthi@arm.com 0x6: Trap::fbfcc({{fault = new FpDisabled;}}); 829959Schander.sudanthi@arm.com } 839959Schander.sudanthi@arm.com 0x1: Branch30::call({{ 849959Schander.sudanthi@arm.com R15 = xc->readPC(); 859959Schander.sudanthi@arm.com NNPC = R15 + disp; 869959Schander.sudanthi@arm.com }}); 879959Schander.sudanthi@arm.com 0x2: decode OP3 { 889959Schander.sudanthi@arm.com format IntOp { 899959Schander.sudanthi@arm.com 0x00: add({{Rd = Rs1.sdw + Rs2_or_imm13;}}); 9010037SARM gem5 Developers 0x01: and({{Rd = Rs1.udw & Rs2_or_imm13;}}); 919959Schander.sudanthi@arm.com 0x02: or({{Rd = Rs1.udw | Rs2_or_imm13;}}); 9210037SARM gem5 Developers 0x03: xor({{Rd = Rs1.udw ^ Rs2_or_imm13;}}); 9310037SARM gem5 Developers 0x04: sub({{Rd = Rs1.sdw - Rs2_or_imm13;}}); 9410037SARM gem5 Developers 0x05: andn({{Rd = Rs1.udw & ~Rs2_or_imm13;}}); 9510037SARM gem5 Developers 0x06: orn({{Rd = Rs1.udw | ~Rs2_or_imm13;}}); 9610037SARM gem5 Developers 0x07: xnor({{Rd = ~(Rs1.udw ^ Rs2_or_imm13);}}); 9710037SARM gem5 Developers 0x08: addc({{Rd = Rs1.sdw + Rs2_or_imm13 + CcrIccC;}}); 9810037SARM gem5 Developers 0x09: mulx({{Rd = Rs1 * Rs2_or_imm13;}}); 9910037SARM gem5 Developers 0x0A: umul({{ 10010037SARM gem5 Developers Rd = Rs1.udw<31:0> * Rs2_or_imm13<31:0>; 10110037SARM gem5 Developers YValue = Rd<63:32>; 10210037SARM gem5 Developers }}); 1038868SMatt.Horsnell@arm.com 0x0B: smul({{ 10410037SARM gem5 Developers Rd.sdw = Rs1.sdw<31:0> * Rs2_or_imm13<31:0>; 10510037SARM gem5 Developers YValue = Rd.sdw; 10610037SARM gem5 Developers }}); 10710037SARM gem5 Developers 0x0C: subc({{Rd.sdw = Rs1.sdw + (~Rs2_or_imm13) + 1 + CcrIccC;}}); 10810037SARM gem5 Developers 0x0D: udivx({{ 10910037SARM gem5 Developers if(Rs2_or_imm13 == 0) fault = new DivisionByZero; 11010037SARM gem5 Developers else Rd.udw = Rs1.udw / Rs2_or_imm13; 11110037SARM gem5 Developers }}); 11210037SARM gem5 Developers 0x0E: udiv({{ 11310037SARM gem5 Developers if(Rs2_or_imm13 == 0) fault = new DivisionByZero; 11410037SARM gem5 Developers else 11510037SARM gem5 Developers { 11610037SARM gem5 Developers Rd.udw = ((YValue << 32) | Rs1.udw<31:0>) / Rs2_or_imm13; 11710037SARM gem5 Developers if(Rd.udw >> 32 != 0) 11810037SARM gem5 Developers Rd.udw = 0xFFFFFFFF; 1198868SMatt.Horsnell@arm.com } 12010037SARM gem5 Developers }}); 12110037SARM gem5 Developers 0x0F: sdiv({{ 12210037SARM gem5 Developers if(Rs2_or_imm13 == 0) 12310037SARM gem5 Developers fault = new DivisionByZero; 12410037SARM gem5 Developers else 1258868SMatt.Horsnell@arm.com { 12610037SARM gem5 Developers Rd.udw = ((YValue << 32) | Rs1.sdw<31:0>) / Rs2_or_imm13; 12710037SARM gem5 Developers if(Rd.udw<63:31> != 0) 12810037SARM gem5 Developers Rd.udw = 0x7FFFFFFF; 12910037SARM gem5 Developers else if(Rd.udw<63:> && Rd.udw<62:31> != 0xFFFFFFFF) 13010506SAli.Saidi@ARM.com Rd.udw = 0xFFFFFFFF80000000ULL; 13110037SARM gem5 Developers } 13210506SAli.Saidi@ARM.com }}); 13310037SARM gem5 Developers } 13410506SAli.Saidi@ARM.com format IntOpCc { 13510037SARM gem5 Developers 0x10: addcc({{ 13610506SAli.Saidi@ARM.com int64_t resTemp, val2 = Rs2_or_imm13; 13710037SARM gem5 Developers Rd = resTemp = Rs1 + val2;}}, 13810506SAli.Saidi@ARM.com {{(Rs1<31:0> + val2<31:0>)<32:>}}, 13910037SARM gem5 Developers {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}}, 14010506SAli.Saidi@ARM.com {{(Rs1<63:1> + val2<63:1> + (Rs1 & val2)<0:>)<63:>}}, 14110037SARM gem5 Developers {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} 14210506SAli.Saidi@ARM.com ); 14310037SARM gem5 Developers 0x11: IntOpCcRes::andcc({{Rd = Rs1 & Rs2_or_imm13;}}); 14410506SAli.Saidi@ARM.com 0x12: IntOpCcRes::orcc({{Rd = Rs1 | Rs2_or_imm13;}}); 14510037SARM gem5 Developers 0x13: IntOpCcRes::xorcc({{Rd = Rs1 ^ Rs2_or_imm13;}}); 14610506SAli.Saidi@ARM.com 0x14: subcc({{ 14710037SARM gem5 Developers int64_t val2 = Rs2_or_imm13; 14810506SAli.Saidi@ARM.com Rd = Rs1 - val2;}}, 14910037SARM gem5 Developers {{(~(Rs1<31:0> + (~val2)<31:0> + 1))<32:>}}, 15010506SAli.Saidi@ARM.com {{(Rs1<31:> != val2<31:>) && (Rs1<31:> != Rd<31:>)}}, 15110037SARM gem5 Developers {{(~(Rs1<63:1> + (~val2)<63:1> + 15210506SAli.Saidi@ARM.com (Rs1 | ~val2)<0:>))<63:>}}, 15310037SARM gem5 Developers {{Rs1<63:> != val2<63:> && Rs1<63:> != Rd<63:>}} 15410506SAli.Saidi@ARM.com ); 15510037SARM gem5 Developers 0x15: IntOpCcRes::andncc({{Rd = Rs1 & ~Rs2_or_imm13;}}); 15610506SAli.Saidi@ARM.com 0x16: IntOpCcRes::orncc({{Rd = Rs1 | ~Rs2_or_imm13;}}); 15710037SARM gem5 Developers 0x17: IntOpCcRes::xnorcc({{Rd = ~(Rs1 ^ Rs2_or_imm13);}}); 15810506SAli.Saidi@ARM.com 0x18: addccc({{ 15910037SARM gem5 Developers int64_t resTemp, val2 = Rs2_or_imm13; 16010037SARM gem5 Developers int64_t carryin = CcrIccC; 16110037SARM gem5 Developers Rd = resTemp = Rs1 + val2 + carryin;}}, 16210506SAli.Saidi@ARM.com {{(Rs1<31:0> + val2<31:0> + carryin)<32:>}}, 16310037SARM gem5 Developers {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}}, 16410506SAli.Saidi@ARM.com {{(Rs1<63:1> + val2<63:1> + 16510037SARM gem5 Developers ((Rs1 & val2) | (carryin & (Rs1 | val2)))<0:>)<63:>}}, 16610506SAli.Saidi@ARM.com {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} 16710037SARM gem5 Developers ); 16810506SAli.Saidi@ARM.com 0x1A: umulcc({{ 16910037SARM gem5 Developers uint64_t resTemp, val2 = Rs2_or_imm13; 17010506SAli.Saidi@ARM.com Rd = resTemp = Rs1.udw<31:0> * val2<31:0>; 17110037SARM gem5 Developers YValue = resTemp<63:32>;}}, 17210506SAli.Saidi@ARM.com {{0}},{{0}},{{0}},{{0}}); 17310037SARM gem5 Developers 0x1B: smulcc({{ 17410506SAli.Saidi@ARM.com int64_t resTemp, val2 = Rs2_or_imm13; 17510037SARM gem5 Developers Rd = resTemp = Rs1.sdw<31:0> * val2<31:0>; 17610506SAli.Saidi@ARM.com YValue = resTemp<63:32>;}}, 17710037SARM gem5 Developers {{0}},{{0}},{{0}},{{0}}); 17810506SAli.Saidi@ARM.com 0x1C: subccc({{ 17910037SARM gem5 Developers int64_t resTemp, val2 = Rs2_or_imm13; 18010506SAli.Saidi@ARM.com int64_t carryin = CcrIccC; 18110037SARM gem5 Developers Rd = resTemp = Rs1 + ~(val2 + carryin) + 1;}}, 18210506SAli.Saidi@ARM.com {{(~((Rs1<31:0> + (~(val2 + carryin))<31:0> + 1))<32:>)}}, 18310037SARM gem5 Developers {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}}, 18410506SAli.Saidi@ARM.com {{(~((Rs1<63:1> + (~(val2 + carryin))<63:1>) + (Rs1<0:> + (~(val2+carryin))<0:> + 1)<63:1>))<63:>}}, 18510037SARM gem5 Developers {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}} 18610506SAli.Saidi@ARM.com ); 18710037SARM gem5 Developers 0x1D: udivxcc({{ 18810506SAli.Saidi@ARM.com if(Rs2_or_imm13 == 0) fault = new DivisionByZero; 18910037SARM gem5 Developers else Rd = Rs1.udw / Rs2_or_imm13;}} 19010506SAli.Saidi@ARM.com ,{{0}},{{0}},{{0}},{{0}}); 19110037SARM gem5 Developers 0x1E: udivcc({{ 19210037SARM gem5 Developers uint32_t resTemp, val2 = Rs2_or_imm13; 19310037SARM gem5 Developers int32_t overflow; 19410506SAli.Saidi@ARM.com if(val2 == 0) fault = new DivisionByZero; 19510037SARM gem5 Developers else 19610506SAli.Saidi@ARM.com { 19710037SARM gem5 Developers resTemp = (uint64_t)((YValue << 32) | Rs1.udw<31:0>) / val2; 19810506SAli.Saidi@ARM.com overflow = (resTemp<63:32> != 0); 19910037SARM gem5 Developers if(overflow) Rd = resTemp = 0xFFFFFFFF; 20010506SAli.Saidi@ARM.com else Rd = resTemp; 20110037SARM gem5 Developers } }}, 20210506SAli.Saidi@ARM.com {{0}}, 20310037SARM gem5 Developers {{overflow}}, 20410506SAli.Saidi@ARM.com {{0}}, 20510037SARM gem5 Developers {{0}} 20610506SAli.Saidi@ARM.com ); 20710037SARM gem5 Developers 0x1F: sdivcc({{ 20810506SAli.Saidi@ARM.com int32_t resTemp, val2 = Rs2_or_imm13; 20910037SARM gem5 Developers int32_t overflow, underflow; 21010506SAli.Saidi@ARM.com if(val2 == 0) fault = new DivisionByZero; 21110037SARM gem5 Developers else 21210506SAli.Saidi@ARM.com { 21310037SARM gem5 Developers Rd = resTemp = (int64_t)((YValue << 32) | Rs1.sdw<31:0>) / val2; 21410506SAli.Saidi@ARM.com overflow = (resTemp<63:31> != 0); 21510037SARM gem5 Developers underflow = (resTemp<63:> && resTemp<62:31> != 0xFFFFFFFF); 21610506SAli.Saidi@ARM.com if(overflow) Rd = resTemp = 0x7FFFFFFF; 21710037SARM gem5 Developers else if(underflow) Rd = resTemp = 0xFFFFFFFF80000000ULL; 21810506SAli.Saidi@ARM.com else Rd = resTemp; 21910037SARM gem5 Developers } }}, 22010506SAli.Saidi@ARM.com {{0}}, 22110037SARM gem5 Developers {{overflow || underflow}}, 22210506SAli.Saidi@ARM.com {{0}}, 22310037SARM gem5 Developers {{0}} 22410506SAli.Saidi@ARM.com ); 22510037SARM gem5 Developers 0x20: taddcc({{ 22610506SAli.Saidi@ARM.com int64_t resTemp, val2 = Rs2_or_imm13; 22710037SARM gem5 Developers Rd = resTemp = Rs1 + val2; 22810506SAli.Saidi@ARM.com int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}}, 22910037SARM gem5 Developers {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}}, 23010506SAli.Saidi@ARM.com {{overflow}}, 23110037SARM gem5 Developers {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, 23210506SAli.Saidi@ARM.com {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} 23310037SARM gem5 Developers ); 23410506SAli.Saidi@ARM.com 0x21: tsubcc({{ 23510037SARM gem5 Developers int64_t resTemp, val2 = Rs2_or_imm13; 23610506SAli.Saidi@ARM.com Rd = resTemp = Rs1 + val2; 23710037SARM gem5 Developers int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}}, 23810506SAli.Saidi@ARM.com {{(Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31}}, 23910037SARM gem5 Developers {{overflow}}, 24010506SAli.Saidi@ARM.com {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, 24110037SARM gem5 Developers {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} 24210506SAli.Saidi@ARM.com ); 24310037SARM gem5 Developers 0x22: taddcctv({{ 24410506SAli.Saidi@ARM.com int64_t resTemp, val2 = Rs2_or_imm13; 24510037SARM gem5 Developers Rd = resTemp = Rs1 + val2; 24610506SAli.Saidi@ARM.com int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>); 24710037SARM gem5 Developers if(overflow) fault = new TagOverflow;}}, 24810506SAli.Saidi@ARM.com {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}}, 24910037SARM gem5 Developers {{overflow}}, 25010506SAli.Saidi@ARM.com {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, 25110037SARM gem5 Developers {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} 25210506SAli.Saidi@ARM.com ); 25310037SARM gem5 Developers 0x23: tsubcctv({{ 25410506SAli.Saidi@ARM.com int64_t resTemp, val2 = Rs2_or_imm13; 25510037SARM gem5 Developers Rd = resTemp = Rs1 + val2; 25610506SAli.Saidi@ARM.com int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>); 25710037SARM gem5 Developers if(overflow) fault = new TagOverflow;}}, 25810506SAli.Saidi@ARM.com {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}}, 25910037SARM gem5 Developers {{overflow}}, 26010506SAli.Saidi@ARM.com {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}}, 26110037SARM gem5 Developers {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}} 26210506SAli.Saidi@ARM.com ); 26310037SARM gem5 Developers 0x24: mulscc({{ 26410506SAli.Saidi@ARM.com int64_t resTemp, multiplicand = Rs2_or_imm13; 26510037SARM gem5 Developers int32_t multiplier = Rs1<31:0>; 26610506SAli.Saidi@ARM.com int32_t savedLSB = Rs1<0:>; 26710037SARM gem5 Developers multiplier = multiplier<31:1> | 26810506SAli.Saidi@ARM.com ((CcrIccN 26910037SARM gem5 Developers ^ CcrIccV) << 32); 27010506SAli.Saidi@ARM.com if(!YValue<0:>) 27110037SARM gem5 Developers multiplicand = 0; 27210506SAli.Saidi@ARM.com Rd = resTemp = multiplicand + multiplier; 27310037SARM gem5 Developers YValue = YValue<31:1> | (savedLSB << 31);}}, 27410506SAli.Saidi@ARM.com {{((multiplicand & 0xFFFFFFFF + multiplier & 0xFFFFFFFF) >> 31)}}, 27510037SARM gem5 Developers {{multiplicand<31:> == multiplier<31:> && multiplier<31:> != resTemp<31:>}}, 27610506SAli.Saidi@ARM.com {{((multiplicand >> 1) + (multiplier >> 1) + (multiplicand & multiplier & 0x1))<63:>}}, 27710037SARM gem5 Developers {{multiplicand<63:> == multiplier<63:> && multiplier<63:> != resTemp<63:>}} 27810506SAli.Saidi@ARM.com ); 27910037SARM gem5 Developers } 28010506SAli.Saidi@ARM.com format IntOp 28110037SARM gem5 Developers { 28210506SAli.Saidi@ARM.com 0x25: decode X { 28310037SARM gem5 Developers 0x0: sll({{Rd = Rs1 << (I ? SHCNT32 : Rs2<4:0>);}}); 28410506SAli.Saidi@ARM.com 0x1: sllx({{Rd = Rs1 << (I ? SHCNT64 : Rs2<5:0>);}}); 28510037SARM gem5 Developers } 28610506SAli.Saidi@ARM.com 0x26: decode X { 28710037SARM gem5 Developers 0x0: srl({{Rd = Rs1.uw >> (I ? SHCNT32 : Rs2<4:0>);}}); 28810506SAli.Saidi@ARM.com 0x1: srlx({{Rd = Rs1.udw >> (I ? SHCNT64 : Rs2<5:0>);}}); 28910037SARM gem5 Developers } 29010506SAli.Saidi@ARM.com 0x27: decode X { 29110037SARM gem5 Developers 0x0: sra({{Rd = Rs1.sw >> (I ? SHCNT32 : Rs2<4:0>);}}); 29210506SAli.Saidi@ARM.com 0x1: srax({{Rd = Rs1.sdw >> (I ? SHCNT64 : Rs2<5:0>);}}); 29310037SARM gem5 Developers } 29410037SARM gem5 Developers 0x28: decode RS1 { 29510037SARM gem5 Developers 0x0: rdy({{Rd = YValue;}}); 29610506SAli.Saidi@ARM.com 0x2: rdccr({{Rd = Ccr;}}); 29710037SARM gem5 Developers 0x3: rdasi({{Rd = Asi;}}); 29810506SAli.Saidi@ARM.com 0x4: PrivTick::rdtick({{Rd = Tick;}}); 29910037SARM gem5 Developers 0x5: rdpc({{Rd = xc->readPC();}}); 30010506SAli.Saidi@ARM.com 0x6: rdfprs({{Rd = Fprs;}}); 30110037SARM gem5 Developers 0xF: decode I { 30210506SAli.Saidi@ARM.com 0x0: Nop::membar({{/*Membar isn't needed yet*/}}); 30310037SARM gem5 Developers 0x1: Nop::stbar({{/*Stbar isn't needed yet*/}}); 30410506SAli.Saidi@ARM.com } 30510037SARM gem5 Developers } 30610506SAli.Saidi@ARM.com 0x2A: decode RS1 { 30710037SARM gem5 Developers format Priv 30810506SAli.Saidi@ARM.com { 30910037SARM gem5 Developers 0x0: rdprtpc({{ 31010506SAli.Saidi@ARM.com Rd = xc->readMiscReg(MISCREG_TPC_BASE + Tl); 31110037SARM gem5 Developers }}); 31210506SAli.Saidi@ARM.com 0x1: rdprtnpc({{ 31310037SARM gem5 Developers Rd = xc->readMiscReg(MISCREG_TNPC_BASE + Tl); 31410506SAli.Saidi@ARM.com }}); 31510037SARM gem5 Developers 0x2: rdprtstate({{ 31610506SAli.Saidi@ARM.com Rd = xc->readMiscReg(MISCREG_TSTATE_BASE + Tl); 31710037SARM gem5 Developers }}); 31810506SAli.Saidi@ARM.com 0x3: rdprtt({{ 31910037SARM gem5 Developers Rd = xc->readMiscReg(MISCREG_TT_BASE + Tl); 32010506SAli.Saidi@ARM.com }}); 32110037SARM gem5 Developers 0x4: rdprtick({{Rd = Tick;}}); 32210506SAli.Saidi@ARM.com 0x5: rdprtba({{Rd = Tba;}}); 32310037SARM gem5 Developers 0x6: rdprpstate({{Rd = Pstate;}}); 32410506SAli.Saidi@ARM.com 0x7: rdprtl({{Rd = Tl;}}); 32510037SARM gem5 Developers 0x8: rdprpil({{Rd = Pil;}}); 32610506SAli.Saidi@ARM.com 0x9: rdprcwp({{Rd = Cwp;}}); 32710037SARM gem5 Developers 0xA: rdprcansave({{Rd = Cansave;}}); 32810506SAli.Saidi@ARM.com 0xB: rdprcanrestore({{Rd = Canrestore;}}); 32910037SARM gem5 Developers 0xC: rdprcleanwin({{Rd = Cleanwin;}}); 33010506SAli.Saidi@ARM.com 0xD: rdprotherwin({{Rd = Otherwin;}}); 33110037SARM gem5 Developers 0xE: rdprwstate({{Rd = Wstate;}}); 33210506SAli.Saidi@ARM.com } 33310037SARM gem5 Developers //The floating point queue isn't implemented right now. 33410506SAli.Saidi@ARM.com 0xF: Trap::rdprfq({{fault = new IllegalInstruction;}}); 33510037SARM gem5 Developers 0x1F: Priv::rdprver({{Rd = Ver;}}); 33610506SAli.Saidi@ARM.com } 33710037SARM gem5 Developers 0x2B: BasicOperate::flushw({{ 33810506SAli.Saidi@ARM.com if(NWindows - 2 - Cansave == 0) 33910037SARM gem5 Developers { 34010506SAli.Saidi@ARM.com if(Otherwin) 34110037SARM gem5 Developers fault = new SpillNOther(WstateOther); 34210506SAli.Saidi@ARM.com else 34310037SARM gem5 Developers fault = new SpillNNormal(WstateNormal); 34410506SAli.Saidi@ARM.com } 34510037SARM gem5 Developers }}); 34610506SAli.Saidi@ARM.com 0x2C: decode MOVCC3 34710037SARM gem5 Developers { 34810506SAli.Saidi@ARM.com 0x0: Trap::movccfcc({{fault = new FpDisabled;}}); 34910037SARM gem5 Developers 0x1: decode CC 35010506SAli.Saidi@ARM.com { 35110037SARM gem5 Developers 0x0: movcci({{ 35210506SAli.Saidi@ARM.com if(passesCondition(CcrIcc, COND4)) 35310037SARM gem5 Developers Rd = Rs2_or_imm11; 35410506SAli.Saidi@ARM.com else 35510037SARM gem5 Developers Rd = Rd; 35610506SAli.Saidi@ARM.com }}); 35710037SARM gem5 Developers 0x2: movccx({{ 35810506SAli.Saidi@ARM.com if(passesCondition(CcrXcc, COND4)) 35910037SARM gem5 Developers Rd = Rs2_or_imm11; 36010506SAli.Saidi@ARM.com else 36110037SARM gem5 Developers Rd = Rd; 36210506SAli.Saidi@ARM.com }}); 36310037SARM gem5 Developers } 36410506SAli.Saidi@ARM.com } 36510037SARM gem5 Developers 0x2D: sdivx({{ 36610506SAli.Saidi@ARM.com if(Rs2_or_imm13 == 0) fault = new DivisionByZero; 36710037SARM gem5 Developers else Rd.sdw = Rs1.sdw / Rs2_or_imm13; 36810506SAli.Saidi@ARM.com }}); 36910037SARM gem5 Developers 0x2E: decode RS1 { 37010506SAli.Saidi@ARM.com 0x0: IntOp::popc({{ 37110037SARM gem5 Developers int64_t count = 0; 37210506SAli.Saidi@ARM.com uint64_t temp = Rs2_or_imm13; 37310037SARM gem5 Developers //Count the 1s in the front 4bits until none are left 37410506SAli.Saidi@ARM.com uint8_t oneBits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}; 37510037SARM gem5 Developers while(temp) 37610506SAli.Saidi@ARM.com { 37710037SARM gem5 Developers count += oneBits[temp & 0xF]; 37810506SAli.Saidi@ARM.com temp = temp >> 4; 37910037SARM gem5 Developers } 38010506SAli.Saidi@ARM.com Rd = count; 38110037SARM gem5 Developers }}); 38210506SAli.Saidi@ARM.com } 38310037SARM gem5 Developers 0x2F: decode RCOND3 38410506SAli.Saidi@ARM.com { 38510037SARM gem5 Developers 0x1: movreq({{Rd = (Rs1 == 0) ? Rs2_or_imm10 : Rd;}}); 38610506SAli.Saidi@ARM.com 0x2: movrle({{Rd = (Rs1 <= 0) ? Rs2_or_imm10 : Rd;}}); 38710037SARM gem5 Developers 0x3: movrl({{Rd = (Rs1 < 0) ? Rs2_or_imm10 : Rd;}}); 38810506SAli.Saidi@ARM.com 0x5: movrne({{Rd = (Rs1 != 0) ? Rs2_or_imm10 : Rd;}}); 38910037SARM gem5 Developers 0x6: movrg({{Rd = (Rs1 > 0) ? Rs2_or_imm10 : Rd;}}); 39010506SAli.Saidi@ARM.com 0x7: movrge({{Rd = (Rs1 >= 0) ? Rs2_or_imm10 : Rd;}}); 39110037SARM gem5 Developers } 39210506SAli.Saidi@ARM.com 0x30: decode RD { 39310037SARM gem5 Developers 0x0: wry({{Y = Rs1 ^ Rs2_or_imm13;}}); 39410506SAli.Saidi@ARM.com 0x2: wrccr({{Ccr = Rs1 ^ Rs2_or_imm13;}}); 39510037SARM gem5 Developers 0x3: wrasi({{Asi = Rs1 ^ Rs2_or_imm13;}}); 39610506SAli.Saidi@ARM.com 0x6: wrfprs({{Asi = Rs1 ^ Rs2_or_imm13;}}); 39710037SARM gem5 Developers 0xF: Trap::sir({{fault = new SoftwareInitiatedReset;}}); 39810506SAli.Saidi@ARM.com } 39910037SARM gem5 Developers 0x31: decode FCN { 40010506SAli.Saidi@ARM.com 0x0: BasicOperate::saved({{/*Boogy Boogy*/}}); 40110037SARM gem5 Developers 0x1: BasicOperate::restored({{/*Boogy Boogy*/}}); 40210506SAli.Saidi@ARM.com } 40310037SARM gem5 Developers 0x32: decode RD { 40410506SAli.Saidi@ARM.com format Priv 40510037SARM gem5 Developers { 40610506SAli.Saidi@ARM.com 0x0: wrprtpc({{ 40710037SARM gem5 Developers xc->setMiscReg(MISCREG_TPC_BASE + Tl, 40810506SAli.Saidi@ARM.com Rs1 ^ Rs2_or_imm13); 40910037SARM gem5 Developers }}); 41010506SAli.Saidi@ARM.com 0x1: wrprtnpc({{ 41110037SARM gem5 Developers xc->setMiscReg(MISCREG_TNPC_BASE + Tl, 41210506SAli.Saidi@ARM.com Rs1 ^ Rs2_or_imm13); 41310037SARM gem5 Developers }}); 41410506SAli.Saidi@ARM.com 0x2: wrprtstate({{ 41510037SARM gem5 Developers xc->setMiscReg(MISCREG_TSTATE_BASE + Tl, 41610506SAli.Saidi@ARM.com Rs1 ^ Rs2_or_imm13); 41710037SARM gem5 Developers }}); 41810506SAli.Saidi@ARM.com 0x3: wrprtt({{ 41910037SARM gem5 Developers xc->setMiscReg(MISCREG_TT_BASE + Tl, 42010506SAli.Saidi@ARM.com Rs1 ^ Rs2_or_imm13); 42110037SARM gem5 Developers }}); 42210506SAli.Saidi@ARM.com 0x4: wrprtick({{Tick = Rs1 ^ Rs2_or_imm13;}}); 42310037SARM gem5 Developers 0x5: wrprtba({{Tba = Rs1 ^ Rs2_or_imm13;}}); 42410506SAli.Saidi@ARM.com 0x6: wrprpstate({{Pstate = Rs1 ^ Rs2_or_imm13;}}); 42510037SARM gem5 Developers 0x7: wrprtl({{Tl = Rs1 ^ Rs2_or_imm13;}}); 42610506SAli.Saidi@ARM.com 0x8: wrprpil({{Pil = Rs1 ^ Rs2_or_imm13;}}); 42710037SARM gem5 Developers 0x9: wrprcwp({{Cwp = Rs1 ^ Rs2_or_imm13;}}); 42810506SAli.Saidi@ARM.com 0xA: wrprcansave({{Cansave = Rs1 ^ Rs2_or_imm13;}}); 42910037SARM gem5 Developers 0xB: wrprcanrestore({{Canrestore = Rs1 ^ Rs2_or_imm13;}}); 43010506SAli.Saidi@ARM.com 0xC: wrprcleanwin({{Cleanwin = Rs1 ^ Rs2_or_imm13;}}); 43110037SARM gem5 Developers 0xD: wrprotherwin({{Otherwin = Rs1 ^ Rs2_or_imm13;}}); 43210506SAli.Saidi@ARM.com 0xE: wrprwstate({{Wstate = Rs1 ^ Rs2_or_imm13;}}); 43310037SARM gem5 Developers } 43410506SAli.Saidi@ARM.com } 43510037SARM gem5 Developers 0x34: Trap::fpop1({{fault = new FpDisabled;}}); 43610506SAli.Saidi@ARM.com 0x35: Trap::fpop2({{fault = new FpDisabled;}}); 43710037SARM gem5 Developers 0x38: Branch::jmpl({{ 43810506SAli.Saidi@ARM.com Addr target = Rs1 + Rs2_or_imm13; 43910037SARM gem5 Developers if(target & 0x3) 44010506SAli.Saidi@ARM.com fault = new MemAddressNotAligned; 44110037SARM gem5 Developers else 44210506SAli.Saidi@ARM.com { 44310037SARM gem5 Developers Rd = xc->readPC(); 44410506SAli.Saidi@ARM.com NNPC = target; 44510037SARM gem5 Developers } 44610506SAli.Saidi@ARM.com }}); 44710037SARM gem5 Developers 0x39: Branch::return({{ 44810506SAli.Saidi@ARM.com //If both MemAddressNotAligned and 44910037SARM gem5 Developers //a fill trap happen, it's not clear 45010506SAli.Saidi@ARM.com //which one should be returned. 45110037SARM gem5 Developers Addr target = Rs1 + Rs2_or_imm13; 45210506SAli.Saidi@ARM.com if(target & 0x3) 45310037SARM gem5 Developers fault = new MemAddressNotAligned; 45410506SAli.Saidi@ARM.com else 45510037SARM gem5 Developers NNPC = target; 45610506SAli.Saidi@ARM.com if(fault == NoFault) 45710037SARM gem5 Developers { 45810506SAli.Saidi@ARM.com //CWP should be set directly so that it always happens 45910037SARM gem5 Developers //Also, this will allow writing to the new window and 46010506SAli.Saidi@ARM.com //reading from the old one 46110037SARM gem5 Developers Cwp = (Cwp - 1 + NWindows) % NWindows; 46210506SAli.Saidi@ARM.com if(Canrestore == 0) 46310037SARM gem5 Developers { 46410506SAli.Saidi@ARM.com if(Otherwin) 46510037SARM gem5 Developers fault = new FillNOther(WstateOther); 46610506SAli.Saidi@ARM.com else 46710037SARM gem5 Developers fault = new FillNNormal(WstateNormal); 46810506SAli.Saidi@ARM.com } 46910037SARM gem5 Developers else 47010506SAli.Saidi@ARM.com { 47110037SARM gem5 Developers Rd = Rs1 + Rs2_or_imm13; 47210506SAli.Saidi@ARM.com Cansave = Cansave + 1; 47310037SARM gem5 Developers Canrestore = Canrestore - 1; 47410506SAli.Saidi@ARM.com } 47510037SARM gem5 Developers //This is here to make sure the CWP is written 47610506SAli.Saidi@ARM.com //no matter what. This ensures that the results 47710037SARM gem5 Developers //are written in the new window as well. 47810506SAli.Saidi@ARM.com xc->setMiscRegWithEffect(MISCREG_CWP, Cwp); 47910037SARM gem5 Developers } 48010506SAli.Saidi@ARM.com }}); 48110037SARM gem5 Developers 0x3A: decode CC 48210506SAli.Saidi@ARM.com { 48310037SARM gem5 Developers 0x0: Trap::tcci({{ 48410506SAli.Saidi@ARM.com if(passesCondition(CcrIcc, COND2)) 48510037SARM gem5 Developers { 48610506SAli.Saidi@ARM.com int lTrapNum = I ? (Rs1 + SW_TRAP) : (Rs1 + Rs2); 48710037SARM gem5 Developers DPRINTF(Sparc, "The trap number is %d\n", lTrapNum); 48810506SAli.Saidi@ARM.com#if FULL_SYSTEM 48910037SARM gem5 Developers fault = new TrapInstruction(lTrapNum); 49010506SAli.Saidi@ARM.com#else 49110037SARM gem5 Developers DPRINTF(Sparc, "The syscall number is %d\n", R1); 49210506SAli.Saidi@ARM.com xc->syscall(R1); 49310037SARM gem5 Developers#endif 49410506SAli.Saidi@ARM.com } 49510037SARM gem5 Developers else 49610506SAli.Saidi@ARM.com { 49710037SARM gem5 Developers DPRINTF(Sparc, "Didn't fire on %s\n", CondTestAbbrev[machInst<25:28>]); 49810506SAli.Saidi@ARM.com } 49910037SARM gem5 Developers }}); 50010506SAli.Saidi@ARM.com 0x2: Trap::tccx({{ 50110037SARM gem5 Developers if(passesCondition(CcrXcc, COND2)) 50210506SAli.Saidi@ARM.com { 50310037SARM gem5 Developers int lTrapNum = I ? (Rs1 + SW_TRAP) : (Rs1 + Rs2); 50410506SAli.Saidi@ARM.com DPRINTF(Sparc, "The trap number is %d\n", lTrapNum); 50510037SARM gem5 Developers#if FULL_SYSTEM 50610506SAli.Saidi@ARM.com fault = new TrapInstruction(lTrapNum); 50710037SARM gem5 Developers#else 50810506SAli.Saidi@ARM.com DPRINTF(Sparc, "The syscall number is %d\n", R1); 50910037SARM gem5 Developers xc->syscall(R1); 51010506SAli.Saidi@ARM.com#endif 51110037SARM gem5 Developers } 51210506SAli.Saidi@ARM.com }}); 51310037SARM gem5 Developers } 51410506SAli.Saidi@ARM.com 0x3B: Nop::flush({{/*Instruction memory flush*/}}); 51510037SARM gem5 Developers 0x3C: save({{ 51610506SAli.Saidi@ARM.com //CWP should be set directly so that it always happens 51710037SARM gem5 Developers //Also, this will allow writing to the new window and 51810506SAli.Saidi@ARM.com //reading from the old one 51910037SARM gem5 Developers if(Cansave == 0) 52010506SAli.Saidi@ARM.com { 52110037SARM gem5 Developers if(Otherwin) 52210506SAli.Saidi@ARM.com fault = new SpillNOther(WstateOther); 52310037SARM gem5 Developers else 52410506SAli.Saidi@ARM.com fault = new SpillNNormal(WstateNormal); 52510037SARM gem5 Developers Cwp = (Cwp + 2) % NWindows; 52610506SAli.Saidi@ARM.com } 52710037SARM gem5 Developers else if(Cleanwin - Canrestore == 0) 52810506SAli.Saidi@ARM.com { 52910037SARM gem5 Developers Cwp = (Cwp + 1) % NWindows; 53010506SAli.Saidi@ARM.com fault = new CleanWindow; 53110037SARM gem5 Developers } 53210506SAli.Saidi@ARM.com else 53310037SARM gem5 Developers { 53410506SAli.Saidi@ARM.com Cwp = (Cwp + 1) % NWindows; 53510037SARM gem5 Developers Rd = Rs1 + Rs2_or_imm13; 53610506SAli.Saidi@ARM.com Cansave = Cansave - 1; 53710037SARM gem5 Developers Canrestore = Canrestore + 1; 53810506SAli.Saidi@ARM.com } 53910037SARM gem5 Developers //This is here to make sure the CWP is written 54010506SAli.Saidi@ARM.com //no matter what. This ensures that the results 54110037SARM gem5 Developers //are written in the new window as well. 54210506SAli.Saidi@ARM.com xc->setMiscRegWithEffect(MISCREG_CWP, Cwp); 54310037SARM gem5 Developers }}); 54410506SAli.Saidi@ARM.com 0x3D: restore({{ 54510037SARM gem5 Developers //CWP should be set directly so that it always happens 54610506SAli.Saidi@ARM.com //Also, this will allow writing to the new window and 54710037SARM gem5 Developers //reading from the old one 54810506SAli.Saidi@ARM.com Cwp = (Cwp - 1 + NWindows) % NWindows; 54910037SARM gem5 Developers if(Canrestore == 0) 55010506SAli.Saidi@ARM.com { 55110037SARM gem5 Developers if(Otherwin) 55210506SAli.Saidi@ARM.com fault = new FillNOther(WstateOther); 55310037SARM gem5 Developers else 55410506SAli.Saidi@ARM.com fault = new FillNNormal(WstateNormal); 55510037SARM gem5 Developers } 55610506SAli.Saidi@ARM.com else 55710037SARM gem5 Developers { 55810506SAli.Saidi@ARM.com Rd = Rs1 + Rs2_or_imm13; 55910037SARM gem5 Developers Cansave = Cansave + 1; 56010506SAli.Saidi@ARM.com Canrestore = Canrestore - 1; 56110037SARM gem5 Developers } 56210506SAli.Saidi@ARM.com //This is here to make sure the CWP is written 56310037SARM gem5 Developers //no matter what. This ensures that the results 56410506SAli.Saidi@ARM.com //are written in the new window as well. 56510037SARM gem5 Developers xc->setMiscRegWithEffect(MISCREG_CWP, Cwp); 56610506SAli.Saidi@ARM.com }}); 56710037SARM gem5 Developers 0x3E: decode FCN { 56810506SAli.Saidi@ARM.com 0x0: Priv::done({{ 56910037SARM gem5 Developers if(Tl == 0) 57010506SAli.Saidi@ARM.com return new IllegalInstruction; 57110037SARM gem5 Developers Cwp = xc->readMiscReg(MISCREG_TSTATE_CWP_BASE + Tl); 57210506SAli.Saidi@ARM.com Asi = xc->readMiscReg(MISCREG_TSTATE_ASI_BASE + Tl); 57310037SARM gem5 Developers Ccr = xc->readMiscReg(MISCREG_TSTATE_CCR_BASE + Tl); 57410506SAli.Saidi@ARM.com Pstate = xc->readMiscReg(MISCREG_TSTATE_PSTATE_BASE + Tl); 57510037SARM gem5 Developers NPC = xc->readMiscReg(MISCREG_TNPC_BASE + Tl); 57610506SAli.Saidi@ARM.com NNPC = NPC + 4; 57710037SARM gem5 Developers Tl = Tl - 1; 57810506SAli.Saidi@ARM.com }}); 57910037SARM gem5 Developers 0x1: BasicOperate::retry({{ 58010506SAli.Saidi@ARM.com if(Tl == 0) 58110037SARM gem5 Developers return new IllegalInstruction; 58210506SAli.Saidi@ARM.com Cwp = xc->readMiscReg(MISCREG_TSTATE_CWP_BASE + Tl); 58310037SARM gem5 Developers Asi = xc->readMiscReg(MISCREG_TSTATE_ASI_BASE + Tl); 58410506SAli.Saidi@ARM.com Ccr = xc->readMiscReg(MISCREG_TSTATE_CCR_BASE + Tl); 58510037SARM gem5 Developers Pstate = xc->readMiscReg(MISCREG_TSTATE_PSTATE_BASE + Tl); 58610506SAli.Saidi@ARM.com NPC = xc->readMiscReg(MISCREG_TPC_BASE + Tl); 58710037SARM gem5 Developers NNPC = xc->readMiscReg(MISCREG_TNPC_BASE + Tl); 58810506SAli.Saidi@ARM.com Tl = Tl - 1; 58910037SARM gem5 Developers }}); 59010506SAli.Saidi@ARM.com } 59110037SARM gem5 Developers } 59210506SAli.Saidi@ARM.com } 59310037SARM gem5 Developers 0x3: decode OP3 { 59410506SAli.Saidi@ARM.com format Load { 59510037SARM gem5 Developers 0x00: lduw({{Rd = Mem;}}, {{32}}); 59610506SAli.Saidi@ARM.com 0x01: ldub({{Rd = Mem;}}, {{8}}); 59710037SARM gem5 Developers 0x02: lduh({{Rd = Mem;}}, {{16}}); 59810506SAli.Saidi@ARM.com 0x03: ldd({{ 59910037SARM gem5 Developers uint64_t val = Mem; 60010506SAli.Saidi@ARM.com RdLow = val<31:0>; 60110037SARM gem5 Developers RdHigh = val<63:32>; 60210506SAli.Saidi@ARM.com }}, {{64}}); 60310037SARM gem5 Developers } 60410506SAli.Saidi@ARM.com format Store { 60510037SARM gem5 Developers 0x04: stw({{Mem = Rd.sw;}}, {{32}}); 60610506SAli.Saidi@ARM.com 0x05: stb({{Mem = Rd.sb;}}, {{8}}); 60710037SARM gem5 Developers 0x06: sth({{Mem = Rd.shw;}}, {{16}}); 60810506SAli.Saidi@ARM.com 0x07: std({{Mem = RdLow<31:0> | RdHigh<31:0> << 32;}}, {{64}}); 60910037SARM gem5 Developers } 61010506SAli.Saidi@ARM.com format Load { 61110037SARM gem5 Developers 0x08: ldsw({{Rd = (int32_t)Mem;}}, {{32}}); 61210506SAli.Saidi@ARM.com 0x09: ldsb({{Rd = (int8_t)Mem;}}, {{8}}); 61310037SARM gem5 Developers 0x0A: ldsh({{Rd = (int16_t)Mem;}}, {{16}}); 61410506SAli.Saidi@ARM.com 0x0B: ldx({{Rd = (int64_t)Mem;}}, {{64}}); 61510037SARM gem5 Developers 0x0D: ldstub({{ 61610506SAli.Saidi@ARM.com Rd = Mem; 61710037SARM gem5 Developers Mem = 0xFF; 61810506SAli.Saidi@ARM.com }}, {{8}}); 61910037SARM gem5 Developers } 62010506SAli.Saidi@ARM.com 0x0E: Store::stx({{Mem = Rd}}, {{64}}); 62110037SARM gem5 Developers 0x0F: LoadStore::swap({{ 62210506SAli.Saidi@ARM.com uint32_t temp = Rd; 62310037SARM gem5 Developers Rd = Mem; 62410506SAli.Saidi@ARM.com Mem = temp; 62510037SARM gem5 Developers }}, {{32}}); 62610506SAli.Saidi@ARM.com format Load { 62710037SARM gem5 Developers 0x10: lduwa({{Rd = Mem;}}, {{32}}); 62810506SAli.Saidi@ARM.com 0x11: lduba({{Rd = Mem;}}, {{8}}); 62910037SARM gem5 Developers 0x12: lduha({{Rd = Mem;}}, {{16}}); 63010506SAli.Saidi@ARM.com 0x13: ldda({{ 63110037SARM gem5 Developers uint64_t val = Mem; 63210506SAli.Saidi@ARM.com RdLow = val<31:0>; 63310037SARM gem5 Developers RdHigh = val<63:32>; 63410506SAli.Saidi@ARM.com }}, {{64}}); 63510037SARM gem5 Developers } 63610506SAli.Saidi@ARM.com format Store { 63710037SARM gem5 Developers 0x14: stwa({{Mem = Rd;}}, {{32}}); 63810506SAli.Saidi@ARM.com 0x15: stba({{Mem = Rd;}}, {{8}}); 63910037SARM gem5 Developers 0x16: stha({{Mem = Rd;}}, {{16}}); 64010506SAli.Saidi@ARM.com 0x17: stda({{Mem = RdLow<31:0> | RdHigh<31:0> << 32;}}, {{64}}); 64110037SARM gem5 Developers } 64210506SAli.Saidi@ARM.com format Load { 64310037SARM gem5 Developers 0x18: ldswa({{Rd = (int32_t)Mem;}}, {{32}}); 64410506SAli.Saidi@ARM.com 0x19: ldsba({{Rd = (int8_t)Mem;}}, {{8}}); 64510037SARM gem5 Developers 0x1A: ldsha({{Rd = (int16_t)Mem;}}, {{16}}); 64610506SAli.Saidi@ARM.com 0x1B: ldxa({{Rd = (int64_t)Mem;}}, {{64}}); 64710037SARM gem5 Developers } 64810506SAli.Saidi@ARM.com 0x1D: LoadStore::ldstuba({{ 64910037SARM gem5 Developers Rd = Mem; 65010506SAli.Saidi@ARM.com Mem = 0xFF; 65110037SARM gem5 Developers }}, {{8}}); 65210506SAli.Saidi@ARM.com 0x1E: Store::stxa({{Mem = Rd}}, {{64}}); 65310037SARM gem5 Developers 0x1F: LoadStore::swapa({{ 65410506SAli.Saidi@ARM.com uint32_t temp = Rd; 65510037SARM gem5 Developers Rd = Mem; 65610506SAli.Saidi@ARM.com Mem = temp; 65710037SARM gem5 Developers }}, {{32}}); 65810506SAli.Saidi@ARM.com format Trap { 65910037SARM gem5 Developers 0x20: ldf({{fault = new FpDisabled;}}); 66010506SAli.Saidi@ARM.com 0x21: decode X { 66110037SARM gem5 Developers 0x0: Load::ldfsr({{Fsr = Mem<31:0> | Fsr<63:32>;}}, {{32}}); 66210506SAli.Saidi@ARM.com 0x1: Load::ldxfsr({{Fsr = Mem;}}, {{64}}); 66310037SARM gem5 Developers } 66410506SAli.Saidi@ARM.com 0x22: ldqf({{fault = new FpDisabled;}}); 66510037SARM gem5 Developers 0x23: lddf({{fault = new FpDisabled;}}); 66610506SAli.Saidi@ARM.com 0x24: stf({{fault = new FpDisabled;}}); 66710037SARM gem5 Developers 0x25: decode X { 66810506SAli.Saidi@ARM.com 0x0: Store::stfsr({{Mem = Fsr<31:0>;}}, {{32}}); 66910037SARM gem5 Developers 0x1: Store::stxfsr({{Mem = Fsr;}}, {{64}}); 67010506SAli.Saidi@ARM.com } 67110037SARM gem5 Developers 0x26: stqf({{fault = new FpDisabled;}}); 67210506SAli.Saidi@ARM.com 0x27: stdf({{fault = new FpDisabled;}}); 67310037SARM gem5 Developers 0x2D: Nop::prefetch({{ }}); 67410506SAli.Saidi@ARM.com 0x30: ldfa({{return new FpDisabled;}}); 67510037SARM gem5 Developers 0x32: ldqfa({{fault = new FpDisabled;}}); 67610506SAli.Saidi@ARM.com 0x33: lddfa({{fault = new FpDisabled;}}); 67710037SARM gem5 Developers 0x34: stfa({{fault = new FpDisabled;}}); 67810506SAli.Saidi@ARM.com 0x35: stqfa({{fault = new FpDisabled;}}); 67910037SARM gem5 Developers 0x36: stdfa({{fault = new FpDisabled;}}); 68010506SAli.Saidi@ARM.com 0x3C: Cas::casa({{ 68110037SARM gem5 Developers uint64_t val = Mem.uw; 68210506SAli.Saidi@ARM.com if(Rs2.uw == val) 68310037SARM gem5 Developers Mem.uw = Rd.uw; 68410506SAli.Saidi@ARM.com Rd.uw = val; 68510037SARM gem5 Developers }}); 68610506SAli.Saidi@ARM.com 0x3D: Nop::prefetcha({{ }}); 68710037SARM gem5 Developers 0x3E: Cas::casxa({{ 68810506SAli.Saidi@ARM.com uint64_t val = Mem.udw; 68910037SARM gem5 Developers if(Rs2 == val) 69010506SAli.Saidi@ARM.com Mem.udw = Rd; 69110037SARM gem5 Developers Rd = val; 69210506SAli.Saidi@ARM.com }}); 69310037SARM gem5 Developers } 69410506SAli.Saidi@ARM.com } 69510037SARM gem5 Developers} 69610506SAli.Saidi@ARM.com