/**************************************************************************/
/*                                                                        */
/*                                 Sources                                */
/*                                from  the                               */
/*                           XSC SOFTWARE PACKAGE                         */
/*                                                                        */
/*                Copyright (c) 1997 University of Karlsruhe              */
/*                     Institute for Appl. Mathematics                    */
/*                                                                        */
/* This program is free software for non-commercial use. For details, see */
/* the file LICENSE.XSC, distributed with this software package.          */
/*                                                                        */
/* This program is distributed WITHOUT ANY WARRANTY. For details, see the */
/* file LICENSE.XSC, distributed with this software package.              */
/*                                                                        */
/**************************************************************************/

/* RCS $Id: r_ari.s,v 1.2 1997/09/25 16:08:05 ae59 Exp $ */
/*
$Log: r_ari.s,v $
# Revision 1.2  1997/09/25  16:08:05  ae59
# Copyright message
#
# Revision 1.1  1994/01/27  13:41:08  ae59
# Put under RCS control
#
 */
/****************************************************************/
/*                                                              */
/*      Filename        : r_ari.s                               */
/*                                                              */
/*      Entries         : a_real r_addd(a,b)                    */
/*                        a_real r_addn(a,b)                    */
/*                        a_real r_addu(a,b)                    */
/*                        a_real r_subd(a,b)                    */
/*                        a_real r_subn(a,b)                    */
/*                        a_real r_subu(a,b)                    */
/*                        a_real r_muld(a,b)                    */
/*                        a_real r_muln(a,b)                    */
/*                        a_real r_mulu(a,b)                    */
/*                        a_real r_divd(a,b)                    */
/*                        a_real r_divn(a,b)                    */
/*                        a_real r_divu(a,b)                    */
/*                        a_real a,b;                           */
/*                        void   r_lfsr()                       */
/*                                                              */
/*      Arguments       : a = first IEEE operand of operation   */
/*                        b = second IEEE operand of operation  */
/*                                                              */
/*      Description     : Addition, Subtraction,                */
/*                        Multiplication, Division of IEEE      */
/*                        numbers. Result is rounded downwards, */
/*                        nearest or upwards according to the   */
/*                        suffix.                               */
/*                        Assembly routines for Sun SPARC.      */
/*                                                              */
/*      Date            : 1992-07-08                            */
/*      1992-07-08 : changed fsrd to e_srd according name conv. */
/*      1992-07-07 : add function _r_lfsr cb                    */
/*      1992-05-04 : old                                        */
/****************************************************************/
/*                                                              */
/* Parameteruebergabe:                                          */
/* Eingabezahlen stehen in %i0,%i1 und %i2,%i3                  */
/* Resultat steht in %f0,%f1                                    */
/*                                                              */
/****************************************************************/


     .seg "text"
     .align    4

     .global _r_addd, _r_addn, _r_addu
     .global _r_subd, _r_subn, _r_subu
     .global _r_muld, _r_muln, _r_mulu
     .global _r_divd, _r_divn, _r_divu
        .global _r_lfsr

_r_addd:
     save %sp, -64, %sp             ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdd), %l0    ! fsr laden, round down
     ld   [%l0+%lo(_e_srdd)], %fsr
     st   %i0, [%fp+0x44]           ! Eingabe speichern (im stack
     st   %i1, [%fp+0x48]           ! frame des Aufrufers)
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2           ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     faddd     %f2, %f4, %f0        ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdd)]  ! fsr speichern (fuer exc. bits)
     ret                            ! zurueck
     restore                        ! davor ein restore

_r_addn:
     save %sp, -64, %sp             ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdn), %l0    ! fsr laden, round near
     ld   [%l0+%lo(_e_srdn)], %fsr
     st   %i0, [%fp+0x44]           ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     faddd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdn)] ! fsr speichern
     ret                 ! zurueck
     restore

_r_addu:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdu), %l0   ! fsr laden, round up
     ld   [%l0+%lo(_e_srdu)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     faddd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdu)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_subd:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdd), %l0   ! fsr laden, round down
     ld   [%l0+%lo(_e_srdd)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fsubd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdd)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_subn:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdn), %l0   ! fsr laden, round near
     ld   [%l0+%lo(_e_srdn)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fsubd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdn)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_subu:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdu), %l0   ! fsr laden, round up
     ld   [%l0+%lo(_e_srdu)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fsubd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdu)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_muld:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdd), %l0   ! fsr laden, round down
     ld   [%l0+%lo(_e_srdd)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fmuld     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdd)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_muln:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdn), %l0   ! fsr laden, round near
     ld   [%l0+%lo(_e_srdn)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fmuld     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdn)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_mulu:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdu), %l0   ! fsr laden, round up
     ld   [%l0+%lo(_e_srdu)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fmuld     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdu)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_divd:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdd), %l0   ! fsr laden, round down
     ld   [%l0+%lo(_e_srdd)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fdivd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdd)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_divn:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdn), %l0   ! fsr laden, round near
     ld   [%l0+%lo(_e_srdn)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fdivd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdn)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_divu:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdu), %l0   ! fsr laden, round up
     ld   [%l0+%lo(_e_srdu)], %fsr
     st   %i0, [%fp+0x44]          ! Eingabe speichern
     st   %i1, [%fp+0x48]
     st   %i2, [%fp+0x4c]
     st   %i3, [%fp+0x50]
     ld   [%fp+0x44], %f2          ! Eingabe in die FPU laden
     ld   [%fp+0x48], %f3
     ld   [%fp+0x4c], %f4
     ld   [%fp+0x50], %f5
     fdivd     %f2, %f4, %f0       ! Ergebnis nach %f0,%f1
     st   %fsr, [%l0+%lo(_e_srdu)] ! fsr speichern
     ret                           ! zurueck
     restore

_r_lfsr:
     save %sp, -64, %sp            ! Platz auf Stack fuer Register
     sethi     %hi(_e_srdn), %l0   ! fsr laden, round near
     ld   [%l0+%lo(_e_srdn)], %fsr
     ret                           ! zurueck
     restore

