case MISCREG_BPIALL:
             return new WarnUnimplemented(
                     isRead ? "mrc bpiall" : "mcr bpiall", machInst);
+
+            // Write only.
           case MISCREG_TLBIALLIS:
           case MISCREG_TLBIMVAIS:
           case MISCREG_TLBIASIDIS:
                 return new Mcr15(machInst, (IntRegIndex)miscReg, rt);
             }
 
+            // Read only in user mode.
+          case MISCREG_TPIDRURO:
+            if (isRead) {
+                return new Mrc15User(machInst, rt, (IntRegIndex)miscReg);
+            } else {
+                return new Mcr15(machInst, (IntRegIndex)miscReg, rt);
+            }
+
+            // Read/write in user mode.
+          case MISCREG_TPIDRURW:
+            if (isRead) {
+                return new Mrc15User(machInst, rt, (IntRegIndex)miscReg);
+            } else {
+                return new Mcr15User(machInst, (IntRegIndex)miscReg, rt);
+            }
+
+            // Read/write, priveleged only.
           default:
             if (isRead) {
                 return new Mrc15(machInst, rt, (IntRegIndex)miscReg);
 
     decoder_output += RegRegOpConstructor.subst(mcr15Iop)
     exec_output += PredOpExecute.subst(mcr15Iop)
 
+    mrc15UserIop = InstObjParams("mrc", "Mrc15User", "RegRegOp",
+                                 { "code": "Dest = MiscOp1;",
+                                   "predicate_test": predicateTest }, [])
+    header_output += RegRegOpDeclare.subst(mrc15UserIop)
+    decoder_output += RegRegOpConstructor.subst(mrc15UserIop)
+    exec_output += PredOpExecute.subst(mrc15UserIop)
+
+    mcr15UserIop = InstObjParams("mcr", "Mcr15User", "RegRegOp",
+                                 { "code": "MiscDest = Op1",
+                                   "predicate_test": predicateTest }, [])
+    header_output += RegRegOpDeclare.subst(mcr15UserIop)
+    decoder_output += RegRegOpConstructor.subst(mcr15UserIop)
+    exec_output += PredOpExecute.subst(mcr15UserIop)
+
     enterxCode = '''
         FNPC = NPC | (1ULL << PcJBitShift) | (1ULL << PcTBitShift);
     '''