#!/usr/bin/env sh

# The first command argument $1 tells us which flavour to generate for
# the rest of the command line arguments.

what=$1
shift

if [ "x$*" = "x" ]; then
    none="(none)"
fi

case ${what} in
    header)
            cat << EOF
;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
;;
;; This file is part of LIBF7, which is part of GCC.
;;
;; GCC is free software; you can redistribute it and/or modify it under
;; the terms of the GNU General Public License as published by the Free
;; Software Foundation; either version 3, or (at your option) any later
;; version.
;;
;; GCC 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.  See the GNU General Public License
;; for more details.
;;
;; Under Section 7 of GPL version 3, you are granted additional
;; permissions described in the GCC Runtime Library Exception, version
;; 3.1, as published by the Free Software Foundation.
;;
;; You should have received a copy of the GNU General Public License and
;; a copy of the GCC Runtime Library Exception along with this program;
;; see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
;; <http://www.gnu.org/licenses/>.  */

;; Auto-generated file, do not change by hand.
;;
;; Wrappers for double and long double functions to use functions that
;; operate on f7_t, and get f7_t* and const f7_t*.
;;
;; Generated by: `basename $0`
;; Included by : libf7-asm.sx
EOF
        for n in $*; do
            echo ";; $n"
        done
        ;;

    xd_libgcc)
        cat << EOF

;; Functions that usually live in libgcc: __<name> for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; type_t __${n} (double)  ; $n
#ifdef F7MOD_D_${n}_
_DEFUN __${n}
    .global F7_NAME($n)
    ldi     ZH,     hi8(gs(F7_NAME($n)))
    ldi     ZL,     lo8(gs(F7_NAME($n)))
    F7jmp   call_xd
_ENDF __${n}
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    dx_libgcc)
        cat << EOF

;; Functions that usually live in libgcc: __<name> for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; double __${n} (type_t)  ; $n
#ifdef F7MOD_D_${n}_
_DEFUN __${n}
    .global F7_NAME($n)
    ldi     ZH,     hi8(gs(F7_NAME($n)))
    ldi     ZL,     lo8(gs(F7_NAME($n)))
    F7jmp   call_dx
_ENDF __${n}
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    ddd_libgcc)
        cat << EOF

;; Functions that usually live in libgcc: __<name>df3 for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; double __${n}df3 (double, double)  ; $n
#ifdef F7MOD_D_${n}_
_DEFUN __${n}df3
    ALIAS __$n
    .global F7_NAME($n)
    ldi     ZH,     hi8(gs(F7_NAME($n)))
    ldi     ZL,     lo8(gs(F7_NAME($n)))
    F7jmp   call_ddd
_ENDF __${n}df3
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    xdd_libgcc_cmp)
        cat << EOF

;; Functions that usually live in libgcc: __<name>df2 for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; bool __${n}df2 (double, double)  ; $n
#ifdef F7MOD_D_${n}_
_DEFUN __${n}df2
    .global F7_NAME(${n}_impl)
    ldi     ZH,     hi8(gs(F7_NAME(${n}_impl)))
    ldi     ZL,     lo8(gs(F7_NAME(${n}_impl)))
    F7jmp   call_xdd
_ENDF __${n}df2
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    dd_math)
        cat << EOF

;; Functions that usually live in libm:  Depending on [long] double layout,
;; define <name> and <name>l as weak alias(es) of __<name> for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; double __${n} (double)
#ifdef F7MOD_D_${n}_
_DEFUN __${n}
    DALIAS $n
    LALIAS ${n}l
    .global F7_NAME($n)
    ldi     ZH,     hi8(gs(F7_NAME($n)))
    ldi     ZL,     lo8(gs(F7_NAME($n)))
    F7jmp   call_dd
_ENDF __${n}
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    xd_math)
        cat << EOF

;; Functions that usually live in libm:  Depending on [long] double layout,
;; define <name> and <name>l as weak alias(es) of __<name> for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; type_t __${n} (double)
#ifdef F7MOD_D_${n}_
_DEFUN __${n}
    DALIAS $n
    LALIAS ${n}l
    .global F7_NAME($n)
    ldi     ZH,     hi8(gs(F7_NAME($n)))
    ldi     ZL,     lo8(gs(F7_NAME($n)))
    F7jmp   call_xd
_ENDF __${n}
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    ddd_math)
        cat << EOF

;; Functions that usually live in libm:  Depending on [long] double layout,
;; define <name> and <name>l as weak alias(es) of __<name> for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; double __${n} (double, double)
#ifdef F7MOD_D_${n}_
_DEFUN __${n}
    DALIAS $n
    LALIAS ${n}l
    .global F7_NAME($n)
    ldi     ZH,     hi8(gs(F7_NAME($n)))
    ldi     ZL,     lo8(gs(F7_NAME($n)))
    F7jmp   call_ddd
_ENDF __${n}
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    ddx_math)
        cat << EOF

;; Functions that usually live in libm:  Depending on [long] double layout,
;; define <name> and <name>l as weak alias(es) of __<name> for <name> in:
;; $*${none}
EOF
        for n in $*; do
            cat << EOF

;; double __${n} (double, word_t)
#ifdef F7MOD_D_${n}_
_DEFUN __${n}
    DALIAS $n
    LALIAS ${n}l
    .global F7_NAME($n)
    ldi     ZH,     hi8(gs(F7_NAME($n)))
    ldi     ZL,     lo8(gs(F7_NAME($n)))
    F7jmp   call_ddx
_ENDF __${n}
#endif /* F7MOD_D_${n}_ */
EOF
        done
        ;;

    *)
        exit 1
        ;;
esac
