Browse Source

+ first implementation of PowerPC/MorphOS do_syscall

Károly Balogh 21 years ago
parent
commit
3c785c3405
1 changed files with 54 additions and 4 deletions
  1. 54 4
      compiler/powerpc/nppccal.pas

+ 54 - 4
compiler/powerpc/nppccal.pas

@@ -32,6 +32,7 @@ interface
     type
     type
        tppccallnode = class(tcgcallnode)
        tppccallnode = class(tcgcallnode)
          procedure extra_call_code;override;
          procedure extra_call_code;override;
+         procedure do_syscall;override;
        end;
        end;
 
 
 
 
@@ -52,7 +53,7 @@ implementation
       cgbase,pass_2,
       cgbase,pass_2,
       cpuinfo,cpubase,aasmbase,aasmtai,aasmcpu,
       cpuinfo,cpubase,aasmbase,aasmtai,aasmcpu,
       nmem,nld,ncnv,
       nmem,nld,ncnv,
-      ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,
+      ncgutil,cgutils,cgobj,tgobj,regvars,rgobj,rgcpu,
       cg64f32,cgcpu,cpupi,procinfo;
       cg64f32,cgcpu,cpupi,procinfo;
 
 
 
 
@@ -66,14 +67,64 @@ implementation
               exprasmlist.concat(taicpu.op_const_const_const(A_CRXOR,6,6,6));
               exprasmlist.concat(taicpu.op_const_const_const(A_CRXOR,6,6,6));
           end;
           end;
       end;
       end;
-
+        
+    procedure tppccallnode.do_syscall;
+      var 
+        tmpref: treference;
+      begin
+        case target_info.system of
+          system_powerpc_morphos:
+            begin
+              cg.a_reg_alloc(exprasmlist,NR_STACK_POINTER_REG);
+              cg.a_reg_alloc(exprasmlist,NR_R0);
+              cg.a_reg_alloc(exprasmlist,NR_R3);
+
+              { save link register }
+              exprasmlist.concat(taicpu.op_reg(A_MFLR,NR_R0));
+              reference_reset_base(tmpref,NR_STACK_POINTER_REG,LA_LR_SYSV);
+              exprasmlist.concat(taicpu.op_reg_ref(A_STW,NR_R0,tmpref));
+              
+              { adjust stack ptr }
+              reference_reset_base(tmpref,NR_STACK_POINTER_REG,-8); { ??? }
+              exprasmlist.concat(taicpu.op_reg_ref(A_STWU,NR_STACK_POINTER_REG,tmpref));
+                            
+              { store call offset into R3 }
+              exprasmlist.concat(taicpu.op_reg_const(A_LI,NR_R3,tprocdef(procdefinition).extnumber));
+              
+              { prepare LR, and call function }
+              reference_reset(tmpref);
+              tmpref.base := NR_R2;
+              tmpref.offset := 100; { EmulDirectCallOS offset }
+              exprasmlist.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
+              exprasmlist.concat(taicpu.op_reg(A_MTLR,NR_R0));
+              exprasmlist.concat(taicpu.op_none(A_BLRL));
+              
+              { adjust back stack ptr }
+              exprasmlist.concat(taicpu.op_reg_reg_const(A_ADDI,NR_R1,NR_R1,8)); { ??? }
+              
+              { restore link register }
+              reference_reset_base(tmpref,NR_STACK_POINTER_REG,LA_LR_SYSV);
+              exprasmlist.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
+              exprasmlist.concat(taicpu.op_reg(A_MTLR,NR_R0));
+              
+              cg.a_reg_dealloc(exprasmlist,NR_STACK_POINTER_REG);
+              cg.a_reg_dealloc(exprasmlist,NR_R0);
+              cg.a_reg_dealloc(exprasmlist,NR_R3);
+            end;
+          else
+            internalerror(2004042901);
+        end;      
+      end;
 
 
 begin
 begin
    ccallnode:=tppccallnode;
    ccallnode:=tppccallnode;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.23  2003-12-28 22:09:12  florian
+  Revision 1.24  2004-04-29 14:01:23  karoly
+    + first implementation of PowerPC/MorphOS do_syscall
+
+  Revision 1.23  2003/12/28 22:09:12  florian
     + setting of bit 6 of cr for c var args on ppc implemented
     + setting of bit 6 of cr for c var args on ppc implemented
 
 
   Revision 1.22  2003/10/01 20:34:49  peter
   Revision 1.22  2003/10/01 20:34:49  peter
@@ -163,4 +214,3 @@ end.
   Revision 1.1  2002/08/13 21:40:59  florian
   Revision 1.1  2002/08/13 21:40:59  florian
     * more fixes for ppc calling conventions
     * more fixes for ppc calling conventions
 }
 }
-