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