Don't use magic numbers.
[gem5.git] / arch / alpha / isa_desc
index 6c5912c528c81e4084051ffa01cc9b11c94456f2..9d65a02f0e8a68876e76324ebc149e9a063212a4 100644 (file)
@@ -1842,7 +1842,7 @@ decode OPCODE default Unknown::unknown() {
        0x2a: ldl_l({{ EA = Rb + disp; }}, {{ Ra.sl = Mem.sl; }}, LOCKED);
        0x2b: ldq_l({{ EA = Rb + disp; }}, {{ Ra.uq = Mem.uq; }}, LOCKED);
        0x20: copy_load({{EA = Ra;}}, 
-                       {{ fault = xc->copySrcTranslate(EA);}},
+                       {{fault = xc->copySrcTranslate(EA);}},
                        IsMemRef, IsLoad, IsCopy);
     }
 
@@ -1864,7 +1864,7 @@ decode OPCODE default Unknown::unknown() {
        0x26: sts({{ EA = Rb + disp; }}, {{ Mem.ul = t_to_s(Fa.uq); }});
        0x27: stt({{ EA = Rb + disp; }}, {{ Mem.df = Fa; }});
        0x24: copy_store({{EA = Rb;}},
-                        {{ fault = xc->copy(EA);}},
+                        {{fault = xc->copy(EA);}},
                         IsMemRef, IsStore, IsCopy);
     }
 
@@ -2119,12 +2119,34 @@ decode OPCODE default Unknown::unknown() {
        0x1c: decode INTFUNC {
            0x00: decode RA { 31: sextb({{ Rc.sb = Rb_or_imm< 7:0>; }}); }
            0x01: decode RA { 31: sextw({{ Rc.sw = Rb_or_imm<15:0>; }}); }
+        0x32: ctlz({{
+            uint64_t count = 0;
+            uint64_t temp = Rb;
+            if (temp<63:32>) temp >>= 32; else count += 32;
+            if (temp<31:16>) temp >>= 16; else count += 16;
+            if (temp<15:8>) temp >>= 8; else count += 8;
+            if (temp<7:4>) temp >>= 4; else count += 4;
+            if (temp<3:2>) temp >>= 2; else count += 2;
+            if (temp<1:1>) temp >>= 1; else count += 1;
+            if ((temp<0:0>) != 0x1) count += 1; 
+            Rc = count; 
+            }}, IntAluOp);
+         
+        0x33: cttz({{
+            uint64_t count = 0;
+            uint64_t temp = Rb;
+            if (!(temp<31:0>)) { temp >>= 32; count += 32; }
+            if (!(temp<15:0>)) { temp >>= 16; count += 16; }
+            if (!(temp<7:0>)) { temp >>= 8; count += 8; }
+            if (!(temp<3:0>)) { temp >>= 4; count += 4; }
+            if (!(temp<1:0>)) { temp >>= 2; count += 2; }
+            if (!(temp<0:0> & ULL(0x1))) count += 1; 
+            Rc = count; 
+        }}, IntAluOp);
 
            format FailUnimpl {
                0x30: ctpop();
                0x31: perr();
-               0x32: ctlz();
-               0x33: cttz();
                0x34: unpkbw();
                0x35: unpkbl();
                0x36: pkwb();
@@ -2378,7 +2400,11 @@ decode OPCODE default Unknown::unknown() {
        format BasicOperate {
            0xc000: rpcc({{
 #ifdef FULL_SYSTEM
-               Ra = xc->readIpr(AlphaISA::IPR_CC, fault);
+        /* Rb is a fake dependency so here is a fun way to get
+         * the parser to understand that.
+         */
+               Ra = xc->readIpr(AlphaISA::IPR_CC, fault) + (Rb & 0);
+        
 #else
                Ra = curTick;
 #endif
@@ -2518,6 +2544,16 @@ decode OPCODE default Unknown::unknown() {
             0x43: m5checkpoint({{
                AlphaPseudo::m5checkpoint(xc->xcBase());
            }}, IsNonSpeculative);
+            0x50: m5readfile({{
+               AlphaPseudo::readfile(xc->xcBase());
+           }}, IsNonSpeculative);
+            0x51: m5break({{
+        AlphaPseudo::debugbreak(xc->xcBase());
+        }}, IsNonSpeculative);
+            0x52: m5switchcpu({{
+        AlphaPseudo::switchcpu(xc->xcBase());
+        }}, IsNonSpeculative);
+
        }
     }