/***
*divhelp.c - Div/Rem helpers for IA64
*
*       Copyright (c) 2001, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Define a number of IA64 compiler support functions used to implement
*       integral divide and remainder in code compiled -Os.
*
*******************************************************************************/

/*
** First, turn on global optimizations and optimize for speed,
** so that compiler generates division/reminder inline.
*/

#pragma optimize ("gt", on)

/*
** Now proper helper functions.
*/

unsigned char __udiv8 (unsigned char i, unsigned char j)
{
    return i / j;
}

unsigned char __urem8 (unsigned char i, unsigned char j)
{
    return i % j;
}

signed char __div8 (signed char i, signed char j)
{
    return i / j;
}

signed char __rem8 (signed char i, signed char j)
{
    return i % j;
}

unsigned short __udiv16 (unsigned short i, unsigned short j)
{
    return i / j;
}

unsigned short __urem16 (unsigned short i, unsigned short j)
{
    return i % j;
}

signed short __div16 (signed short i, signed short j)
{
    return i / j;
}

signed short __rem16 (signed short i, signed short j)
{
    return i % j;
}

unsigned int __udiv32 (unsigned int i, unsigned int j)
{
    return i / j;
}

unsigned int __urem32 (unsigned int i, unsigned int j)
{
    return i % j;
}

signed int __div32 (signed int i, signed int j)
{
    return i / j;
}

signed int __rem32 (signed int i, signed int j)
{
    return i % j;
}

unsigned __int64 __udiv64 (unsigned __int64 i, unsigned __int64 j)
{
    return i / j;
}

unsigned __int64 __urem64 (unsigned __int64 i, unsigned __int64 j)
{
    return i % j;
}

signed __int64 __div64 (signed __int64 i, signed __int64 j)
{
    return i / j;
}

signed __int64 __rem64 (signed __int64 i, signed __int64 j)
{
    return i % j;
}

struct udivrem {
    unsigned __int64 div;
    unsigned __int64 rem;
};

struct divrem {
    signed __int64 div;
    signed __int64 rem;
};

struct udivrem __udivrem8 (unsigned char i, unsigned char j)
{
    struct udivrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}

struct divrem __divrem8 (signed char i, signed char j)
{
    struct divrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}

struct udivrem __udivrem16 (unsigned short i, unsigned short j)
{
    struct udivrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}

struct divrem __divrem16 (signed short i, signed short j)
{
    struct divrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}

struct udivrem __udivrem32 (unsigned int i, unsigned int j)
{
    struct udivrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}

struct divrem __divrem32 (signed int i, signed int j)
{
    struct divrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}

struct udivrem __udivrem64 (unsigned __int64 i, unsigned __int64 j)
{
    struct udivrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}

struct divrem __divrem64 (signed __int64 i, signed __int64 j)
{
    struct divrem s;

    s.div = i / j;
    s.rem = i % j;
    return s;
}
