Browse Source

Handle simple cases where a record member is passed in a register on AVR, and referenced from inline assembly.

git-svn-id: trunk@37864 -
Jeppe Johansen 7 years ago
parent
commit
e699be78ab
1 changed files with 14 additions and 1 deletions
  1. 14 1
      compiler/ncgbas.pas

+ 14 - 1
compiler/ncgbas.pas

@@ -181,7 +181,12 @@ interface
                     MessagePos(filepos,asmr_e_invalid_reference_syntax);
                   { Subscribed access }
                   if forceref or
-                     (sofs<>0) then
+{$ifdef avr}                     
+                     (sofs>=tcgsize2size[sym.localloc.size])
+{$else avr}
+                     (sofs<>0)
+{$endif avr}
+                     then
                     begin
                       op.typ:=top_ref;
                       new(op.ref);
@@ -196,6 +201,14 @@ interface
                     begin
                       op.typ:=top_reg;
                       op.reg:=sym.localloc.register;
+
+{$ifdef avr}
+                      case sofs of
+                        1: op.reg:=cg.GetNextReg(op.reg);
+                        2: op.reg:=cg.GetNextReg(cg.GetNextReg(op.reg));
+                        3: op.reg:=cg.GetNextReg(cg.GetNextReg(cg.GetNextReg(op.reg)));
+                      end;
+{$endif avr}
                     end;
                 end;
               LOC_FPUREGISTER,