decoder.isa revision 2224
12381SN/A////////////////////////////////////////////////////////////////////
213732Snikos.nikoleris@arm.com//
38949Sandreas.hansson@arm.com// The actual decoder specification
48949Sandreas.hansson@arm.com//
58949Sandreas.hansson@arm.com
68949Sandreas.hansson@arm.comdecode OP default Trap::unknown({{IllegalInstruction}}) {
78949Sandreas.hansson@arm.com
88949Sandreas.hansson@arm.com        0x0: decode OP2 {
98949Sandreas.hansson@arm.com            0x0: Trap::illtrap({{illegal_instruction}});  //ILLTRAP
108949Sandreas.hansson@arm.com            0x1: Branch::bpcc({{
118949Sandreas.hansson@arm.com                switch((CC12 << 1) | CC02)
128949Sandreas.hansson@arm.com                {
138949Sandreas.hansson@arm.com                  case 1:
142592SN/A                  case 3:
1510975Sdavid.hashe@amd.com                    fault = new IllegalInstruction;
162381SN/A                  case 0:
172381SN/A                    if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, COND2))
182381SN/A                        ;//branchHere
192381SN/A                    break;
202381SN/A                  case 2:
212381SN/A                    if(passesCondition(xc->regs.MiscRegs.ccrFields.xcc, COND2))
222381SN/A                        ;//branchHere
232381SN/A                    break;
242381SN/A                }
252381SN/A            }});//BPcc
262381SN/A            0x2: Branch::bicc({{
272381SN/A                if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, COND2))
282381SN/A                    ;//branchHere
292381SN/A            }});//Bicc
302381SN/A            0x3: Branch::bpr({{
312381SN/A                switch(RCOND)
322381SN/A                {
332381SN/A                  case 0:
342381SN/A                  case 4:
352381SN/A                    fault = new IllegalInstruction;
362381SN/A                  case 1:
372381SN/A                    if(Rs1 == 0)
382381SN/A                        ;//branchHere
392381SN/A                    break;
402665Ssaidi@eecs.umich.edu                  case 2:
412665Ssaidi@eecs.umich.edu                    if(Rs1 <= 0)
422665Ssaidi@eecs.umich.edu                        ;//branchHere
432665Ssaidi@eecs.umich.edu                    break;
449031Sandreas.hansson@arm.com                  case 3:
4512349Snikos.nikoleris@arm.com                    if(Rs1 < 0)
462381SN/A                        ;//branchHere
472381SN/A                    break;
482381SN/A                  case 5:
492381SN/A                    if(Rs1 != 0)
502662Sstever@eecs.umich.edu                        ;//branchHere
512381SN/A                    break;
522381SN/A                  case 6:
532381SN/A                    if(Rs1 > 0)
542381SN/A                        ;//branchHere
552381SN/A                    break;
568229Snate@binkert.org                  case 7:
573348Sbinkertn@umich.edu                    if(Rs1 >= 0)
583348Sbinkertn@umich.edu                        ;//branchHere
593348Sbinkertn@umich.edu                    break;
6013856Sodanrc@yahoo.com.br                }
615735Snate@binkert.org                }});    //BPr
624024Sbinkertn@umich.edu                //SETHI (or NOP if rd == 0 and imm == 0)
635735Snate@binkert.org                0x4: IntegerOp::sethi({{Rd = (IMM22 << 10) & 0xFFFFFC00;}});
6412334Sgabeblack@google.com                0x5: Trap::fbpfcc({{throw fp_disabled;}}); //FBPfcc
655314Sstever@gmail.com                0x6: Trap::fbfcc({{throw fp_disabled;}});  //FBfcc
666216Snate@binkert.org        }
6713347Sgabeblack@google.com        0x1: Branch::call({{
682392SN/A                //branch here
694167Sbinkertn@umich.edu                Rd = xc->pc;
702394SN/A        }});
718737Skoansin.tan@gmail.com        0x2: decode OP3 {
723349Sbinkertn@umich.edu            format IntegerOp {
732394SN/A                0x00: add({{
742812Srdreslin@umich.edu                    int64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
7512351Snikos.nikoleris@arm.com                    Rd = Rs1.sdw + val2;
762812Srdreslin@umich.edu                }});//ADD
774022Sstever@eecs.umich.edu                0x01: and({{
784022Sstever@eecs.umich.edu                    uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
795735Snate@binkert.org                    Rd = Rs1.udw & val2;
805735Snate@binkert.org                }});//AND
814022Sstever@eecs.umich.edu                0x02: or({{
825735Snate@binkert.org                    uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
835735Snate@binkert.org                    Rd = Rs1.udw | val2;
845735Snate@binkert.org                }});//OR
854022Sstever@eecs.umich.edu                0x03: xor({{
864022Sstever@eecs.umich.edu                    uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
874022Sstever@eecs.umich.edu                    Rd = Rs1.udw ^ val2;
884022Sstever@eecs.umich.edu                }});//XOR
894473Sstever@eecs.umich.edu                0x04: sub({{
905319Sstever@gmail.com                    int64_t val2 = ~((uint64_t)(I ? SIMM13.sdw : Rs2.udw))+1;
914022Sstever@eecs.umich.edu                    Rd = Rs1.sdw + val2;
924022Sstever@eecs.umich.edu                }});//SUB
9311199Sandreas.hansson@arm.com                0x05: andn({{
9411199Sandreas.hansson@arm.com                    uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
9512344Snikos.nikoleris@arm.com                    Rd = Rs1.udw & ~val2;
9610883Sali.jafri@arm.com                }});//ANDN
974022Sstever@eecs.umich.edu                0x06: orn({{
9813367Syuetsu.kodama@riken.jp                    uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
994022Sstever@eecs.umich.edu                    Rd = Rs1.udw | ~val2;
1004022Sstever@eecs.umich.edu                }});//ORN
1014022Sstever@eecs.umich.edu                0x07: xnor({{
10210886Sandreas.hansson@arm.com                    uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
1034022Sstever@eecs.umich.edu                    Rd = ~(Rs1.udw ^ val2);
1047465Ssteve.reinhardt@amd.com                }});//XNOR
1054628Sstever@eecs.umich.edu                0x08: addc({{
1067465Ssteve.reinhardt@amd.com                    int64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
1077465Ssteve.reinhardt@amd.com                    int64_t carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
1084022Sstever@eecs.umich.edu                    Rd = Rs1.sdw + val2 + carryin;
1094022Sstever@eecs.umich.edu                }});//ADDC
11010885Sandreas.hansson@arm.com                0x09: mulx({{
11110885Sandreas.hansson@arm.com                    int64_t val2 = (I ? SIMM13.sdw : Rs2);
1124626Sstever@eecs.umich.edu                    Rd = Rs1 * val2;
1134626Sstever@eecs.umich.edu                }});//MULX
1147669Ssteve.reinhardt@amd.com                0x0A: umul({{
1154626Sstever@eecs.umich.edu                    uint64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2.udw);
1164040Ssaidi@eecs.umich.edu                    Rd = resTemp = Rs1.udw<31:0> * val2<31:0>;
1174040Ssaidi@eecs.umich.edu                    xc->regs.MiscRegs.yFields.value = resTemp<63:32>;
1185650Sgblack@eecs.umich.edu                }});//UMUL
1195650Sgblack@eecs.umich.edu                0x0B: smul({{
12011256Santhony.gutierrez@amd.com                    int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2.sdw);
12111256Santhony.gutierrez@amd.com                    rd.sdw = resTemp = Rs1.sdw<31:0> * val2<31:0>;
12212347Snikos.nikoleris@arm.com                    xc->regs.MiscRegs.yFields.value = resTemp<63:32>;
12312347Snikos.nikoleris@arm.com                }});//SMUL
12412347Snikos.nikoleris@arm.com                0x0C: subc({{
12512347Snikos.nikoleris@arm.com                    int64_t val2 = ~((int64_t)(I ? SIMM13.sdw : Rs2.sdw))+1;
1264870Sstever@eecs.umich.edu                    int64_t carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
1274870Sstever@eecs.umich.edu                    Rd.sdw = Rs1.sdw + val2 + carryin;
1284870Sstever@eecs.umich.edu                }});//SUBC
1294870Sstever@eecs.umich.edu                0x0D: udivx({{
1304870Sstever@eecs.umich.edu                    uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
1314870Sstever@eecs.umich.edu                    if(val2 == 0) throw division_by_zero;
1328436SBrad.Beckmann@amd.com                    Rd.udw = Rs1.udw / val2;
1338436SBrad.Beckmann@amd.com                }});//UDIVX
1345314Sstever@gmail.com                0x0E: udiv({{
1355314Sstever@gmail.com                    uint32_t resTemp, val2 = (I ? SIMM13.sw : Rs2.udw<31:0>);
1368184Ssomayeh@cs.wisc.edu                    if(val2 == 0)
13710886Sandreas.hansson@arm.com                        fault = new DivisionByZero;
13810886Sandreas.hansson@arm.com                    resTemp = (uint64_t)((xc->regs.MiscRegs.yFields.value << 32)
1394022Sstever@eecs.umich.edu                        | Rs1.udw<31:0>) / val2;
1404022Sstever@eecs.umich.edu                    int32_t overflow = (resTemp<63:32> != 0);
1414022Sstever@eecs.umich.edu                    if(overflow)
1424022Sstever@eecs.umich.edu                        rd.udw = resTemp = 0xFFFFFFFF;
1435735Snate@binkert.org                    else
1445735Snate@binkert.org                        rd.udw = resTemp;
1455735Snate@binkert.org                }});   //UDIV
1464022Sstever@eecs.umich.edu                0x0F: sdiv({{
1474022Sstever@eecs.umich.edu                    int32_t resTemp, val2 = (I ? SIMM13.sw : Rs2.sdw<31:0>);
1484626Sstever@eecs.umich.edu                    if(val2 == 0)
1494626Sstever@eecs.umich.edu                        fault = new DivisionByZero;
1507465Ssteve.reinhardt@amd.com
1514022Sstever@eecs.umich.edu                    Rd.sdw = (int64_t)((xc->regs.MiscRegs.yFields.value << 32) |
15212347Snikos.nikoleris@arm.com                        Rs1.sdw<31:0>) / val2;
15311284Sandreas.hansson@arm.com                    resTemp = Rd.sdw;
1544626Sstever@eecs.umich.edu                    int32_t overflow = (resTemp<63:31> != 0);
1554626Sstever@eecs.umich.edu                    int32_t underflow =
1564626Sstever@eecs.umich.edu                        (resTemp<63:> && resTemp<62:31> != 0xFFFFFFFF);
15711199Sandreas.hansson@arm.com                    if(overflow)
1584022Sstever@eecs.umich.edu                        rd.udw = resTemp = 0x7FFFFFFF;
1594022Sstever@eecs.umich.edu                    else if(underflow)
1606076Sgblack@eecs.umich.edu                        rd.udw = resTemp = 0xFFFFFFFF80000000;
1614626Sstever@eecs.umich.edu                    else
1624870Sstever@eecs.umich.edu                        rd.udw = resTemp;
1635314Sstever@gmail.com                }});//SDIV
1648184Ssomayeh@cs.wisc.edu            }
16511600Sandreas.hansson@arm.com            format IntegerOpCc {
1664022Sstever@eecs.umich.edu                0x10: addcc({{
1674022Sstever@eecs.umich.edu                    int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
1684022Sstever@eecs.umich.edu                    Rd = resTemp = Rs1 + val2;}},
1695735Snate@binkert.org                    {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
1705735Snate@binkert.org                    {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}},
1715735Snate@binkert.org                    {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
1725735Snate@binkert.org                    {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
1735735Snate@binkert.org                    );//ADDcc
1745735Snate@binkert.org                0x11: andcc({{
1755735Snate@binkert.org                    int64_t val2 = (I ? SIMM13.sdw : Rs2);
1764022Sstever@eecs.umich.edu                    Rd = Rs1 & val2;}},
1775735Snate@binkert.org                    {{0}},{{0}},{{0}},{{0}});//ANDcc
1785735Snate@binkert.org                0x12: orcc({{
1794022Sstever@eecs.umich.edu                    int64_t val2 = (I ? SIMM13.sdw : Rs2);
1805735Snate@binkert.org                    Rd = Rs1 | val2;}},
1814022Sstever@eecs.umich.edu                    {{0}},{{0}},{{0}},{{0}});//ORcc
1824022Sstever@eecs.umich.edu                0x13: xorcc({{
1834022Sstever@eecs.umich.edu                    int64_t val2 = (I ? SIMM13.sdw : Rs2);
1845735Snate@binkert.org                    Rd = Rs1 ^ val2;}},
1854022Sstever@eecs.umich.edu                    {{0}},{{0}},{{0}},{{0}});//XORcc
1864022Sstever@eecs.umich.edu                0x14: subcc({{
1874022Sstever@eecs.umich.edu                    int64_t resTemp, val2 = (int64_t)(I ? SIMM13.sdw : Rs2);
1884022Sstever@eecs.umich.edu                    Rd = resTemp = Rs1 - val2;}},
1894022Sstever@eecs.umich.edu                    {{((Rs1 & 0xFFFFFFFF + (~val2) & 0xFFFFFFFF + 1) >> 31)}},
1904022Sstever@eecs.umich.edu                    {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}},
1915735Snate@binkert.org                    {{((Rs1 >> 1) + (~val2) >> 1) +
1925735Snate@binkert.org                        ((Rs1 | ~val2) & 0x1))<63:>}},
1935735Snate@binkert.org                    {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}}
1944022Sstever@eecs.umich.edu                );//SUBcc
1954022Sstever@eecs.umich.edu                0x15: andncc({{
1964022Sstever@eecs.umich.edu                    int64_t val2 = (I ? SIMM13.sdw : Rs2);
1974022Sstever@eecs.umich.edu                    Rd = Rs1 & ~val2;}},
1984022Sstever@eecs.umich.edu                    {{0}},{{0}},{{0}},{{0}});//ANDNcc
19910583SCurtis.Dunham@arm.com                0x16: orncc({{
20010583SCurtis.Dunham@arm.com                    int64_t val2 = (I ? SIMM13.sdw : Rs2);
20110583SCurtis.Dunham@arm.com                    Rd = Rs1 | ~val2;}},
20210583SCurtis.Dunham@arm.com                    {{0}},{{0}},{{0}},{{0}});//ORNcc
20310583SCurtis.Dunham@arm.com                0x17: xnorcc({{
20411284Sandreas.hansson@arm.com                    int64_t val2 = (I ? SIMM13.sdw : Rs2);
20510583SCurtis.Dunham@arm.com                    Rd = ~(Rs1 ^ val2);}},
20610583SCurtis.Dunham@arm.com                    {{0}},{{0}},{{0}},{{0}});//XNORcc
20711199Sandreas.hansson@arm.com                0x18: addccc({{
20812347Snikos.nikoleris@arm.com                    int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
20911600Sandreas.hansson@arm.com                    int64_t carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
21011199Sandreas.hansson@arm.com                    Rd = resTemp = Rs1 + val2 + carryin;}},
21111199Sandreas.hansson@arm.com                    {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31
21211199Sandreas.hansson@arm.com                        + carryin)}},
21311199Sandreas.hansson@arm.com                    {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}},
21411199Sandreas.hansson@arm.com                    {{((Rs1 >> 1) + (val2 >> 1) +
21511199Sandreas.hansson@arm.com                        ((Rs1 & val2) | (carryin & (Rs1 | val2)) & 0x1))<63:>}},
21610570Sandreas.hansson@arm.com                    {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
21710570Sandreas.hansson@arm.com                );//ADDCcc
21810570Sandreas.hansson@arm.com                0x1A: umulcc({{
21910570Sandreas.hansson@arm.com                    uint64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
22010570Sandreas.hansson@arm.com                    Rd = resTemp = Rs1.udw<31:0> * val2<31:0>;
22110570Sandreas.hansson@arm.com                    xc->regs.MiscRegs.yFields.value = resTemp<63:32>;}},
2224022Sstever@eecs.umich.edu                    {{0}},{{0}},{{0}},{{0}});//UMULcc
2236102Sgblack@eecs.umich.edu                        0x1B: smulcc({{
22410343SCurtis.Dunham@arm.com                                int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
22510343SCurtis.Dunham@arm.com                                Rd = resTemp = Rs1.sdw<31:0> * val2<31:0>;
22610343SCurtis.Dunham@arm.com                                xc->regs.MiscRegs.yFields.value = resTemp<63:32>;}}
22710343SCurtis.Dunham@arm.com                        ,{{0}},{{0}},{{0}},{{0}});//SMULcc
2284870Sstever@eecs.umich.edu                        0x1C: subccc({{
2295314Sstever@gmail.com                                int64_t resTemp, val2 = (int64_t)(I ? SIMM13.sdw : Rs2);
2308184Ssomayeh@cs.wisc.edu                                int64_t carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
2314022Sstever@eecs.umich.edu                                Rd = resTemp = Rs1 + ~(val2 + carryin) + 1;}},
23211294Sandreas.hansson@arm.com                                {{((Rs1 & 0xFFFFFFFF + (~(val2 + carryin)) & 0xFFFFFFFF + 1) >> 31)}},
2335735Snate@binkert.org                                {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}},
2345735Snate@binkert.org                                {{((Rs1 >> 1) + (~(val2 + carryin)) >> 1) + ((Rs1 | ~(val2+carryin)) & 0x1))<63:>}},
2354022Sstever@eecs.umich.edu                                {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}}
2364022Sstever@eecs.umich.edu                        );//SUBCcc
2374022Sstever@eecs.umich.edu                        0x1D: udivxcc({{
2385735Snate@binkert.org                                uint64_t val2 = (I ? SIMM13.sdw : Rs2.udw);
2395735Snate@binkert.org                                if(val2 == 0) throw division_by_zero;
2404022Sstever@eecs.umich.edu                                Rd.udw = Rs1.udw / val2;}}
2414022Sstever@eecs.umich.edu                        ,{{0}},{{0}},{{0}},{{0}});//UDIVXcc
2425735Snate@binkert.org                        0x1E: udivcc({{
2435735Snate@binkert.org                                uint32_t resTemp, val2 = (I ? SIMM13.sw : Rs2.udw<31:0>);
2445735Snate@binkert.org                                if(val2 == 0) throw division_by_zero;
2454022Sstever@eecs.umich.edu                                resTemp = (uint64_t)((xc->regs.MiscRegs.yFields.value << 32) | Rs1.udw<31:0>) / val2;
2465735Snate@binkert.org                                int32_t overflow = (resTemp<63:32> != 0);
2475735Snate@binkert.org                                if(overflow) rd.udw = resTemp = 0xFFFFFFFF;
2484022Sstever@eecs.umich.edu                                else rd.udw = resTemp;}},
2494022Sstever@eecs.umich.edu                                {{0}},
2502381SN/A                                {{overflow}},
2512662Sstever@eecs.umich.edu                                {{0}},
2522662Sstever@eecs.umich.edu                                {{0}}
2532662Sstever@eecs.umich.edu                        );//UDIVcc
2542662Sstever@eecs.umich.edu                        0x1F: sdivcc({{
2552662Sstever@eecs.umich.edu                                int32_t resTemp, val2 = (I ? SIMM13.sw : Rs2.sdw<31:0>);
2562381SN/A                                if(val2 == 0) throw division_by_zero;
2579044SAli.Saidi@ARM.com                                Rd.sdw = resTemp = (int64_t)((xc->regs.MiscRegs.yFields.value << 32) | Rs1.sdw<31:0>) / val2;
2582381SN/A                                int32_t overflow = (resTemp<63:31> != 0);
2592813Srdreslin@umich.edu                                int32_t underflow = (resTemp<63:> && resTemp<62:31> != 0xFFFFFFFF);
2605735Snate@binkert.org                                if(overflow) rd.udw = resTemp = 0x7FFFFFFF;
2615735Snate@binkert.org                                else if(underflow) rd.udw = resTemp = 0xFFFFFFFF80000000;
2624022Sstever@eecs.umich.edu                                else rd.udw = resTemp;}},
2635735Snate@binkert.org                                {{0}},
2645735Snate@binkert.org                                {{overflow || underflow}},
26510938Sandreas.hansson@arm.com                                {{0}},
26610938Sandreas.hansson@arm.com                                {{0}}
26712349Snikos.nikoleris@arm.com                        );//SDIVcc
26810938Sandreas.hansson@arm.com                        0x20: taddcc({{
26913732Snikos.nikoleris@arm.com                                int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
27013732Snikos.nikoleris@arm.com                                Rd = resTemp = Rs1 + val2;
27113732Snikos.nikoleris@arm.com                                int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}},
27211284Sandreas.hansson@arm.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
27311284Sandreas.hansson@arm.com                                {{overflow}},
27411284Sandreas.hansson@arm.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
27511284Sandreas.hansson@arm.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
27610938Sandreas.hansson@arm.com                        );//TADDcc
27710938Sandreas.hansson@arm.com                        0x21: tsubcc({{
27810938Sandreas.hansson@arm.com                                int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
27911284Sandreas.hansson@arm.com                                Rd = resTemp = Rs1 + val2;
28011284Sandreas.hansson@arm.com                                int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}},
28111284Sandreas.hansson@arm.com                                {{(Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
28211284Sandreas.hansson@arm.com                                {{overflow}},
28311284Sandreas.hansson@arm.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
28411284Sandreas.hansson@arm.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
28511284Sandreas.hansson@arm.com                        );//TSUBcc
28611284Sandreas.hansson@arm.com                        0x22: taddcctv({{
28711284Sandreas.hansson@arm.com                                int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
28810938Sandreas.hansson@arm.com                                Rd = resTemp = Rs1 + val2;
28912346Snikos.nikoleris@arm.com                                int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);
29012346Snikos.nikoleris@arm.com                                if(overflow) throw tag_overflow;}},
29112346Snikos.nikoleris@arm.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
29212346Snikos.nikoleris@arm.com                                {{overflow}},
29312349Snikos.nikoleris@arm.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
29412349Snikos.nikoleris@arm.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
29512349Snikos.nikoleris@arm.com                        );//TADDccTV
29612349Snikos.nikoleris@arm.com                        0x23: tsubcctv({{
29711057Sandreas.hansson@arm.com                                int64_t resTemp, val2 = (I ? SIMM13.sdw : Rs2);
29811057Sandreas.hansson@arm.com                                Rd = resTemp = Rs1 + val2;
29911057Sandreas.hansson@arm.com                                int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);
30011057Sandreas.hansson@arm.com                                if(overflow) throw tag_overflow;}},
30110938Sandreas.hansson@arm.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
30210938Sandreas.hansson@arm.com                                {{overflow}},
30310938Sandreas.hansson@arm.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
30410938Sandreas.hansson@arm.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
30510938Sandreas.hansson@arm.com                        );//TSUBccTV
30610938Sandreas.hansson@arm.com                        0x24: mulscc({{
30710938Sandreas.hansson@arm.com                                int64_t resTemp, multiplicand = (I ? SIMM13.sdw : Rs2);
30810938Sandreas.hansson@arm.com                                int32_t multiplier = Rs1<31:0>;
30910938Sandreas.hansson@arm.com                                int32_t savedLSB = Rs1<0:>;
31010938Sandreas.hansson@arm.com                                multiplier = multipler<31:1> |
31110938Sandreas.hansson@arm.com                                        ((xc->regs.MiscRegs.ccrFields.iccFields.n
31210938Sandreas.hansson@arm.com                                        ^ xc->regs.MiscRegs.ccrFields.iccFields.v) << 32);
31310938Sandreas.hansson@arm.com                                if(!xc->regs.MiscRegs.yFields.value<0:>)
31410938Sandreas.hansson@arm.com                                        multiplicand = 0;
31510938Sandreas.hansson@arm.com                                Rd = resTemp = multiplicand + multiplier;
31610938Sandreas.hansson@arm.com                                xc->regs.MiscRegs.yFields.value = xc->regs.MiscRegs.yFields.value<31:1> | (savedLSB << 31);}},
3175735Snate@binkert.org                                {{((multiplicand & 0xFFFFFFFF + multiplier & 0xFFFFFFFF) >> 31)}},
3185735Snate@binkert.org                                {{multiplicand<31:> == multiplier<31:> && multiplier<31:> != resTemp<31:>}},
3195735Snate@binkert.org                                {{((multiplicand >> 1) + (multiplier >> 1) + (multiplicand & multiplier & 0x1))<63:>}},
3205735Snate@binkert.org                                {{multiplicand<63:> == multiplier<63:> && multiplier<63:> != resTemp<63:>}}
3214022Sstever@eecs.umich.edu                        );//MULScc
3224022Sstever@eecs.umich.edu                }
3235735Snate@binkert.org                format IntegerOp
3244870Sstever@eecs.umich.edu                {
3254870Sstever@eecs.umich.edu                        0x25: decode X {
32612351Snikos.nikoleris@arm.com                                0x0: sll({{Rd = Rs1 << (I ? SHCNT32 : Rs2<4:0>);}}); //SLL
32712351Snikos.nikoleris@arm.com                                0x1: sllx({{Rd = Rs1 << (I ? SHCNT64 : Rs2<5:0>);}}); //SLLX
3285735Snate@binkert.org                        }
32912749Sgiacomo.travaglini@arm.com                        0x26: decode X {
3304870Sstever@eecs.umich.edu                                0x0: srl({{Rd = Rs1.udw<31:0> >> (I ? SHCNT32 : Rs2<4:0>);}}); //SRL
3312566SN/A                                0x1: srlx({{Rd = Rs1.udw >> (I ? SHCNT64 : Rs2<5:0>);}});//SRLX
3325735Snate@binkert.org                        }
33312633Sodanrc@yahoo.com.br                        0x27: decode X {
33412633Sodanrc@yahoo.com.br                                0x0: sra({{Rd = Rs1.sdw<31:0> >> (I ? SHCNT32 : Rs2<4:0>);}}); //SRA
3355735Snate@binkert.org                                0x1: srax({{Rd = Rs1.sdw >> (I ? SHCNT64 : Rs2<5:0>);}});//SRAX
33612633Sodanrc@yahoo.com.br                        }
3375735Snate@binkert.org                        0x28: decode RS1 {
3382566SN/A                                0x0: rdy({{Rd = xc->regs.MiscRegs.yFields.value;}}); //RDY
3392566SN/A                                0x2: rdccr({{Rd = xc->regs.MiscRegs.ccr;}}); //RDCCR
3402566SN/A                                0x3: rdasi({{Rd = xc->regs.MiscRegs.asi;}}); //RDASI
3415735Snate@binkert.org                                0x4: rdtick({{
3425735Snate@binkert.org                                        if(xc->regs.MiscRegs.pstateFields.priv == 0 &&
3432381SN/A                                                xc->regs.MiscRegs.tickFields.npt == 1)
3442381SN/A                                                throw privileged_action;
34510028SGiacomo.Gabrielli@arm.com                                        Rd = xc->regs.MiscRegs.tick;
34610028SGiacomo.Gabrielli@arm.com                                }});//RDTICK
34710028SGiacomo.Gabrielli@arm.com                                0x5: rdpc({{Rd = xc->regs.pc;}}); //RDPC
3485735Snate@binkert.org                                0x6: rdfprs({{Rd = xc->regs.MiscRegs.fprs;}}); //RDFPRS
3496227Snate@binkert.org                                0xF: decode I {
3502381SN/A                                        0x0: Noop::membar({{//Membar isn't needed yet}}); //MEMBAR
3515735Snate@binkert.org                                        0x1: Noop::stbar({{//Stbar isn/'t needed yet}}); //STBAR
35210723Sandreas.hansson@arm.com                                }
3538668Sgeoffrey.blake@arm.com                        }
35410723Sandreas.hansson@arm.com
3558668Sgeoffrey.blake@arm.com                        0x2A: decode RS1 {
35612966SMatteo.Andreozzi@arm.com                                0x0: rdprtpc({{checkPriv Rd = xc->regs.MiscRegs.tpc[xc->regs.MiscRegs.tl];}});
35712966SMatteo.Andreozzi@arm.com                                0x1: rdprtnpc({{checkPriv Rd = xc->regs.MiscRegs.tnpc[xc->regs.MiscRegs.tl];}});
35812966SMatteo.Andreozzi@arm.com                                0x2: rdprtstate({{checkPriv Rd = xc->regs.MiscRegs.tstate[xc->regs.MiscRegs.tl];}});
3592641Sstever@eecs.umich.edu                                0x3: rdprtt({{checkPriv Rd = xc->regs.MiscRegs.tt[xc->regs.MiscRegs.tl];}});
3602811Srdreslin@umich.edu                                0x4: rdprtick({{checkPriv Rd = xc->regs.MiscRegs.tick;}});
3619547Sandreas.hansson@arm.com                                0x5: rdprtba({{checkPriv Rd = xc->regs.MiscRegs.tba;}});
36210694SMarco.Balboni@ARM.com                                0x6: rdprpstate({{checkPriv Rd = xc->regs.MiscRegs.pstate;}});
36310405Sandreas.hansson@arm.com                                0x7: rdprtl({{checkPriv Rd = xc->regs.MiscRegs.tl;}});
36410405Sandreas.hansson@arm.com                                0x8: rdprpil({{checkPriv Rd = xc->regs.MiscRegs.pil;}});
36510405Sandreas.hansson@arm.com                                0x9: rdprcwp({{checkPriv Rd = xc->regs.MiscRegs.cwp;}});
36610405Sandreas.hansson@arm.com                                0xA: rdprcansave({{checkPriv Rd = xc->regs.MiscRegs.cansave;}});
3679547Sandreas.hansson@arm.com                                0xB: rdprcanrestore({{checkPriv Rd = xc->regs.MiscRegs.canrestore;}});
36810694SMarco.Balboni@ARM.com                                0xC: rdprcleanwin({{checkPriv Rd = xc->regs.MiscRegs.cleanwin;}});
3693218Sgblack@eecs.umich.edu                                0xD: rdprotherwin({{checkPriv Rd = xc->regs.MiscRegs.otherwin;}});
3709547Sandreas.hansson@arm.com                                0xE: rdprwstate({{checkPriv Rd = xc->regs.MiscRegs.wstate;}});
37111127Sandreas.hansson@arm.com                                0xF: rdprfq({{throw illegal_instruction;}}); //The floating point queue isn't implemented right now.
37211127Sandreas.hansson@arm.com                        }
37311127Sandreas.hansson@arm.com                        0x2B: BasicOperate::flushw({{\\window toilet}}); //FLUSHW
37411127Sandreas.hansson@arm.com                        0x2C: movcc({{
37511127Sandreas.hansson@arm.com                                ccBank = (CC24 << 2) | (CC14 << 1) | (CC04 << 0);
37611127Sandreas.hansson@arm.com                                switch(ccBank)
37711127Sandreas.hansson@arm.com                                {
37811127Sandreas.hansson@arm.com                                        case 0: case 1: case 2: case 3:
37910694SMarco.Balboni@ARM.com                                                throw fp_disabled;
38010694SMarco.Balboni@ARM.com                                        break;
38110694SMarco.Balboni@ARM.com                                        case 5: case 7:
38210694SMarco.Balboni@ARM.com                                                throw illegal_instruction;
38310405Sandreas.hansson@arm.com                                        break;
38410405Sandreas.hansson@arm.com                                        case 4:
3859547Sandreas.hansson@arm.com                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, COND4))
38610694SMarco.Balboni@ARM.com                                                        Rd = (I ? SIMM11.sdw : RS2);
3873218Sgblack@eecs.umich.edu                                        break;
3885735Snate@binkert.org                                        case 6:
3895735Snate@binkert.org                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.xcc, COND4))
39013892Sgabeblack@google.com                                                        Rd = (I ? SIMM11.sdw : RS2);
3919542Sandreas.hansson@arm.com                                        break;
39213892Sgabeblack@google.com                                }
3939542Sandreas.hansson@arm.com                        }});//MOVcc
3949542Sandreas.hansson@arm.com                        0x2D: sdivx({{
3959542Sandreas.hansson@arm.com                                int64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
3969542Sandreas.hansson@arm.com                                if(val2 == 0) throw division_by_zero;
39713892Sgabeblack@google.com                                Rd.sdw = Rs1.sdw / val2;
3989542Sandreas.hansson@arm.com                        }});//SDIVX
39913892Sgabeblack@google.com                        0x2E: decode RS1 {
4009542Sandreas.hansson@arm.com                                0x0: IntegerOp::popc({{
4019542Sandreas.hansson@arm.com                                int64_t count = 0, val2 = (I ? SIMM13.sdw : Rs2.sdw);
4029542Sandreas.hansson@arm.com                                uint8_t oneBits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}
4039542Sandreas.hansson@arm.com                                for(unsigned int x = 0; x < 16; x++)
4045735Snate@binkert.org                                {
4055735Snate@binkert.org                                        count += oneBits[val2 & 0xF];
4065735Snate@binkert.org                                        val2 >> 4;
4079542Sandreas.hansson@arm.com                                }
4089542Sandreas.hansson@arm.com                                }});//POPC
4092641Sstever@eecs.umich.edu                        }
4102641Sstever@eecs.umich.edu                        0x2F: movr({{
4112641Sstever@eecs.umich.edu                                uint64_t val2 = (I ? SIMM10.sdw : Rs2.sdw);
4125315Sstever@gmail.com                                switch(RCOND)
4135315Sstever@gmail.com                                {
4145315Sstever@gmail.com                                        case 0: case 4:
4155315Sstever@gmail.com                                                throw illegal_instruction;
4169044SAli.Saidi@ARM.com                                        break;
4175735Snate@binkert.org                                        case 1:
4185735Snate@binkert.org                                                if(Rs1 == 0) Rd = val2;
4195735Snate@binkert.org                                        break;
4205735Snate@binkert.org                                        case 2:
4215735Snate@binkert.org                                                if(Rs1 <= 0) Rd = val2;
4225735Snate@binkert.org                                        break;
4235735Snate@binkert.org                                        case 3:
4245314Sstever@gmail.com                                                if(Rs1 = 0) Rd = val2;
4255314Sstever@gmail.com                                        break;
4265314Sstever@gmail.com                                        case 5:
4275735Snate@binkert.org                                                if(Rs1 != 0) Rd = val2;
4285314Sstever@gmail.com                                        break;
4295314Sstever@gmail.com                                        case 6:
4305314Sstever@gmail.com                                                if(Rs1 > 0) Rd = val2;
4315314Sstever@gmail.com                                        break;
4325314Sstever@gmail.com                                        case 7:
4335314Sstever@gmail.com                                                if(Rs1 >= 0) Rd = val2;
4345314Sstever@gmail.com                                        break;
4355314Sstever@gmail.com                                }
4365314Sstever@gmail.com                        }});//MOVR
4375314Sstever@gmail.com                        0x30: decode RD {
4385314Sstever@gmail.com                                0x0: wry({{
4395314Sstever@gmail.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4405314Sstever@gmail.com                                        xc->regs.MiscRegs.y = Rs1 ^ val2;
4415314Sstever@gmail.com                                }});//WRY
4425735Snate@binkert.org                                0x2: wrccr({{
4435735Snate@binkert.org                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4445735Snate@binkert.org                                        xc->regs.MiscRegs.ccr = Rs1 ^ val2;
4455314Sstever@gmail.com                                }});//WRCCR
4465315Sstever@gmail.com                                0x3: wrasi({{
4475735Snate@binkert.org                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4485735Snate@binkert.org                                        xc->regs.MiscRegs.asi = Rs1 ^ val2;
4495315Sstever@gmail.com                                }});//WRASI
4505735Snate@binkert.org                                0x6: wrfprs({{
4515735Snate@binkert.org                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4525314Sstever@gmail.com                                        xc->regs.MiscRegs.asi = Rs1 ^ val2;
4535314Sstever@gmail.com                                }});//WRFPRS
4545735Snate@binkert.org                                0xF: Trap::sir({{software_initiated_reset}}); //SIR
4555735Snate@binkert.org                        }
4565735Snate@binkert.org                        0x31: decode FCN {
4575735Snate@binkert.org                                0x0: BasicOperate::saved({{\\Boogy Boogy}}); //SAVED
4585314Sstever@gmail.com                                0x1: BasicOperate::restored({{\\Boogy Boogy}}); //RESTORED
4595735Snate@binkert.org                        }
4605735Snate@binkert.org                        0x32: decode RD {
4615735Snate@binkert.org                                0x0: wrprtpc({{checkPriv
4625315Sstever@gmail.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4635735Snate@binkert.org                                        xc->regs.MiscRegs.tpc[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
4645735Snate@binkert.org                                }});
4655314Sstever@gmail.com                                0x1: wrprtnpc({{checkPriv
4665735Snate@binkert.org                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4675735Snate@binkert.org                                        xc->regs.MiscRegs.tnpc[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
4685735Snate@binkert.org                                }});
4695735Snate@binkert.org                                0x2: wrprtstate({{checkPriv
4705735Snate@binkert.org                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4715314Sstever@gmail.com                                        xc->regs.MiscRegs.tstate[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
4725314Sstever@gmail.com                                }});
4735314Sstever@gmail.com                                0x3: wrprtt({{checkPriv
4745735Snate@binkert.org                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4755735Snate@binkert.org                                        xc->regs.MiscRegs.tt[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
4765735Snate@binkert.org                                }});
4775735Snate@binkert.org                                0x4: wrprtick({{checkPriv
4789542Sandreas.hansson@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4795735Snate@binkert.org                                        xc->regs.MiscRegs.tick = Rs1 ^ val2;
4805735Snate@binkert.org                                }});
4815735Snate@binkert.org                                0x5: wrprtba({{checkPriv
4822662Sstever@eecs.umich.edu                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4832641Sstever@eecs.umich.edu                                        xc->regs.MiscRegs.tba = Rs1 ^ val2;
4849542Sandreas.hansson@arm.com                                }});
4859542Sandreas.hansson@arm.com                                0x6: wrprpstate({{checkPriv
4869542Sandreas.hansson@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4879542Sandreas.hansson@arm.com                                        xc->regs.MiscRegs.pstate = Rs1 ^ val2;
4889542Sandreas.hansson@arm.com                                }});
4899542Sandreas.hansson@arm.com                                0x7: wrprtl({{checkPriv
4909542Sandreas.hansson@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4919542Sandreas.hansson@arm.com                                        xc->regs.MiscRegs.tl = Rs1 ^ val2;
4929542Sandreas.hansson@arm.com                                }});
4939542Sandreas.hansson@arm.com                                0x8: wrprpil({{checkPriv
4949542Sandreas.hansson@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4959542Sandreas.hansson@arm.com                                        xc->regs.MiscRegs.pil = Rs1 ^ val2;
4969542Sandreas.hansson@arm.com                                }});
4979542Sandreas.hansson@arm.com                                0x9: wrprcwp({{checkPriv
4989542Sandreas.hansson@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
4999542Sandreas.hansson@arm.com                                        xc->regs.MiscRegs.cwp = Rs1 ^ val2;
5009542Sandreas.hansson@arm.com                                }});
5019542Sandreas.hansson@arm.com                                0xA: wrprcansave({{checkPriv
5029542Sandreas.hansson@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
5039542Sandreas.hansson@arm.com                                        xc->regs.MiscRegs.cansave = Rs1 ^ val2;
5049543Ssascha.bischoff@arm.com                                }});
5059543Ssascha.bischoff@arm.com                                0xB: wrprcanrestore({{checkPriv
5069543Ssascha.bischoff@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
5079543Ssascha.bischoff@arm.com                                        xc->regs.MiscRegs.canrestore = Rs1 ^ val2;
5089543Ssascha.bischoff@arm.com                                }});
5099543Ssascha.bischoff@arm.com                                0xC: wrprcleanwin({{checkPriv
5109543Ssascha.bischoff@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
5119543Ssascha.bischoff@arm.com                                        xc->regs.MiscRegs.cleanwin = Rs1 ^ val2;
5129543Ssascha.bischoff@arm.com                                }});
5139543Ssascha.bischoff@arm.com                                0xD: wrprotherwin({{checkPriv
5149543Ssascha.bischoff@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
5159543Ssascha.bischoff@arm.com                                        xc->regs.MiscRegs.otherwin = Rs1 ^ val2;
5169543Ssascha.bischoff@arm.com                                }});
5179543Ssascha.bischoff@arm.com                                0xE: wrprwstate({{checkPriv
5189543Ssascha.bischoff@arm.com                                        uint64_t val2 = (I ? SIMM13.sdw : Rs2.sdw);
5199543Ssascha.bischoff@arm.com                                        xc->regs.MiscRegs.wstate = Rs1 ^ val2;
5209543Ssascha.bischoff@arm.com                                }});
5219543Ssascha.bischoff@arm.com                        }
5229543Ssascha.bischoff@arm.com
5235735Snate@binkert.org                        0x34: Trap::fpop1({{Throw fp_disabled;}}); //FPOP1
5245735Snate@binkert.org                        0x35: Trap::fpop2({{Throw fp_disabled;}}); //FPOP2
5254022Sstever@eecs.umich.edu
5262811Srdreslin@umich.edu
5275735Snate@binkert.org                        0x38: Branch::jmpl({{//Stuff}}); //JMPL
5284022Sstever@eecs.umich.edu                        0x39: Branch::return({{//Other Stuff}}); //RETURN
5292811Srdreslin@umich.edu                        0x3A: Trap::tcc({{
53010583SCurtis.Dunham@arm.com                                switch((CC14 << 1) | (CC04 << 0))
53110583SCurtis.Dunham@arm.com                                {
53210583SCurtis.Dunham@arm.com                                        case 1: case 3:
53310583SCurtis.Dunham@arm.com                                                throw illegal_instruction;
53410583SCurtis.Dunham@arm.com                                        case 0:
53511287Sandreas.hansson@arm.com                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, machInst<25:28>))
53611287Sandreas.hansson@arm.com                                                        throw trap_instruction;
53711287Sandreas.hansson@arm.com                                        break;
53811287Sandreas.hansson@arm.com                                        case 2:
53911287Sandreas.hansson@arm.com                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.xcc, machInst<25:28>))
54011287Sandreas.hansson@arm.com                                                        throw trap_instruction;
54111287Sandreas.hansson@arm.com                                        break;
54211287Sandreas.hansson@arm.com                                }
54311287Sandreas.hansson@arm.com                        }}); //Tcc
54410583SCurtis.Dunham@arm.com                        0x3B: BasicOperate::flush({{//Lala}}); //FLUSH
54510583SCurtis.Dunham@arm.com                        0x3C: BasicOperate::save({{//leprechauns); //SAVE
54611199Sandreas.hansson@arm.com                        0x3D: BasicOperate::restore({{//Eat my short int}}); //RESTORE
54712347Snikos.nikoleris@arm.com                        0x3E: decode FCN {
54811600Sandreas.hansson@arm.com                                0x1: BasicOperate::done({{//Done thing}}); //DONE
54911199Sandreas.hansson@arm.com                                0x2: BasicOperate::retry({{//Retry thing}}); //RETRY
55010583SCurtis.Dunham@arm.com                        }
55111286Sandreas.hansson@arm.com                }
55211286Sandreas.hansson@arm.com        }
55311286Sandreas.hansson@arm.com        0x3: decode OP3 {
55411286Sandreas.hansson@arm.com                format Mem {
55511286Sandreas.hansson@arm.com                        0x00: lduw({{Rd.uw = Mem.uw;}}); //LDUW
55610583SCurtis.Dunham@arm.com                        0x01: ldub({{Rd.ub = Mem.ub;}}); //LDUB
55710583SCurtis.Dunham@arm.com                        0x02: lduh({{Rd.uhw = Mem.uhw;}}); //LDUH
55810583SCurtis.Dunham@arm.com                        0x03: ldd({{
55910583SCurtis.Dunham@arm.com                                uint64_t val = Mem.udw;
5602812Srdreslin@umich.edu                                setIntReg(RD & (~1), val<31:0>);
56113350Snikos.nikoleris@arm.com                                setIntReg(RD | 1, val<63:32>);
56213350Snikos.nikoleris@arm.com                        }});//LDD
56313350Snikos.nikoleris@arm.com                        0x04: stw({{Mem.sw = Rd.sw;}}); //STW
56413350Snikos.nikoleris@arm.com                        0x05: stb({{Mem.sb = Rd.sb;}}); //STB
56513350Snikos.nikoleris@arm.com                        0x06: sth({{Mem.shw = Rd.shw;}}); //STH
56613350Snikos.nikoleris@arm.com                        0x07: std({{
56711284Sandreas.hansson@arm.com                                Mem.udw = readIntReg(RD & (~1))<31:0> | (readIntReg(RD | 1)<31:0> << 32);
56811284Sandreas.hansson@arm.com                        }});//STD
56911284Sandreas.hansson@arm.com                        0x08: ldsw({{Rd.sw = Mem.sw;}}); //LDSW
57011284Sandreas.hansson@arm.com                        0x09: ldsb({{Rd.sb = Mem.sb;}}); //LDSB
57111284Sandreas.hansson@arm.com                        0x0A: ldsh({{Rd.shw = Mem.shw;}}); //LDSH
57211284Sandreas.hansson@arm.com                        0x0B: ldx({{Rd.udw = Mem.udw;}}); //LDX
57311284Sandreas.hansson@arm.com
57411284Sandreas.hansson@arm.com                        0x0D: ldstub({{
57511284Sandreas.hansson@arm.com                                Rd.ub = Mem.ub;
57611284Sandreas.hansson@arm.com                                Mem.ub = 0xFF;
57711284Sandreas.hansson@arm.com                        }}); //LDSTUB
57811284Sandreas.hansson@arm.com                        0x0E: stx({{Rd.udw = Mem.udw;}}); //STX
57911284Sandreas.hansson@arm.com                        0x0F: swap({{
58011284Sandreas.hansson@arm.com                                uint32_t temp = Rd.uw;
58111284Sandreas.hansson@arm.com                                Rd.uw = Mem.uw;
58211284Sandreas.hansson@arm.com                                Mem.uw = temp;
58311284Sandreas.hansson@arm.com                        }}); //SWAP
58411284Sandreas.hansson@arm.com                        0x10: lduwa({{Rd.uw = Mem.uw;}}); //LDUWA
58511284Sandreas.hansson@arm.com                        0x11: lduba({{Rd.ub = Mem.ub;}}); //LDUBA
58611284Sandreas.hansson@arm.com                        0x12: lduha({{Rd.uhw = Mem.uhw;}}); //LDUHA
58711284Sandreas.hansson@arm.com                        0x13: ldda({{
58810567Sandreas.hansson@arm.com                                uint64_t val = Mem.udw;
58910567Sandreas.hansson@arm.com                                setIntReg(RD & (~1), val<31:0>);
59011284Sandreas.hansson@arm.com                                setIntReg(RD | 1, val<63:32>);
59111284Sandreas.hansson@arm.com                        }}); //LDDA
59210567Sandreas.hansson@arm.com                        0x14: stwa({{Mem.uw = Rd.uw;}}); //STWA
59311284Sandreas.hansson@arm.com                        0x15: stba({{Mem.ub = Rd.ub;}}); //STBA
59411284Sandreas.hansson@arm.com                        0x16: stha({{Mem.uhw = Rd.uhw;}}); //STHA
59511284Sandreas.hansson@arm.com                        0x17: stda({{
59611284Sandreas.hansson@arm.com                                Mem.udw = readIntReg(RD & (~1))<31:0> | (readIntReg(RD | 1)<31:0> << 32);
59711284Sandreas.hansson@arm.com                        }}); //STDA
59811284Sandreas.hansson@arm.com                        0x18: ldswa({{Rd.sw = Mem.sw;}}); //LDSWA
59911284Sandreas.hansson@arm.com                        0x19: ldsba({{Rd.sb = Mem.sb;}}); //LDSBA
60011284Sandreas.hansson@arm.com                        0x1A: ldsha({{Rd.shw = Mem.shw;}}); //LDSHA
60111284Sandreas.hansson@arm.com                        0x1B: ldxa({{Rd.sdw = Mem.sdw;}}); //LDXA
60211284Sandreas.hansson@arm.com
60311284Sandreas.hansson@arm.com                        0x1D: ldstuba({{
60411284Sandreas.hansson@arm.com                                Rd.ub = Mem.ub;
60511284Sandreas.hansson@arm.com                                Mem.ub = 0xFF;
60611284Sandreas.hansson@arm.com                        }}); //LDSTUBA
60711284Sandreas.hansson@arm.com                        0x1E: stxa({{Mem.sdw = Rd.sdw}}); //STXA
60811284Sandreas.hansson@arm.com                        0x1F: swapa({{
60911284Sandreas.hansson@arm.com                                uint32_t temp = Rd.uw;
61011284Sandreas.hansson@arm.com                                Rd.uw = Mem.uw;
61111284Sandreas.hansson@arm.com                                Mem.uw = temp;
61211284Sandreas.hansson@arm.com                        }}); //SWAPA
61311284Sandreas.hansson@arm.com                        0x20: Trap::ldf({{throw fp_disabled;}}); //LDF
61411284Sandreas.hansson@arm.com                        0x21: decode X {
61511284Sandreas.hansson@arm.com                                0x0: Trap::ldfsr({{throw fp_disabled;}}); //LDFSR
61611284Sandreas.hansson@arm.com                                0x1: Trap::ldxfsr({{throw fp_disabled;}}); //LDXFSR
61711284Sandreas.hansson@arm.com                        }
61811284Sandreas.hansson@arm.com                        0x22: Trap::ldqf({{throw fp_disabled;}}); //LDQF
61911284Sandreas.hansson@arm.com                        0x23: Trap::lddf({{throw fp_disabled;}}); //LDDF
62011284Sandreas.hansson@arm.com                        0x24: Trap::stf({{throw fp_disabled;}}); //STF
62111284Sandreas.hansson@arm.com                        0x25: decode X {
6224870Sstever@eecs.umich.edu                                0x0: Trap::stfsr({{throw fp_disabled;}}); //STFSR
62311284Sandreas.hansson@arm.com                                0x1: Trap::stxfsr({{throw fp_disabled;}}); //STXFSR
62411284Sandreas.hansson@arm.com                        }
62511284Sandreas.hansson@arm.com                        0x26: Trap::stqf({{throw fp_disabled;}}); //STQF
62611284Sandreas.hansson@arm.com                        0x27: Trap::stdf({{throw fp_disabled;}}); //STDF
62711284Sandreas.hansson@arm.com
62811284Sandreas.hansson@arm.com
62911284Sandreas.hansson@arm.com
63011284Sandreas.hansson@arm.com
63111284Sandreas.hansson@arm.com
63211284Sandreas.hansson@arm.com                        0x2D: Noop::prefetch({{ }}); //PREFETCH
63311284Sandreas.hansson@arm.com
63411284Sandreas.hansson@arm.com
63511284Sandreas.hansson@arm.com                        0x30: Trap::ldfa({{throw fp_disabled;}}); //LDFA
63611284Sandreas.hansson@arm.com
63711284Sandreas.hansson@arm.com                        0x32: Trap::ldqfa({{throw fp_disabled;}}); //LDQFA
63811284Sandreas.hansson@arm.com                        0x33: Trap::lddfa({{throw fp_disabled;}}); //LDDFA
63911284Sandreas.hansson@arm.com                        0x34: Trap::stfa({{throw fp_disabled;}}); //STFA
64011284Sandreas.hansson@arm.com                        0x35: Trap::stqfa({{throw fp_disabled;}}); //STQFA
64111284Sandreas.hansson@arm.com                        0x36: Trap::stdfa({{throw fp_disabled;}}); //STDFA
64211284Sandreas.hansson@arm.com
64311284Sandreas.hansson@arm.com
64411284Sandreas.hansson@arm.com
64511284Sandreas.hansson@arm.com
64611284Sandreas.hansson@arm.com
64711284Sandreas.hansson@arm.com                        0x3C: Cas::casa(
64811284Sandreas.hansson@arm.com                                {{uint64_t val = Mem.uw;
64911284Sandreas.hansson@arm.com                                if(Rs2.uw == val)
65011746Snikos.nikoleris@arm.com                                        Mem.uw = Rd.uw;
65111284Sandreas.hansson@arm.com                                Rd.uw = val;
65211284Sandreas.hansson@arm.com                        }}); //CASA
65311284Sandreas.hansson@arm.com                        0x3D: Noop::prefetcha({{ }}); //PREFETCHA
65411284Sandreas.hansson@arm.com                        0x3E: Cas::casxa(
65511284Sandreas.hansson@arm.com                                {{uint64_t val = Mem.udw;
65612346Snikos.nikoleris@arm.com                                if(Rs2 == val)
65713732Snikos.nikoleris@arm.com                                        Mem.udw = Rd;
65813732Snikos.nikoleris@arm.com                                Rd = val;
65913732Snikos.nikoleris@arm.com                        }}); //CASXA
66013732Snikos.nikoleris@arm.com                }
66113732Snikos.nikoleris@arm.com        }
66213732Snikos.nikoleris@arm.com}
66313732Snikos.nikoleris@arm.com