decoder.isa revision 2022
18150SN/A////////////////////////////////////////////////////////////////////
28150SN/A//
311957Sgabeblack@google.com// The actual decoder specification
411957Sgabeblack@google.com//
511957Sgabeblack@google.com
611957Sgabeblack@google.comdecode OP default Trap::unknown({{illegal_instruction}}) {
711957Sgabeblack@google.com
811957Sgabeblack@google.com        0x0: decode OP2 {
911957Sgabeblack@google.com                0x0: Trap::illtrap({{illegal_instruction}});  //ILLTRAP
1011957Sgabeblack@google.com                0x1: Branch::bpcc({{
1111957Sgabeblack@google.com                        switch((CC12 << 1) | CC02)
1211957Sgabeblack@google.com                        {
1311957Sgabeblack@google.com                                case 1: case 3:
1411957Sgabeblack@google.com                                        throw illegal_instruction;
1511957Sgabeblack@google.com                                case 0:
1611957Sgabeblack@google.com                                        if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, COND2))
1711957Sgabeblack@google.com                                                ;//branchHere
1811957Sgabeblack@google.com                                break;
1911957Sgabeblack@google.com                                case 2:
2011957Sgabeblack@google.com                                        if(passesCondition(xc->regs.MiscRegs.ccrFields.xcc, COND2))
2111957Sgabeblack@google.com                                                ;//branchHere
2211957Sgabeblack@google.com                                break;
2311957Sgabeblack@google.com                        }
2411957Sgabeblack@google.com                }});//BPcc
2511957Sgabeblack@google.com                0x2: Branch::bicc({{
2611957Sgabeblack@google.com                        if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, COND2))
2711957Sgabeblack@google.com                                ;//branchHere
2811957Sgabeblack@google.com                }});//Bicc
2911957Sgabeblack@google.com                0x3: Branch::bpr({{
3011957Sgabeblack@google.com                        switch(RCOND)
3111957Sgabeblack@google.com                        {
3211957Sgabeblack@google.com                                case 0: case 4:
3311957Sgabeblack@google.com                                        throw illegal_instruction;
3411957Sgabeblack@google.com                                case 1:
3511957Sgabeblack@google.com                                        if(Rs1 == 0) ;//branchHere
3611957Sgabeblack@google.com                                break;
3711957Sgabeblack@google.com                                case 2:
3811957Sgabeblack@google.com                                        if(Rs1 <= 0) ;//branchHere
3911957Sgabeblack@google.com                                break;
4011957Sgabeblack@google.com                                case 3:
4111957Sgabeblack@google.com                                        if(Rs1 < 0) ;//branchHere
4211957Sgabeblack@google.com                                break;
4311957Sgabeblack@google.com                                case 5:
4411957Sgabeblack@google.com                                        if(Rs1 != 0) ;//branchHere
4511957Sgabeblack@google.com                                break;
4611957Sgabeblack@google.com                                case 6:
4711957Sgabeblack@google.com                                        if(Rs1 > 0) ;//branchHere
4811957Sgabeblack@google.com                                break;
4911957Sgabeblack@google.com                                case 7:
5011957Sgabeblack@google.com                                        if(Rs1 >= 0) ;//branchHere
5111957Sgabeblack@google.com                                break;
5211957Sgabeblack@google.com                        }
5311957Sgabeblack@google.com                }});    //BPr
5411957Sgabeblack@google.com                0x4: IntegerOp::sethi({{Rd = (IMM22 << 10) & 0xFFFFFC00;}});   //SETHI (or NOP if rd == 0 and imm == 0)
5511957Sgabeblack@google.com                0x5: Trap::fbpfcc({{throw fp_disabled;}}); //FBPfcc
5611957Sgabeblack@google.com                0x6: Trap::fbfcc({{throw fp_disabled;}});  //FBfcc
5711957Sgabeblack@google.com        }
5811957Sgabeblack@google.com        0x1: Branch::call({{
5911957Sgabeblack@google.com                //branch here
6011957Sgabeblack@google.com                Rd = xc->pc;
6111957Sgabeblack@google.com        }});
6211957Sgabeblack@google.com        0x2: decode OP3 {
6311957Sgabeblack@google.com                format IntegerOp {
6411957Sgabeblack@google.com                        0x00: add({{
6511957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
6611957Sgabeblack@google.com                                Rd = Rs1.sdw + val2;
6711957Sgabeblack@google.com                        }});//ADD
6811957Sgabeblack@google.com                        0x01: and({{
6911957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
7011957Sgabeblack@google.com                                Rd = Rs1.udw & val2;
7111957Sgabeblack@google.com                        }});//AND
7211957Sgabeblack@google.com                        0x02: or({{
7311957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
7411957Sgabeblack@google.com                                Rd = Rs1.udw | val2;
7511957Sgabeblack@google.com                        }});//OR
7611957Sgabeblack@google.com                        0x03: xor({{
7711957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
7811957Sgabeblack@google.com                                Rd = Rs1.udw ^ val2;
7911957Sgabeblack@google.com                        }});//XOR
8011957Sgabeblack@google.com                        0x04: sub({{
8111957Sgabeblack@google.com                                INT64 val2 = ~((UINT64)(I ? SIMM13.sdw : Rs2.udw))+1;
8211957Sgabeblack@google.com                                Rd = Rs1.sdw + val2;
8311957Sgabeblack@google.com                        }});//SUB
8411957Sgabeblack@google.com                        0x05: andn({{
8511957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
8611957Sgabeblack@google.com                                Rd = Rs1.udw & ~val2;
8711957Sgabeblack@google.com                        }});//ANDN
8811957Sgabeblack@google.com                        0x06: orn({{
8911957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
9011957Sgabeblack@google.com                                Rd = Rs1.udw | ~val2;
9111957Sgabeblack@google.com                        }});//ORN
9211957Sgabeblack@google.com                        0x07: xnor({{
9311957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
9411957Sgabeblack@google.com                                Rd = ~(Rs1.udw ^ val2);
9511957Sgabeblack@google.com                        }});//XNOR
9611957Sgabeblack@google.com                        0x08: addc({{
9711957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
9811957Sgabeblack@google.com                                INT64 carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
9911957Sgabeblack@google.com                                Rd = Rs1.sdw + val2 + carryin;
10011957Sgabeblack@google.com                        }});//ADDC
10111957Sgabeblack@google.com                        0x09: mulx({{
10211957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2);
10311957Sgabeblack@google.com                                Rd = Rs1 * val2;
10411957Sgabeblack@google.com                        }});//MULX
10511957Sgabeblack@google.com                        0x0A: umul({{
10611957Sgabeblack@google.com                                UINT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2.udw);
10711957Sgabeblack@google.com                                Rd = resTemp = Rs1.udw<31:0> * val2<31:0>;
10811957Sgabeblack@google.com                                xc->regs.MiscRegs.yFields.value = resTemp<63:32>;
10911957Sgabeblack@google.com                        }});//UMUL
11011957Sgabeblack@google.com                        0x0B: smul({{
11111957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2.sdw);
11211957Sgabeblack@google.com                                rd.sdw = resTemp = Rs1.sdw<31:0> * val2<31:0>;
11311957Sgabeblack@google.com                                xc->regs.MiscRegs.yFields.value = resTemp<63:32>;
11411957Sgabeblack@google.com                        }});//SMUL
11511957Sgabeblack@google.com                        0x0C: subc({{
11611957Sgabeblack@google.com                                INT64 val2 = ~((INT64)(I ? SIMM13.sdw : Rs2.sdw))+1;
11711957Sgabeblack@google.com                                INT64 carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
11811957Sgabeblack@google.com                                Rd.sdw = Rs1.sdw + val2 + carryin;
11911957Sgabeblack@google.com                        }});//SUBC
12011957Sgabeblack@google.com                        0x0D: udivx({{
12111957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
12211957Sgabeblack@google.com                                if(val2 == 0) throw division_by_zero;
12311957Sgabeblack@google.com                                Rd.udw = Rs1.udw / val2;
12411957Sgabeblack@google.com                        }});//UDIVX
12511957Sgabeblack@google.com                        0x0E: udiv({{
12611957Sgabeblack@google.com                                UINT32 resTemp, val2 = (I ? SIMM13.sw : Rs2.udw<31:0>);
12711957Sgabeblack@google.com                                if(val2 == 0) throw division_by_zero;
12811957Sgabeblack@google.com                                resTemp = (UINT64)((xc->regs.MiscRegs.yFields.value << 32) | Rs1.udw<31:0>) / val2;
12911957Sgabeblack@google.com                                INT32 overflow = (resTemp<63:32> != 0);
13011957Sgabeblack@google.com                                if(overflow) rd.udw = resTemp = 0xFFFFFFFF;
13111957Sgabeblack@google.com                                else rd.udw = resTemp;
13211957Sgabeblack@google.com                        }});   //UDIV
13311957Sgabeblack@google.com                        0x0F: sdiv({{
13411957Sgabeblack@google.com                                INT32 resTemp, val2 = (I ? SIMM13.sw : Rs2.sdw<31:0>);
13511957Sgabeblack@google.com                                if(val2 == 0) throw division_by_zero;
13611957Sgabeblack@google.com                                Rd.sdw = resTemp = (INT64)((xc->regs.MiscRegs.yFields.value << 32) | Rs1.sdw<31:0>) / val2;
13711957Sgabeblack@google.com                                INT32 overflow = (resTemp<63:31> != 0);
13811957Sgabeblack@google.com                                INT32 underflow = (resTemp<63:> && resTemp<62:31> != 0xFFFFFFFF);
13911957Sgabeblack@google.com                                if(overflow) rd.udw = resTemp = 0x7FFFFFFF;
14011957Sgabeblack@google.com                                else if(underflow) rd.udw = resTemp = 0xFFFFFFFF80000000;
14111957Sgabeblack@google.com                                else rd.udw = resTemp;
14211957Sgabeblack@google.com                        }});//SDIV
14311957Sgabeblack@google.com                }
14411957Sgabeblack@google.com                format IntegerOpCc {
14511957Sgabeblack@google.com                        0x10: addcc({{
14611957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
14711957Sgabeblack@google.com                                Rd = resTemp = Rs1 + val2;}},
14811957Sgabeblack@google.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
14911957Sgabeblack@google.com                                {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}},
15011957Sgabeblack@google.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
15111957Sgabeblack@google.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
15211957Sgabeblack@google.com                        );//ADDcc
15311957Sgabeblack@google.com                        0x11: andcc({{
15411957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2);
15511957Sgabeblack@google.com                                Rd = Rs1 & val2;}}
15611957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//ANDcc
15711957Sgabeblack@google.com                        0x12: orcc({{
15811957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2);
15911957Sgabeblack@google.com                                Rd = Rs1 | val2;}}
16011957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//ORcc
16111957Sgabeblack@google.com                        0x13: xorcc({{
16211957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2);
16311957Sgabeblack@google.com                                Rd = Rs1 ^ val2;}}
16411957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//XORcc
16511957Sgabeblack@google.com                        0x14: subcc({{
16611957Sgabeblack@google.com                                INT64 resTemp, val2 = (INT64)(I ? SIMM13.sdw : Rs2);
16711957Sgabeblack@google.com                                Rd = resTemp = Rs1 - val2;}},
16811957Sgabeblack@google.com                                {{((Rs1 & 0xFFFFFFFF + (~val2) & 0xFFFFFFFF + 1) >> 31)}},
16911957Sgabeblack@google.com                                {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}},
17011957Sgabeblack@google.com                                {{((Rs1 >> 1) + (~val2) >> 1) + ((Rs1 | ~val2) & 0x1))<63:>}},
17111957Sgabeblack@google.com                                {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}}
17211957Sgabeblack@google.com                        );//SUBcc
17311957Sgabeblack@google.com                        0x15: andncc({{
17411957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2);
17511957Sgabeblack@google.com                                Rd = Rs1 & ~val2;}}
17611957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//ANDNcc
17711957Sgabeblack@google.com                        0x16: orncc({{
17811957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2);
17911957Sgabeblack@google.com                                Rd = Rs1 | ~val2;}}
18011957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//ORNcc
18111957Sgabeblack@google.com                        0x17: xnorcc({{
18211957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2);
18311957Sgabeblack@google.com                                Rd = ~(Rs1 ^ val2);}}
18411957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//XNORcc
18511957Sgabeblack@google.com                        0x18: addccc({{
18611957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
18711957Sgabeblack@google.com                                INT64 carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
18811957Sgabeblack@google.com                                Rd = resTemp = Rs1 + val2 + carryin;}},
18911957Sgabeblack@google.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31 + carryin)}},
19011957Sgabeblack@google.com                                {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}},
19111957Sgabeblack@google.com                                {{((Rs1 >> 1) + (val2 >> 1) + ((Rs1 & val2) | (carryin & (Rs1 | val2)) & 0x1))<63:>}},
19211957Sgabeblack@google.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
19311957Sgabeblack@google.com                        );//ADDCcc
19411957Sgabeblack@google.com                        0x1A: umulcc({{
19511957Sgabeblack@google.com                                UINT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
19611957Sgabeblack@google.com                                Rd = resTemp = Rs1.udw<31:0> * val2<31:0>;
19711957Sgabeblack@google.com                                xc->regs.MiscRegs.yFields.value = resTemp<63:32>;}}
19811957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//UMULcc
19911957Sgabeblack@google.com                        0x1B: smulcc({{
20011957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
20111957Sgabeblack@google.com                                Rd = resTemp = Rs1.sdw<31:0> * val2<31:0>;
20211957Sgabeblack@google.com                                xc->regs.MiscRegs.yFields.value = resTemp<63:32>;}}
20311957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//SMULcc
20411957Sgabeblack@google.com                        0x1C: subccc({{
20511957Sgabeblack@google.com                                INT64 resTemp, val2 = (INT64)(I ? SIMM13.sdw : Rs2);
20611957Sgabeblack@google.com                                INT64 carryin = xc->regs.MiscRegs.ccrfields.iccfields.c;
20711957Sgabeblack@google.com                                Rd = resTemp = Rs1 + ~(val2 + carryin) + 1;}},
20811957Sgabeblack@google.com                                {{((Rs1 & 0xFFFFFFFF + (~(val2 + carryin)) & 0xFFFFFFFF + 1) >> 31)}},
20911957Sgabeblack@google.com                                {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}},
21011957Sgabeblack@google.com                                {{((Rs1 >> 1) + (~(val2 + carryin)) >> 1) + ((Rs1 | ~(val2+carryin)) & 0x1))<63:>}},
21111957Sgabeblack@google.com                                {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}}
21211957Sgabeblack@google.com                        );//SUBCcc
21311957Sgabeblack@google.com                        0x1D: udivxcc({{
21411957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM13.sdw : Rs2.udw);
21511957Sgabeblack@google.com                                if(val2 == 0) throw division_by_zero;
21611957Sgabeblack@google.com                                Rd.udw = Rs1.udw / val2;}}
21711957Sgabeblack@google.com                        ,{{0}},{{0}},{{0}},{{0}});//UDIVXcc
21811957Sgabeblack@google.com                        0x1E: udivcc({{
21911957Sgabeblack@google.com                                UINT32 resTemp, val2 = (I ? SIMM13.sw : Rs2.udw<31:0>);
22011957Sgabeblack@google.com                                if(val2 == 0) throw division_by_zero;
22111957Sgabeblack@google.com                                resTemp = (UINT64)((xc->regs.MiscRegs.yFields.value << 32) | Rs1.udw<31:0>) / val2;
22211957Sgabeblack@google.com                                INT32 overflow = (resTemp<63:32> != 0);
22311957Sgabeblack@google.com                                if(overflow) rd.udw = resTemp = 0xFFFFFFFF;
22411957Sgabeblack@google.com                                else rd.udw = resTemp;}},
22511957Sgabeblack@google.com                                {{0}},
22611957Sgabeblack@google.com                                {{overflow}},
22711957Sgabeblack@google.com                                {{0}},
22811957Sgabeblack@google.com                                {{0}}
22911957Sgabeblack@google.com                        );//UDIVcc
23011957Sgabeblack@google.com                        0x1F: sdivcc({{
23111957Sgabeblack@google.com                                INT32 resTemp, val2 = (I ? SIMM13.sw : Rs2.sdw<31:0>);
23211957Sgabeblack@google.com                                if(val2 == 0) throw division_by_zero;
23311957Sgabeblack@google.com                                Rd.sdw = resTemp = (INT64)((xc->regs.MiscRegs.yFields.value << 32) | Rs1.sdw<31:0>) / val2;
23411957Sgabeblack@google.com                                INT32 overflow = (resTemp<63:31> != 0);
23511957Sgabeblack@google.com                                INT32 underflow = (resTemp<63:> && resTemp<62:31> != 0xFFFFFFFF);
23611957Sgabeblack@google.com                                if(overflow) rd.udw = resTemp = 0x7FFFFFFF;
23711957Sgabeblack@google.com                                else if(underflow) rd.udw = resTemp = 0xFFFFFFFF80000000;
23811957Sgabeblack@google.com                                else rd.udw = resTemp;}},
23911957Sgabeblack@google.com                                {{0}},
24011957Sgabeblack@google.com                                {{overflow || underflow}},
24111957Sgabeblack@google.com                                {{0}},
24211957Sgabeblack@google.com                                {{0}}
24311957Sgabeblack@google.com                        );//SDIVcc
24411957Sgabeblack@google.com                        0x20: taddcc({{
24511957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
24611957Sgabeblack@google.com                                Rd = resTemp = Rs1 + val2;
24711957Sgabeblack@google.com                                INT32 overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}},
24811957Sgabeblack@google.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
24911957Sgabeblack@google.com                                {{overflow}},
25011957Sgabeblack@google.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
25111957Sgabeblack@google.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
25211957Sgabeblack@google.com                        );//TADDcc
25311957Sgabeblack@google.com                        0x21: tsubcc({{
25411957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
25511957Sgabeblack@google.com                                Rd = resTemp = Rs1 + val2;
25611957Sgabeblack@google.com                                INT32 overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}},
25711957Sgabeblack@google.com                                {{(Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
25811957Sgabeblack@google.com                                {{overflow}},
25911957Sgabeblack@google.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
26011957Sgabeblack@google.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
26111957Sgabeblack@google.com                        );//TSUBcc
26211957Sgabeblack@google.com                        0x22: taddcctv({{
26311957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
26411957Sgabeblack@google.com                                Rd = resTemp = Rs1 + val2;
26511957Sgabeblack@google.com                                INT32 overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);
26611957Sgabeblack@google.com                                if(overflow) throw tag_overflow;}},
26711957Sgabeblack@google.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
26811957Sgabeblack@google.com                                {{overflow}},
26911957Sgabeblack@google.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
27011957Sgabeblack@google.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
27111957Sgabeblack@google.com                        );//TADDccTV
27211957Sgabeblack@google.com                        0x23: tsubcctv({{
27311957Sgabeblack@google.com                                INT64 resTemp, val2 = (I ? SIMM13.sdw : Rs2);
27411957Sgabeblack@google.com                                Rd = resTemp = Rs1 + val2;
27511957Sgabeblack@google.com                                INT32 overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);
27611957Sgabeblack@google.com                                if(overflow) throw tag_overflow;}},
27711957Sgabeblack@google.com                                {{((Rs1 & 0xFFFFFFFF + val2 & 0xFFFFFFFF) >> 31)}},
27811957Sgabeblack@google.com                                {{overflow}},
27911957Sgabeblack@google.com                                {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
28011957Sgabeblack@google.com                                {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
28111957Sgabeblack@google.com                        );//TSUBccTV
28211957Sgabeblack@google.com                        0x24: mulscc({{
28311957Sgabeblack@google.com                                INT64 resTemp, multiplicand = (I ? SIMM13.sdw : Rs2);
28411957Sgabeblack@google.com                                INT32 multiplier = Rs1<31:0>;
28511957Sgabeblack@google.com                                INT32 savedLSB = Rs1<0:>;
28611957Sgabeblack@google.com                                multiplier = multipler<31:1> |
28711957Sgabeblack@google.com                                        ((xc->regs.MiscRegs.ccrFields.iccFields.n
28811957Sgabeblack@google.com                                        ^ xc->regs.MiscRegs.ccrFields.iccFields.v) << 32);
28911957Sgabeblack@google.com                                if(!xc->regs.MiscRegs.yFields.value<0:>)
29011957Sgabeblack@google.com                                        multiplicand = 0;
29111957Sgabeblack@google.com                                Rd = resTemp = multiplicand + multiplier;
29211957Sgabeblack@google.com                                xc->regs.MiscRegs.yFields.value = xc->regs.MiscRegs.yFields.value<31:1> | (savedLSB << 31);}},
29311957Sgabeblack@google.com                                {{((multiplicand & 0xFFFFFFFF + multiplier & 0xFFFFFFFF) >> 31)}},
29411957Sgabeblack@google.com                                {{multiplicand<31:> == multiplier<31:> && multiplier<31:> != resTemp<31:>}},
29511957Sgabeblack@google.com                                {{((multiplicand >> 1) + (multiplier >> 1) + (multiplicand & multiplier & 0x1))<63:>}},
29611957Sgabeblack@google.com                                {{multiplicand<63:> == multiplier<63:> && multiplier<63:> != resTemp<63:>}}
29711957Sgabeblack@google.com                        );//MULScc
29811957Sgabeblack@google.com                }
29911957Sgabeblack@google.com                format IntegerOp
30011957Sgabeblack@google.com                {
30111957Sgabeblack@google.com                        0x25: decode X {
30211957Sgabeblack@google.com                                0x0: sll({{Rd = Rs1 << (I ? SHCNT32 : Rs2<4:0>);}}); //SLL
30311957Sgabeblack@google.com                                0x1: sllx({{Rd = Rs1 << (I ? SHCNT64 : Rs2<5:0>);}}); //SLLX
30411957Sgabeblack@google.com                        }
30511957Sgabeblack@google.com                        0x26: decode X {
30611957Sgabeblack@google.com                                0x0: srl({{Rd = Rs1.udw<31:0> >> (I ? SHCNT32 : Rs2<4:0>);}}); //SRL
30711957Sgabeblack@google.com                                0x1: srlx({{Rd = Rs1.udw >> (I ? SHCNT64 : Rs2<5:0>);}});//SRLX
30811957Sgabeblack@google.com                        }
30911957Sgabeblack@google.com                        0x27: decode X {
31011957Sgabeblack@google.com                                0x0: sra({{Rd = Rs1.sdw<31:0> >> (I ? SHCNT32 : Rs2<4:0>);}}); //SRA
31111957Sgabeblack@google.com                                0x1: srax({{Rd = Rs1.sdw >> (I ? SHCNT64 : Rs2<5:0>);}});//SRAX
31211957Sgabeblack@google.com                        }
31311957Sgabeblack@google.com                        0x28: decode RS1 {
31411957Sgabeblack@google.com                                0x0: rdy({{Rd = xc->regs.MiscRegs.yFields.value;}}); //RDY
31511957Sgabeblack@google.com                                0x2: rdccr({{Rd = xc->regs.MiscRegs.ccr;}}); //RDCCR
31611957Sgabeblack@google.com                                0x3: rdasi({{Rd = xc->regs.MiscRegs.asi;}}); //RDASI
31711957Sgabeblack@google.com                                0x4: rdtick({{
31811957Sgabeblack@google.com                                        if(xc->regs.MiscRegs.pstateFields.priv == 0 &&
31911957Sgabeblack@google.com                                                xc->regs.MiscRegs.tickFields.npt == 1)
32011957Sgabeblack@google.com                                                throw privileged_action;
32111957Sgabeblack@google.com                                        Rd = xc->regs.MiscRegs.tick;
32211957Sgabeblack@google.com                                }});//RDTICK
32311957Sgabeblack@google.com                                0x5: rdpc({{Rd = xc->regs.pc;}}); //RDPC
32411957Sgabeblack@google.com                                0x6: rdfprs({{Rd = xc->regs.MiscRegs.fprs;}}); //RDFPRS
32511957Sgabeblack@google.com                                0xF: decode I {
32611957Sgabeblack@google.com                                        0x0: Noop::membar({{//Membar isn't needed yet}}); //MEMBAR
32711957Sgabeblack@google.com                                        0x1: Noop::stbar({{//Stbar isn/'t needed yet}}); //STBAR
32811957Sgabeblack@google.com                                }
32911957Sgabeblack@google.com                        }
33011957Sgabeblack@google.com
33111957Sgabeblack@google.com                        0x2A: decode RS1 {
33211957Sgabeblack@google.com                                0x0: rdprtpc({{checkPriv Rd = xc->regs.MiscRegs.tpc[xc->regs.MiscRegs.tl];}});
33311957Sgabeblack@google.com                                0x1: rdprtnpc({{checkPriv Rd = xc->regs.MiscRegs.tnpc[xc->regs.MiscRegs.tl];}});
33411957Sgabeblack@google.com                                0x2: rdprtstate({{checkPriv Rd = xc->regs.MiscRegs.tstate[xc->regs.MiscRegs.tl];}});
33511957Sgabeblack@google.com                                0x3: rdprtt({{checkPriv Rd = xc->regs.MiscRegs.tt[xc->regs.MiscRegs.tl];}});
33611957Sgabeblack@google.com                                0x4: rdprtick({{checkPriv Rd = xc->regs.MiscRegs.tick;}});
33711957Sgabeblack@google.com                                0x5: rdprtba({{checkPriv Rd = xc->regs.MiscRegs.tba;}});
33811957Sgabeblack@google.com                                0x6: rdprpstate({{checkPriv Rd = xc->regs.MiscRegs.pstate;}});
33911957Sgabeblack@google.com                                0x7: rdprtl({{checkPriv Rd = xc->regs.MiscRegs.tl;}});
34011957Sgabeblack@google.com                                0x8: rdprpil({{checkPriv Rd = xc->regs.MiscRegs.pil;}});
34111957Sgabeblack@google.com                                0x9: rdprcwp({{checkPriv Rd = xc->regs.MiscRegs.cwp;}});
34211957Sgabeblack@google.com                                0xA: rdprcansave({{checkPriv Rd = xc->regs.MiscRegs.cansave;}});
34311957Sgabeblack@google.com                                0xB: rdprcanrestore({{checkPriv Rd = xc->regs.MiscRegs.canrestore;}});
34411957Sgabeblack@google.com                                0xC: rdprcleanwin({{checkPriv Rd = xc->regs.MiscRegs.cleanwin;}});
34511957Sgabeblack@google.com                                0xD: rdprotherwin({{checkPriv Rd = xc->regs.MiscRegs.otherwin;}});
34611957Sgabeblack@google.com                                0xE: rdprwstate({{checkPriv Rd = xc->regs.MiscRegs.wstate;}});
34711957Sgabeblack@google.com                                0xF: rdprfq({{throw illegal_instruction;}}); //The floating point queue isn't implemented right now.
34811957Sgabeblack@google.com                        }
34911957Sgabeblack@google.com                        0x2B: BasicOperate::flushw({{\\window toilet}}); //FLUSHW
35011957Sgabeblack@google.com                        0x2C: movcc({{
35111957Sgabeblack@google.com                                ccBank = (CC24 << 2) | (CC14 << 1) | (CC04 << 0);
35211957Sgabeblack@google.com                                switch(ccBank)
35311957Sgabeblack@google.com                                {
35411957Sgabeblack@google.com                                        case 0: case 1: case 2: case 3:
35511957Sgabeblack@google.com                                                throw fp_disabled;
35611957Sgabeblack@google.com                                        break;
35711957Sgabeblack@google.com                                        case 5: case 7:
35811957Sgabeblack@google.com                                                throw illegal_instruction;
35911957Sgabeblack@google.com                                        break;
36011957Sgabeblack@google.com                                        case 4:
36111957Sgabeblack@google.com                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, COND4))
36211957Sgabeblack@google.com                                                        Rd = (I ? SIMM11.sdw : RS2);
36311957Sgabeblack@google.com                                        break;
36411957Sgabeblack@google.com                                        case 6:
36511957Sgabeblack@google.com                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.xcc, COND4))
36611957Sgabeblack@google.com                                                        Rd = (I ? SIMM11.sdw : RS2);
36711957Sgabeblack@google.com                                        break;
36811957Sgabeblack@google.com                                }
36911957Sgabeblack@google.com                        }});//MOVcc
37011957Sgabeblack@google.com                        0x2D: sdivx({{
37111957Sgabeblack@google.com                                INT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
37211957Sgabeblack@google.com                                if(val2 == 0) throw division_by_zero;
37311957Sgabeblack@google.com                                Rd.sdw = Rs1.sdw / val2;
37411957Sgabeblack@google.com                        }});//SDIVX
37511957Sgabeblack@google.com                        0x2E: decode RS1 {
37611957Sgabeblack@google.com                                0x0: IntegerOp::popc({{
37711957Sgabeblack@google.com                                INT64 count = 0, val2 = (I ? SIMM13.sdw : Rs2.sdw);
37811957Sgabeblack@google.com                                UINT8 oneBits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}
37911957Sgabeblack@google.com                                for(unsigned int x = 0; x < 16; x++)
38011957Sgabeblack@google.com                                {
38111957Sgabeblack@google.com                                        count += oneBits[val2 & 0xF];
38211957Sgabeblack@google.com                                        val2 >> 4;
38311957Sgabeblack@google.com                                }
38411957Sgabeblack@google.com                                }});//POPC
38511957Sgabeblack@google.com                        }
38611957Sgabeblack@google.com                        0x2F: movr({{
38711957Sgabeblack@google.com                                UINT64 val2 = (I ? SIMM10.sdw : Rs2.sdw);
38811957Sgabeblack@google.com                                switch(RCOND)
38911957Sgabeblack@google.com                                {
39011957Sgabeblack@google.com                                        case 0: case 4:
39111957Sgabeblack@google.com                                                throw illegal_instruction;
39211957Sgabeblack@google.com                                        break;
39311957Sgabeblack@google.com                                        case 1:
39411957Sgabeblack@google.com                                                if(Rs1 == 0) Rd = val2;
39511957Sgabeblack@google.com                                        break;
39611957Sgabeblack@google.com                                        case 2:
39711957Sgabeblack@google.com                                                if(Rs1 <= 0) Rd = val2;
39811957Sgabeblack@google.com                                        break;
39911957Sgabeblack@google.com                                        case 3:
40011957Sgabeblack@google.com                                                if(Rs1 = 0) Rd = val2;
40111957Sgabeblack@google.com                                        break;
40211957Sgabeblack@google.com                                        case 5:
40311957Sgabeblack@google.com                                                if(Rs1 != 0) Rd = val2;
40411957Sgabeblack@google.com                                        break;
40511957Sgabeblack@google.com                                        case 6:
40611957Sgabeblack@google.com                                                if(Rs1 > 0) Rd = val2;
40711957Sgabeblack@google.com                                        break;
40811957Sgabeblack@google.com                                        case 7:
40911957Sgabeblack@google.com                                                if(Rs1 >= 0) Rd = val2;
41011957Sgabeblack@google.com                                        break;
41111957Sgabeblack@google.com                                }
41211957Sgabeblack@google.com                        }});//MOVR
41311957Sgabeblack@google.com                        0x30: decode RD {
41411957Sgabeblack@google.com                                0x0: wry({{
41511957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
41611957Sgabeblack@google.com                                        xc->regs.MiscRegs.y = Rs1 ^ val2;
41711957Sgabeblack@google.com                                }});//WRY
41811957Sgabeblack@google.com                                0x2: wrccr({{
41911957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
42011957Sgabeblack@google.com                                        xc->regs.MiscRegs.ccr = Rs1 ^ val2;
42111957Sgabeblack@google.com                                }});//WRCCR
42211957Sgabeblack@google.com                                0x3: wrasi({{
42311957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
42411957Sgabeblack@google.com                                        xc->regs.MiscRegs.asi = Rs1 ^ val2;
42511957Sgabeblack@google.com                                }});//WRASI
42611957Sgabeblack@google.com                                0x6: wrfprs({{
42711957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
42811957Sgabeblack@google.com                                        xc->regs.MiscRegs.asi = Rs1 ^ val2;
42911957Sgabeblack@google.com                                }});//WRFPRS
43011957Sgabeblack@google.com                                0xF: Trap::sir({{software_initiated_reset}}); //SIR
43111957Sgabeblack@google.com                        }
43211957Sgabeblack@google.com                        0x31: decode FCN {
43311957Sgabeblack@google.com                                0x0: BasicOperate::saved({{\\Boogy Boogy}}); //SAVED
43411957Sgabeblack@google.com                                0x1: BasicOperate::restored({{\\Boogy Boogy}}); //RESTORED
43511957Sgabeblack@google.com                        }
43611957Sgabeblack@google.com                        0x32: decode RD {
43711957Sgabeblack@google.com                                0x0: wrprtpc({{checkPriv
43811957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
43911957Sgabeblack@google.com                                        xc->regs.MiscRegs.tpc[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
44011957Sgabeblack@google.com                                }});
44111957Sgabeblack@google.com                                0x1: wrprtnpc({{checkPriv
44211957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
44311957Sgabeblack@google.com                                        xc->regs.MiscRegs.tnpc[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
44411957Sgabeblack@google.com                                }});
44511957Sgabeblack@google.com                                0x2: wrprtstate({{checkPriv
44611957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
44711957Sgabeblack@google.com                                        xc->regs.MiscRegs.tstate[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
44811957Sgabeblack@google.com                                }});
44911957Sgabeblack@google.com                                0x3: wrprtt({{checkPriv
45011957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
45111957Sgabeblack@google.com                                        xc->regs.MiscRegs.tt[xc->regs.MiscRegs.tl] = Rs1 ^ val2;
45211957Sgabeblack@google.com                                }});
45311957Sgabeblack@google.com                                0x4: wrprtick({{checkPriv
45411957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
45511957Sgabeblack@google.com                                        xc->regs.MiscRegs.tick = Rs1 ^ val2;
45611957Sgabeblack@google.com                                }});
45711957Sgabeblack@google.com                                0x5: wrprtba({{checkPriv
45811957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
45911957Sgabeblack@google.com                                        xc->regs.MiscRegs.tba = Rs1 ^ val2;
46011957Sgabeblack@google.com                                }});
46111957Sgabeblack@google.com                                0x6: wrprpstate({{checkPriv
46211957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
46311957Sgabeblack@google.com                                        xc->regs.MiscRegs.pstate = Rs1 ^ val2;
46411957Sgabeblack@google.com                                }});
46511957Sgabeblack@google.com                                0x7: wrprtl({{checkPriv
46611957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
46711957Sgabeblack@google.com                                        xc->regs.MiscRegs.tl = Rs1 ^ val2;
46811957Sgabeblack@google.com                                }});
46911957Sgabeblack@google.com                                0x8: wrprpil({{checkPriv
47011957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
47111957Sgabeblack@google.com                                        xc->regs.MiscRegs.pil = Rs1 ^ val2;
47211957Sgabeblack@google.com                                }});
47311957Sgabeblack@google.com                                0x9: wrprcwp({{checkPriv
47411957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
47511957Sgabeblack@google.com                                        xc->regs.MiscRegs.cwp = Rs1 ^ val2;
47611957Sgabeblack@google.com                                }});
47711957Sgabeblack@google.com                                0xA: wrprcansave({{checkPriv
47811957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
47911957Sgabeblack@google.com                                        xc->regs.MiscRegs.cansave = Rs1 ^ val2;
48011957Sgabeblack@google.com                                }});
48111957Sgabeblack@google.com                                0xB: wrprcanrestore({{checkPriv
48211957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
48311957Sgabeblack@google.com                                        xc->regs.MiscRegs.canrestore = Rs1 ^ val2;
48411957Sgabeblack@google.com                                }});
48511957Sgabeblack@google.com                                0xC: wrprcleanwin({{checkPriv
48611957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
48711957Sgabeblack@google.com                                        xc->regs.MiscRegs.cleanwin = Rs1 ^ val2;
48811957Sgabeblack@google.com                                }});
48911957Sgabeblack@google.com                                0xD: wrprotherwin({{checkPriv
49011957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
49111957Sgabeblack@google.com                                        xc->regs.MiscRegs.otherwin = Rs1 ^ val2;
49211957Sgabeblack@google.com                                }});
49311957Sgabeblack@google.com                                0xE: wrprwstate({{checkPriv
49411957Sgabeblack@google.com                                        UINT64 val2 = (I ? SIMM13.sdw : Rs2.sdw);
49511957Sgabeblack@google.com                                        xc->regs.MiscRegs.wstate = Rs1 ^ val2;
49611957Sgabeblack@google.com                                }});
49711957Sgabeblack@google.com                        }
49811957Sgabeblack@google.com
49911957Sgabeblack@google.com                        0x34: Trap::fpop1({{Throw fp_disabled;}}); //FPOP1
50011957Sgabeblack@google.com                        0x35: Trap::fpop2({{Throw fp_disabled;}}); //FPOP2
50111957Sgabeblack@google.com
50211957Sgabeblack@google.com
50311957Sgabeblack@google.com                        0x38: Branch::jmpl({{//Stuff}}); //JMPL
50411957Sgabeblack@google.com                        0x39: Branch::return({{//Other Stuff}}); //RETURN
50511957Sgabeblack@google.com                        0x3A: Trap::tcc({{
50611957Sgabeblack@google.com                                switch((CC14 << 1) | (CC04 << 0))
50711957Sgabeblack@google.com                                {
50811957Sgabeblack@google.com                                        case 1: case 3:
50911957Sgabeblack@google.com                                                throw illegal_instruction;
51011957Sgabeblack@google.com                                        case 0:
51111957Sgabeblack@google.com                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, machInst<25:28>))
51211957Sgabeblack@google.com                                                        throw trap_instruction;
51311957Sgabeblack@google.com                                        break;
51411957Sgabeblack@google.com                                        case 2:
51511957Sgabeblack@google.com                                                if(passesCondition(xc->regs.MiscRegs.ccrFields.xcc, machInst<25:28>))
51611957Sgabeblack@google.com                                                        throw trap_instruction;
51711957Sgabeblack@google.com                                        break;
51811957Sgabeblack@google.com                                }
51911957Sgabeblack@google.com                        }}); //Tcc
52011957Sgabeblack@google.com                        0x3B: BasicOperate::flush({{//Lala}}); //FLUSH
52111957Sgabeblack@google.com                        0x3C: BasicOperate::save({{//leprechauns); //SAVE
52211957Sgabeblack@google.com                        0x3D: BasicOperate::restore({{//Eat my short int}}); //RESTORE
52311957Sgabeblack@google.com                        0x3E: decode FCN {
52411957Sgabeblack@google.com                                0x1: BasicOperate::done({{//Done thing}}); //DONE
52511957Sgabeblack@google.com                                0x2: BasicOperate::retry({{//Retry thing}}); //RETRY
52611957Sgabeblack@google.com                        }
52711957Sgabeblack@google.com                }
52811957Sgabeblack@google.com        }
52911957Sgabeblack@google.com        0x3: decode OP3 {
53011957Sgabeblack@google.com                format Mem {
53111957Sgabeblack@google.com                        0x00: lduw({{Rd.uw = Mem.uw;}}); //LDUW
53211957Sgabeblack@google.com                        0x01: ldub({{Rd.ub = Mem.ub;}}); //LDUB
53311957Sgabeblack@google.com                        0x02: lduh({{Rd.uhw = Mem.uhw;}}); //LDUH
53411957Sgabeblack@google.com                        0x03: ldd({{
53511957Sgabeblack@google.com                                UINT64 val = Mem.udw;
53611957Sgabeblack@google.com                                setIntReg(RD & (~1), val<31:0>);
53711957Sgabeblack@google.com                                setIntReg(RD | 1, val<63:32>);
53811957Sgabeblack@google.com                        }});//LDD
53911957Sgabeblack@google.com                        0x04: stw({{Mem.sw = Rd.sw;}}); //STW
54011957Sgabeblack@google.com                        0x05: stb({{Mem.sb = Rd.sb;}}); //STB
54111957Sgabeblack@google.com                        0x06: sth({{Mem.shw = Rd.shw;}}); //STH
54211957Sgabeblack@google.com                        0x07: std({{
54311957Sgabeblack@google.com                                Mem.udw = readIntReg(RD & (~1))<31:0> | (readIntReg(RD | 1)<31:0> << 32);
54411957Sgabeblack@google.com                        }});//STD
54511957Sgabeblack@google.com                        0x08: ldsw({{Rd.sw = Mem.sw;}}); //LDSW
54611957Sgabeblack@google.com                        0x09: ldsb({{Rd.sb = Mem.sb;}}); //LDSB
54711957Sgabeblack@google.com                        0x0A: ldsh({{Rd.shw = Mem.shw;}}); //LDSH
54811957Sgabeblack@google.com                        0x0B: ldx({{Rd.udw = Mem.udw;}}); //LDX
54911957Sgabeblack@google.com
55011957Sgabeblack@google.com                        0x0D: ldstub({{
55111957Sgabeblack@google.com                                Rd.ub = Mem.ub;
55211957Sgabeblack@google.com                                Mem.ub = 0xFF;
55311957Sgabeblack@google.com                        }}); //LDSTUB
55411957Sgabeblack@google.com                        0x0E: stx({{Rd.udw = Mem.udw;}}); //STX
55511957Sgabeblack@google.com                        0x0F: swap({{
55611957Sgabeblack@google.com                                UINT32 temp = Rd.uw;
55711957Sgabeblack@google.com                                Rd.uw = Mem.uw;
55811957Sgabeblack@google.com                                Mem.uw = temp;
55911957Sgabeblack@google.com                        }}); //SWAP
56011957Sgabeblack@google.com                        0x10: lduwa({{Rd.uw = Mem.uw;}}); //LDUWA
56111957Sgabeblack@google.com                        0x11: lduba({{Rd.ub = Mem.ub;}}); //LDUBA
56211957Sgabeblack@google.com                        0x12: lduha({{Rd.uhw = Mem.uhw;}}); //LDUHA
56311957Sgabeblack@google.com                        0x13: ldda({{
56411957Sgabeblack@google.com                                UINT64 val = Mem.udw;
56511957Sgabeblack@google.com                                setIntReg(RD & (~1), val<31:0>);
56611957Sgabeblack@google.com                                setIntReg(RD | 1, val<63:32>);
56711957Sgabeblack@google.com                        }}); //LDDA
56811957Sgabeblack@google.com                        0x14: stwa({{Mem.uw = Rd.uw;}}); //STWA
56911957Sgabeblack@google.com                        0x15: stba({{Mem.ub = Rd.ub;}}); //STBA
57011957Sgabeblack@google.com                        0x16: stha({{Mem.uhw = Rd.uhw;}}); //STHA
57111957Sgabeblack@google.com                        0x17: stda({{
57211957Sgabeblack@google.com                                Mem.udw = readIntReg(RD & (~1))<31:0> | (readIntReg(RD | 1)<31:0> << 32);
57311957Sgabeblack@google.com                        }}); //STDA
57411957Sgabeblack@google.com                        0x18: ldswa({{Rd.sw = Mem.sw;}}); //LDSWA
57511957Sgabeblack@google.com                        0x19: ldsba({{Rd.sb = Mem.sb;}}); //LDSBA
57611957Sgabeblack@google.com                        0x1A: ldsha({{Rd.shw = Mem.shw;}}); //LDSHA
57711957Sgabeblack@google.com                        0x1B: ldxa({{Rd.sdw = Mem.sdw;}}); //LDXA
57811957Sgabeblack@google.com
57911957Sgabeblack@google.com                        0x1D: ldstuba({{
58011957Sgabeblack@google.com                                Rd.ub = Mem.ub;
58111957Sgabeblack@google.com                                Mem.ub = 0xFF;
58211957Sgabeblack@google.com                        }}); //LDSTUBA
58311957Sgabeblack@google.com                        0x1E: stxa({{Mem.sdw = Rd.sdw}}); //STXA
58411957Sgabeblack@google.com                        0x1F: swapa({{
58511957Sgabeblack@google.com                                UINT32 temp = Rd.uw;
58611957Sgabeblack@google.com                                Rd.uw = Mem.uw;
58711957Sgabeblack@google.com                                Mem.uw = temp;
58811957Sgabeblack@google.com                        }}); //SWAPA
58911957Sgabeblack@google.com                        0x20: Trap::ldf({{throw fp_disabled;}}); //LDF
59011957Sgabeblack@google.com                        0x21: decode X {
59111957Sgabeblack@google.com                                0x0: Trap::ldfsr({{throw fp_disabled;}}); //LDFSR
59211957Sgabeblack@google.com                                0x1: Trap::ldxfsr({{throw fp_disabled;}}); //LDXFSR
59311957Sgabeblack@google.com                        }
59411957Sgabeblack@google.com                        0x22: Trap::ldqf({{throw fp_disabled;}}); //LDQF
59511957Sgabeblack@google.com                        0x23: Trap::lddf({{throw fp_disabled;}}); //LDDF
59611957Sgabeblack@google.com                        0x24: Trap::stf({{throw fp_disabled;}}); //STF
59711957Sgabeblack@google.com                        0x25: decode X {
59811957Sgabeblack@google.com                                0x0: Trap::stfsr({{throw fp_disabled;}}); //STFSR
59911957Sgabeblack@google.com                                0x1: Trap::stxfsr({{throw fp_disabled;}}); //STXFSR
60011957Sgabeblack@google.com                        }
60111957Sgabeblack@google.com                        0x26: Trap::stqf({{throw fp_disabled;}}); //STQF
60211957Sgabeblack@google.com                        0x27: Trap::stdf({{throw fp_disabled;}}); //STDF
60311957Sgabeblack@google.com
60411957Sgabeblack@google.com
60511957Sgabeblack@google.com
60611957Sgabeblack@google.com
60711957Sgabeblack@google.com
60811957Sgabeblack@google.com                        0x2D: Noop::prefetch({{ }}); //PREFETCH
60911957Sgabeblack@google.com
61011957Sgabeblack@google.com
61111957Sgabeblack@google.com                        0x30: Trap::ldfa({{throw fp_disabled;}}); //LDFA
61211957Sgabeblack@google.com
61311957Sgabeblack@google.com                        0x32: Trap::ldqfa({{throw fp_disabled;}}); //LDQFA
61411957Sgabeblack@google.com                        0x33: Trap::lddfa({{throw fp_disabled;}}); //LDDFA
61511957Sgabeblack@google.com                        0x34: Trap::stfa({{throw fp_disabled;}}); //STFA
61611957Sgabeblack@google.com                        0x35: Trap::stqfa({{throw fp_disabled;}}); //STQFA
61711957Sgabeblack@google.com                        0x36: Trap::stdfa({{throw fp_disabled;}}); //STDFA
61811957Sgabeblack@google.com
61911957Sgabeblack@google.com
62011957Sgabeblack@google.com
62111957Sgabeblack@google.com
62211957Sgabeblack@google.com
62311957Sgabeblack@google.com                        0x3C: Cas::casa(
62411957Sgabeblack@google.com                                {{UINT64 val = Mem.uw;
62511957Sgabeblack@google.com                                if(Rs2.uw == val)
62611957Sgabeblack@google.com                                        Mem.uw = Rd.uw;
62711957Sgabeblack@google.com                                Rd.uw = val;
62811957Sgabeblack@google.com                        }}); //CASA
62911957Sgabeblack@google.com                        0x3D: Noop::prefetcha({{ }}); //PREFETCHA
63011957Sgabeblack@google.com                        0x3E: Cas::casxa(
63111957Sgabeblack@google.com                                {{UINT64 val = Mem.udw;
63211957Sgabeblack@google.com                                if(Rs2 == val)
63311957Sgabeblack@google.com                                        Mem.udw = Rd;
63411957Sgabeblack@google.com                                Rd = val;
63511957Sgabeblack@google.com                        }}); //CASXA
63611957Sgabeblack@google.com                }
63711957Sgabeblack@google.com        }
63811957Sgabeblack@google.com}
63911957Sgabeblack@google.com