{
    $Id$
    This file is part of the Free Pascal run time library.

    Copyright (c) 2001 by Jonas Maebe,
    member of the Free Pascal development team

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}

{ This unit provides the same Functionality as the TypInfo Unit }
{ of Delphi                                                     }
{ ---------------------------------------------------------------------
  This include contains cpu-specific Low-level calling of methods.
  ---------------------------------------------------------------------}

Function CallIntegerFunc(s: Pointer; Address: Pointer; Index, IValue: LongInt): Int64; assembler;
  { input:             }
  {     r3: s          }
  {     r4: address    }
  {     r5: index      }
  {     r6: ivalue     }
  { output:            }
  {     r3-r4: result  }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0
     stw       r0,oldlr
     mtctr     r4
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                      }
     mr        r4,r6
     bctrl
     { restore return address }
     lwz       r0,oldlr
     mtlr      r0
  end;

Function CallIntegerProc(s : Pointer;Address : Pointer;Value : Integer; Index,IValue : Longint) : Integer;assembler;
  { input:             }
  {     r3: s          }
  {     r4: address    }
  {     r5: index      }
  {     r6: ivalue     }
  { output:            }
  {     r3: result     }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0 
     stw       r0,oldlr
     mtctr     r4
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                      }
     mr        r4,r6
     bctrl
     { restore return address }
     lwz       r0,oldlr
     mtlr      r0
  end;

Function CallSingleFunc(s : Pointer;Address : Pointer; Index,IValue : Longint) : Single;assembler;
  { input:             }
  {     r3: s          }
  {     r4: address    }
  {     r5: index      }
  {     r6: ivalue     }
  { output:            }
  {     fr1: result    }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0 
     stw       r0,oldlr
     mtctr     r4
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                      }
     mr        r4,r6
     bctrl
     { restore return address }
     lwz       r0,oldlr
     mtlr      r0
  end;

Function CallDoubleFunc(s : Pointer;Address : Pointer; Index,IValue : Longint) : Double;assembler;
  { input:             }
  {     r3: s          }
  {     r4: address    }
  {     r5: index      }
  {     r6: ivalue     }
  { output:            }
  {     fr1: result    }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0 
     stw       r0,oldlr
     mtctr     r4
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                      }
     mr        r4,r6
     bctrl
     { restore return address }
     lwz       r0,oldlr
     mtlr      r0
  end;

Function CallExtendedFunc(s : Pointer;Address : Pointer; Index,IValue : Longint) : Extended;assembler;
  { input:             }
  {     r3: s          }
  {     r4: address    }
  {     r5: index      }
  {     r6: ivalue     }
  { output:            }
  {     fr1: result    }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0 
     stw       r0,oldlr
     mtctr     r4
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                      }
     mr        r4,r6
     bctrl
     { restore return address }
     lwz       r0,oldlr
     mtlr      r0
  end;

Function CallBooleanFunc(s : Pointer;Address : Pointer; Index,IValue : Longint) : Boolean;assembler;
  { input:             }
  {     r3: s          }
  {     r4: address    }
  {     r5: index      }
  {     r6: ivalue     }
  { output:            }
  {     r3: result     }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0 
     stw       r0,oldlr
     mtctr     r4
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                       }
     mr        r4,r6
     bctrl
     { restore return address }
     lwz       r0, oldlr
     mtlr      r0
  end;

Procedure CallSStringFunc(s : Pointer;Address : Pointer; INdex,IValue : Longint;
                        Var Res: Shortstring);assembler;
  { input:                                       }
  {     r3: address of shortstring result (temp) }
  {     r4: s                                    }
  {     r5: address                              }
  {     r6: index                                }
  {     r7: ivalue                               }
  {     r8: res                                  }
  { output:                                      }
  {     none                                     }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0 
     stw       r0,oldlr
     mtctr     r5
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                       }
     mr        r5,r7
     bctrl
     { restore return address }
     lwz       r0,oldlr
     mtlr      r0
  end;


Procedure CallSStringProc(s : Pointer;Address : Pointer;Const Value : ShortString; INdex,IVAlue : Longint);assembler;
  { input:                                 }
  {     r3: s                              }
  {     r4: address                        }
  {     r5: value (address of shortstring) }
  {     r6: index                          }
  {     r7: ivalue                         }
  { output:                                }
  {     none                               }
  var
    oldlr: pointer;
  asm
     { save current return address }
     mflr      r0 
     stw       r0,oldlr
     mtctr     r4
     { always pass ivalue as second parameter, it doesn't matter if it }
     { isn't used                                                       }
     mr        r4,r6
     bctrl
     { restore return address }
     lwz       r0,oldlr
     mtlr      r0
  end;

{
  $Log$
  Revision 1.7  2003-04-24 12:28:47  jonas
    * fixeed saving/restoring of return address
    * synchronized with i386 version

  Revision 1.6  2003/04/24 11:50:50  florian
    * fixed assembling

  Revision 1.5  2003/04/24 11:47:21  florian
    * fixed wrong newlines

  Revision 1.4  2003/04/23 22:47:13  florian
    * fixed compilation

  Revision 1.3  2003/04/23 22:19:21  peter
    * sstringfunc para updated

  Revision 1.2  2002/09/07 16:01:26  peter
    * old logs removed and tabs fixed

}
