diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas
index d6d3705a85..819da17941 100644
--- a/compiler/cgobj.pas
+++ b/compiler/cgobj.pas
@@ -777,6 +777,10 @@ unit cgobj;
     procedure tcg.a_load_loc_reg(list : taasmoutput;const loc: tlocation; reg : tregister);
 
       begin
+      {$ifdef i386}
+        {For safety convert location register to enum for now...}
+        convert_register_to_enum(reg);
+      {$endif}
         case loc.loc of
           LOC_REFERENCE,LOC_CREFERENCE:
             a_load_ref_reg(list,loc.size,loc.reference,reg);
@@ -1694,7 +1698,11 @@ finalization
 end.
 {
   $Log$
-  Revision 1.72  2003-01-09 22:00:53  florian
+  Revision 1.73  2003-01-13 14:54:34  daniel
+    * Further work to convert codegenerator register convention;
+      internalerror bug fixed.
+
+  Revision 1.72  2003/01/09 22:00:53  florian
     * fixed some PowerPC issues
 
   Revision 1.71  2003/01/09 20:41:10  florian
diff --git a/compiler/i386/cga.pas b/compiler/i386/cga.pas
index 2e0a2dde16..ab0346e267 100644
--- a/compiler/i386/cga.pas
+++ b/compiler/i386/cga.pas
@@ -152,6 +152,8 @@ implementation
 
     procedure emit_reg_reg(i : tasmop;s : topsize;reg1,reg2 : tregister);
       begin
+         convert_register_to_enum(reg1);
+         convert_register_to_enum(reg2);
          if (reg1.enum<>reg2.enum) or (i<>A_MOV) then
            exprasmList.concat(Taicpu.Op_reg_reg(i,s,reg1,reg2));
       end;
@@ -174,7 +176,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.34  2003-01-08 18:43:57  daniel
+  Revision 1.35  2003-01-13 14:54:34  daniel
+    * Further work to convert codegenerator register convention;
+      internalerror bug fixed.
+
+  Revision 1.34  2003/01/08 18:43:57  daniel
    * Tregister changed into a record
 
   Revision 1.33  2002/07/01 18:46:29  peter
diff --git a/compiler/i386/n386mat.pas b/compiler/i386/n386mat.pas
index e88f435a8a..9d319b1c59 100644
--- a/compiler/i386/n386mat.pas
+++ b/compiler/i386/n386mat.pas
@@ -121,7 +121,8 @@ implementation
                           else
                             begin
                               rg.getexplicitregisterint(exprasmlist,R_EDI);
-                              hreg2.enum := R_EDI;
+                              hreg2.enum := R_INTREGISTER;
+                              hreg2.number := NR_EDI;
                               emit_reg_reg(A_MOV,S_L,hreg1,hreg2);
                               { if the left value is signed, R_EDI := $ffffffff,
                                 otherwise 0 }
@@ -133,6 +134,8 @@ implementation
                           emit_reg_reg(A_ADD,S_L,hreg2,hreg1);
                           { release EDX if we used it }
                           { also releas EDI }
+                          if (hreg2.enum=R_INTREGISTER) and (hreg2.number=NR_EDI) then
+                            hreg2.enum:=R_EDI;
                           rg.ungetregisterint(exprasmlist,hreg2);
                           { do the shift }
                           emit_const_reg(A_SAR,S_L,power,hreg1);
@@ -163,12 +166,14 @@ implementation
                   rg.getexplicitregisterint(exprasmlist,R_EDI);
                   if right.location.loc<>LOC_CREGISTER then
                    location_release(exprasmlist,right.location);
-                  r.enum:=R_EDI;
+                  r.enum:=R_INTREGISTER;
+                  r.number:=NR_EDI;
                   cg.a_load_loc_reg(exprasmlist,right.location,r);
                   popedx:=false;
                   popeax:=false;
-                  r.enum:=R_EAX;
-                  r2.enum:=R_EDX;
+                  r.number:=NR_EAX;
+                  r2.enum:=R_INTREGISTER;
+                  r2.number:=NR_EDX;
                   if hreg1.enum=R_EDX then
                     begin
                       if not(R_EAX in rg.unusedregsint) then
@@ -208,18 +213,23 @@ implementation
                      emit_none(A_CDQ,S_NO);
 
                   { division depends on the right type }
-                  r.enum:=R_EDI;
+                  r.enum:=R_INTREGISTER;
+                  r.number:=NR_EDI;
                   if torddef(right.resulttype.def).typ=u32bit then
                     emit_reg(A_DIV,S_L,r)
                   else
                     emit_reg(A_IDIV,S_L,r);
                   r.enum:=R_EDI;
                   rg.ungetregisterint(exprasmlist,r);
-                  r.enum:=R_EAX;
+                  r.enum:=R_INTREGISTER;
+                  r.number:=NR_EAX;
                   if nodetype=divn then
                     begin
                        if not popedx and (hreg1.enum <> R_EDX) then
-                         rg.ungetregister(exprasmlist,r2);
+                        begin
+                           r2.enum:=R_EDX;
+                           rg.ungetregister(exprasmlist,r2);
+                        end;
                        { if result register is busy then copy }
                        if popeax then
                          begin
@@ -239,7 +249,10 @@ implementation
                   else
                     begin
                       if not popeax and (hreg1.enum <> R_EAX)then
-                        rg.ungetregister(exprasmlist,r);
+                        begin
+                          r.enum:=R_EAX;
+                          rg.ungetregister(exprasmlist,r);
+                        end;
                       if popedx then
                        {the mod was done by an (i)div (so the result is now in
                         edx), but edx was occupied prior to the division, so
@@ -862,7 +875,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.42  2003-01-08 18:43:57  daniel
+  Revision 1.43  2003-01-13 14:54:34  daniel
+    * Further work to convert codegenerator register convention;
+      internalerror bug fixed.
+
+  Revision 1.42  2003/01/08 18:43:57  daniel
    * Tregister changed into a record
 
   Revision 1.41  2002/11/25 17:43:26  peter
diff --git a/compiler/i386/n386obj.pas b/compiler/i386/n386obj.pas
index 761700583d..1d7b5d1feb 100644
--- a/compiler/i386/n386obj.pas
+++ b/compiler/i386/n386obj.pas
@@ -113,9 +113,10 @@ procedure ti386classheader.cgintfwrapper(asmlist: TAAsmoutput; procdef: tprocdef
     r:Tregister;
   begin
     { mov offset(%esp),%eax }
-    r.enum:=R_ESP;
+    r.enum:=R_INTREGISTER;
+    r.number:=NR_ESP;
     reference_reset_base(href,r,getselfoffsetfromsp(procdef));
-    r.enum:=R_EAX;
+    r.number:=NR_EAX;
     cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,r);
   end;
 
@@ -126,7 +127,8 @@ procedure ti386classheader.cgintfwrapper(asmlist: TAAsmoutput; procdef: tprocdef
   begin
     checkvirtual;
     { mov  0(%eax),%eax ; load vmt}
-    r.enum:=R_EAX;
+    r.enum:=R_INTREGISTER;
+    r.number:=NR_EAX;
     reference_reset_base(href,r,0);
     emit_ref_reg(A_MOV,S_L,href,r);
   end;
@@ -137,7 +139,8 @@ procedure ti386classheader.cgintfwrapper(asmlist: TAAsmoutput; procdef: tprocdef
     r:Tregister;
   begin
     { call/jmp  vmtoffs(%eax) ; method offs }
-    r.enum:=R_EAX;
+    r.enum:=R_INTREGISTER;
+    r.number:=NR_EAX;
     reference_reset_base(href,r,procdef._class.vmtmethodoffset(procdef.extnumber));
     emit_ref(op,S_L,href);
   end;
@@ -148,7 +151,8 @@ procedure ti386classheader.cgintfwrapper(asmlist: TAAsmoutput; procdef: tprocdef
     r:Tregister;
   begin
     { mov  vmtoffs(%eax),%eax ; method offs }
-    r.enum:=R_EAX;
+    r.enum:=R_INTREGISTER;
+    r.number:=NR_EAX;
     reference_reset_base(href,r,procdef._class.vmtmethodoffset(procdef.extnumber));
     emit_ref_reg(A_MOV,S_L,href,r);
   end;
@@ -203,17 +207,18 @@ begin
   { case 3 }
   else if [po_virtualmethod,po_saveregisters]*procdef.procoptions=[po_virtualmethod,po_saveregisters] then
     begin
-      r.enum:=R_EBX;
+      r.enum:=R_INTREGISTER;
+      r.number:=NR_EBX;
       emit_reg(A_PUSH,S_L,r); { allocate space for address}
-      r.enum:=R_EAX;
+      r.number:=NR_EAX;
       emit_reg(A_PUSH,S_L,r);
       getselftoeax(8);
       loadvmttoeax;
       loadmethodoffstoeax;
       { mov %eax,4(%esp) }
-      r.enum:=R_ESP;
+      r.number:=NR_ESP;
       reference_reset_base(href,r,4);
-      r.enum:=R_EAX;
+      r.number:=NR_EAX;
       emit_reg_ref(A_MOV,S_L,r,href);
       { pop  %eax }
       emit_reg(A_POP,S_L,r);
@@ -242,7 +247,11 @@ initialization
 end.
 {
   $Log$
-  Revision 1.16  2003-01-08 18:43:57  daniel
+  Revision 1.17  2003-01-13 14:54:34  daniel
+    * Further work to convert codegenerator register convention;
+      internalerror bug fixed.
+
+  Revision 1.16  2003/01/08 18:43:57  daniel
    * Tregister changed into a record
 
   Revision 1.15  2002/08/11 14:32:30  peter
diff --git a/compiler/i386/n386set.pas b/compiler/i386/n386set.pas
index 09328686ba..c9cbe8bd64 100644
--- a/compiler/i386/n386set.pas
+++ b/compiler/i386/n386set.pas
@@ -279,7 +279,8 @@ implementation
                       if (pleftreg.enum <> R_EDI) and
                          (left.location.loc = LOC_CREGISTER) then
                         begin
-                          r.enum:=R_EDI;
+                          r.enum:=R_INTREGISTER;
+                          r.number:=NR_EDI;
                           rg.ungetregister(exprasmlist,pleftreg);
                           rg.getexplicitregisterint(exprasmlist,R_EDI);
                           reference_reset_base(href,pleftreg,-setparts[i].start);
@@ -397,7 +398,8 @@ implementation
                       { the set element isn't never samller than a byte  }
                       { and because it's a small set we need only 5 bits }
                       { but 8 bits are easier to load               }
-                      r.enum:=R_EDI;
+                      r.enum:=R_INTREGISTER;
+                      r.number:=NR_EDI;
                       rg.getexplicitregisterint(exprasmlist,R_EDI);
                       emit_ref_reg(A_MOVZX,S_BL,left.location.reference,r);
                       hr:=r;
@@ -433,6 +435,8 @@ implementation
                        internalerror(2002032210);
                   end;
                   { simply to indicate EDI is deallocated here too (JM) }
+                  if (hr.enum=R_INTREGISTER) and (hr.number=NR_EDI) then
+                    hr.enum:=R_EDI;
                   rg.ungetregisterint(exprasmlist,hr);
                   location.loc:=LOC_FLAGS;
                   location.resflags:=F_C;
@@ -710,7 +714,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.46  2003-01-08 18:43:57  daniel
+  Revision 1.47  2003-01-13 14:54:34  daniel
+    * Further work to convert codegenerator register convention;
+      internalerror bug fixed.
+
+  Revision 1.46  2003/01/08 18:43:57  daniel
    * Tregister changed into a record
 
   Revision 1.45  2002/11/25 17:43:27  peter
diff --git a/compiler/nobj.pas b/compiler/nobj.pas
index 327e4d8b84..97d5d1960f 100644
--- a/compiler/nobj.pas
+++ b/compiler/nobj.pas
@@ -1011,6 +1011,7 @@ implementation
           end;
         dataSegment.concatlist(rawdata);
         rawdata.free;
+        rawcode.convert_registers;
         codeSegment.concatlist(rawcode);
         rawcode.free;
         freemem(impintfindexes,(max+1)*sizeof(longint));
@@ -1332,7 +1333,11 @@ initialization
 end.
 {
   $Log$
-  Revision 1.39  2003-01-09 21:52:37  peter
+  Revision 1.40  2003-01-13 14:54:34  daniel
+    * Further work to convert codegenerator register convention;
+      internalerror bug fixed.
+
+  Revision 1.39  2003/01/09 21:52:37  peter
     * merged some verbosity options.
     * V_LineInfo is a verbosity flag to include line info
 
diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas
index 2fd5ecc49c..19ba8a2f4e 100644
--- a/compiler/x86/cgx86.pas
+++ b/compiler/x86/cgx86.pas
@@ -480,10 +480,22 @@ unit cgx86;
       var
         op: tasmop;
         s: topsize;
+        eq:boolean;
 
       begin
-        sizes2load(fromsize,reg2opsize[reg2.enum],op,s);
-        if (rg.makeregsize(reg1,OS_INT).enum = rg.makeregsize(reg2,OS_INT).enum) then
+        if (reg1.enum=R_INTREGISTER) and (reg2.enum=R_INTREGISTER) then
+          begin
+            sizes2load(fromsize,subreg2opsize[reg2.number and $ff],op,s);
+            eq:=(reg1.number shr 8)=(reg2.number shr 8);
+          end
+        else if (reg1.enum<lastreg) and (reg2.enum<lastreg) then
+          begin
+            sizes2load(fromsize,reg2opsize[reg2.enum],op,s);
+            eq:=(rg.makeregsize(reg1,OS_INT).enum = rg.makeregsize(reg2,OS_INT).enum);
+          end
+        else
+          internalerror(200301081);
+        if eq then
          begin
            { "mov reg1, reg1" doesn't make sense }
            if op = A_MOV then
@@ -787,6 +799,7 @@ unit cgx86;
             internalerror(200301081);
           if dst.enum>lastreg then
             internalerror(200301081);
+          r.enum:=R_INTREGISTER;
           dstsize := tcgsize2opsize[size];
           dst := rg.makeregsize(dst,size);
           case op of
@@ -820,23 +833,22 @@ unit cgx86;
                   begin
                     { is ecx still free (it's also free if it was allocated }
                     { to dst, since we've moved dst somewhere else already) }
+                    r.number:=NR_ECX;
                     if not((dst.enum = R_ECX) or
                            ((R_ECX in rg.unusedregsint) and
                             { this will always be true, it's just here to }
                             { allocate ecx                                }
                             (rg.getexplicitregisterint(list,R_ECX).enum = R_ECX))) then
                       begin
-                        r.enum:=R_ECX;
                         list.concat(taicpu.op_reg(A_PUSH,S_L,r));
                         popecx := true;
                       end;
-                    r.enum:=R_ECX;
                     a_load_reg_reg(list,OS_32,OS_32,rg.makeregsize(src,OS_32),r);
                   end
                 else
                   src.enum := R_CL;
                 { do the shift }
-                 r.enum:=R_CL;
+                r.number:=NR_CL;
                 if tmpreg.enum = R_NO then
                   list.concat(taicpu.op_reg_reg(TOpCG2AsmOp[op],dstsize,
                     r,dst))
@@ -845,11 +857,11 @@ unit cgx86;
                     list.concat(taicpu.op_reg_reg(TOpCG2AsmOp[op],S_L,
                       r,tmpreg));
                     { move result back to the destination }
-                    r.enum:=R_ECX;
+                    r.number:=NR_ECX;
                     a_load_reg_reg(list,OS_32,OS_32,tmpreg,r);
                     free_scratch_reg(list,tmpreg);
                   end;
-                r.enum:=R_ECX;
+                r.number:=NR_ECX;
                 if popecx then
                   list.concat(taicpu.op_reg(A_POP,S_L,r))
                 else if not (dst.enum in [R_ECX,R_CX,R_CL]) then
@@ -1133,7 +1145,8 @@ unit cgx86;
          var r:Tregister;
 
          begin
-           r.enum:=R_ECX;
+           r.enum:=R_INTREGISTER;
+           r.number:=NR_ECX;
            if not(R_ECX in rg.unusedregsint) then
              begin
                list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
@@ -1147,13 +1160,14 @@ unit cgx86;
             ((len<=8) or
              (not(cs_littlesize in aktglobalswitches ) and (len<=12))) then
            begin
+              r.enum:=R_INTREGISTER;
               helpsize:=len shr 2;
               rg.getexplicitregisterint(list,R_EDI);
               dstref:=dest;
               srcref:=source;
               for i:=1 to helpsize do
                 begin
-                   r.enum:=R_EDI;
+                   r.number:=NR_EDI;
                    a_load_ref_reg(list,OS_32,srcref,r);
                    If (len = 4) and delsource then
                      reference_release(list,source);
@@ -1164,7 +1178,7 @@ unit cgx86;
                 end;
               if len>1 then
                 begin
-                   r.enum:=R_DI;
+                   r.number:=NR_DI;
                    a_load_ref_reg(list,OS_16,srcref,r);
                    If (len = 2) and delsource then
                      reference_release(list,source);
@@ -1175,6 +1189,9 @@ unit cgx86;
                 end;
               r.enum:=R_EDI;
               rg.ungetregisterint(list,r);
+              r.enum:=R_INTREGISTER;
+              reg8.enum:=R_INTREGISTER;
+              reg32.enum:=R_INTREGISTER;
               if len>0 then
                 begin
                    { and now look for an 8 bit register }
@@ -1190,25 +1207,25 @@ unit cgx86;
                          { one is always not index or base          }
                          if (dest.base.enum<>R_EAX) and (dest.index.enum<>R_EAX) then
                            begin
-                              reg8.enum:=R_AL;
-                              reg32.enum:=R_EAX;
+                              reg8.number:=NR_AL;
+                              reg32.number:=NR_EAX;
                            end
                          else if (dest.base.enum<>R_EBX) and (dest.index.enum<>R_EBX) then
                            begin
-                              reg8.enum:=R_BL;
-                              reg32.enum:=R_EBX;
+                              reg8.number:=NR_BL;
+                              reg32.number:=NR_EBX;
                            end
                          else if (dest.base.enum<>R_ECX) and (dest.index.enum<>R_ECX) then
                            begin
-                              reg8.enum:=R_CL;
-                              reg32.enum:=R_ECX;
+                              reg8.number:=NR_CL;
+                              reg32.number:=NR_ECX;
                            end;
                       end;
                    if swap then
                      { was earlier XCHG, of course nonsense }
                      begin
                        rg.getexplicitregisterint(list,R_EDI);
-                       r.enum:=R_EDI;
+                       r.number:=NR_EDI;
                        a_load_reg_reg(list,OS_32,OS_32,reg32,r);
                      end;
                    a_load_ref_reg(list,OS_8,srcref,reg8);
@@ -1217,21 +1234,31 @@ unit cgx86;
                    a_load_reg_ref(list,OS_8,reg8,dstref);
                    if swap then
                      begin
-                       r.enum:=R_EDI;
+                       r.number:=NR_EDI;
                        a_load_reg_reg(list,OS_32,OS_32,r,reg32);
+                       r.enum:=R_EDI;
                        rg.ungetregisterint(list,r);
                      end
                    else
-                     rg.ungetregister(list,reg8);
+                     begin
+                        if reg8.number=NR_AL then
+                          reg8.enum:=R_AL
+                        else if reg8.number=NR_BL then
+                          reg8.enum:=R_BL
+                        else if reg8.number=NR_CL then
+                          reg8.enum:=R_CL;
+                        rg.ungetregister(list,reg8);
+                     end;
                 end;
            end
          else
            begin
-              r.enum:=R_EDI;
+              r.enum:=R_INTREGISTER;
+              r.number:=NR_EDI;
               rg.getexplicitregisterint(list,R_EDI);
               a_loadaddr_ref_reg(list,dest,r);
-              r.enum:=R_ESI;
-              list.concat(tai_regalloc.Alloc(r));
+              r.number:=NR_ESI;
+              list.concat(tai_regalloc.alloc(r));
               if loadref then
                 a_load_ref_reg(list,OS_ADDR,source,r)
               else
@@ -1243,7 +1270,7 @@ unit cgx86;
 
               list.concat(Taicpu.Op_none(A_CLD,S_NO));
               ecxpushed:=false;
-              r.enum:=R_ECX;
+              r.number:=NR_ECX;
               if cs_littlesize in aktglobalswitches  then
                 begin
                    maybepushecx;
@@ -1273,13 +1300,19 @@ unit cgx86;
                 end;
               r.enum:=R_EDI;
               rg.ungetregisterint(list,r);
-              r.enum:=R_ESI;
-              list.concat(tai_regalloc.DeAlloc(r));
-              r.enum:=R_ECX;
+              r.enum:=R_INTREGISTER;
+              r.number:=NR_ESI;
+              list.concat(tai_regalloc.dealloc(r));
               if ecxpushed then
-                list.concat(Taicpu.Op_reg(A_POP,S_L,r))
+                begin
+                  r.number:=NR_ECX;
+                  list.concat(Taicpu.Op_reg(A_POP,S_L,r))
+                end
               else
-                rg.ungetregisterint(list,r);
+                begin
+                  r.enum:=R_ECX;
+                  rg.ungetregisterint(list,r);
+                end;
 
               { loading SELF-reference again }
               g_maybe_loadself(list);
@@ -1295,7 +1328,8 @@ unit cgx86;
     var r:Tregister;
 
     begin
-        r.enum:=R_EAX;
+        r.enum:=R_INTREGISTER;
+        r.number:=NR_EAX;
         list.concat(Taicpu.op_reg(A_PUSH,S_L,r));
     end;
 
@@ -1310,7 +1344,8 @@ unit cgx86;
     var r:Tregister;
 
     begin
-        r.enum:=R_EAX;
+        r.enum:=R_INTREGISTER;
+        r.number:=NR_EAX;
         list.concat(Taicpu.op_reg(A_POP,S_L,r));
     end;
 
@@ -1469,27 +1504,27 @@ unit cgx86;
 
     begin
         r.enum:=R_INTREGISTER;
-        r.enum:=R_GS;
+        r.number:=NR_GS;
         { .... also the segment registers }
         list.concat(Taicpu.Op_reg(A_PUSH,S_W,r));
-        r.enum:=R_FS;
+        r.number:=NR_FS;
         list.concat(Taicpu.Op_reg(A_PUSH,S_W,r));
-        r.enum:=R_ES;
+        r.number:=NR_ES;
         list.concat(Taicpu.Op_reg(A_PUSH,S_W,r));
-        r.enum:=R_DS;
+        r.number:=NR_DS;
         list.concat(Taicpu.Op_reg(A_PUSH,S_W,r));
         { save the registers of an interrupt procedure }
-        r.enum:=R_EDI;
+        r.number:=NR_EDI;
         list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
-        r.enum:=R_ESI;
+        r.number:=NR_ESI;
         list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
-        r.enum:=R_EDX;
+        r.number:=NR_EDX;
         list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
-        r.enum:=R_ECX;
+        r.number:=NR_ECX;
         list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
-        r.enum:=R_EBX;
+        r.number:=NR_EBX;
         list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
-        r.enum:=R_EAX;
+        r.number:=NR_EAX;
         list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
     end;
 
@@ -1687,7 +1722,8 @@ unit cgx86;
     var r:Tregister;
 
       begin
-        r.enum:=R_EDI;
+        r.enum:=R_INTREGISTER;
+        r.number:=NR_EDI;
         if is_class(procinfo._class) then
           begin
             if (cs_implicit_exceptions in aktmoduleswitches) then
@@ -1874,7 +1910,11 @@ unit cgx86;
 end.
 {
   $Log$
-  Revision 1.28  2003-01-09 20:41:00  daniel
+  Revision 1.29  2003-01-13 14:54:34  daniel
+    * Further work to convert codegenerator register convention;
+      internalerror bug fixed.
+
+  Revision 1.28  2003/01/09 20:41:00  daniel
     * Converted some code in cgx86.pas to new register numbering
 
   Revision 1.27  2003/01/08 18:43:58  daniel