#ifndef _MD5_BYTESWAP_H
#define _MD5_BYTESWAP_H
#include <sys/types.h>
#if defined(__sparc)
#include <v9/sys/asi.h>
#elif defined(_LITTLE_ENDIAN)
#include <sys/byteorder.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_LITTLE_ENDIAN)
#if !defined(__i386) && !defined(__amd64)
#define _MD5_CHECK_ALIGNMENT
#endif
#define LOAD_LITTLE_32(addr) (*(uint32_t *)(void *)(addr))
#else
#if defined(sun4u)
#define _MD5_CHECK_ALIGNMENT
#define LOAD_LITTLE_32(addr) load_little_32((uint32_t *)(void *)(addr))
#if !defined(__lint) && defined(__GNUC__)
static __inline__ uint32_t
load_little_32(uint32_t *addr)
{
uint32_t value;
__asm__(
"lduwa [%1] %2, %0\n\t"
: "=r" (value)
: "r" (addr), "i" (ASI_PL));
return (value);
}
#endif
#if !defined(__GNUC__)
extern uint32_t load_little_32(uint32_t *);
#endif
#if defined(__lint)
uint32_t
load_little_32(uint32_t *addr)
{
return (*addr);
}
#endif
#elif defined(_LITTLE_ENDIAN)
#define LOAD_LITTLE_32(addr) htonl(addr)
#else
#define LOAD_LITTLE_32(addr) \
((addr)[0] | ((addr)[1] << 8) | ((addr)[2] << 16) | ((addr)[3] << 24))
#endif
#if defined(sun4v)
#define LOAD_LITTLE_32_0(addr) load_little_32_0((uint32_t *)(addr))
#define LOAD_LITTLE_32_1(addr) load_little_32_1((uint32_t *)(addr))
#define LOAD_LITTLE_32_2(addr) load_little_32_2((uint32_t *)(addr))
#define LOAD_LITTLE_32_3(addr) load_little_32_3((uint32_t *)(addr))
#define LOAD_LITTLE_32_4(addr) load_little_32_4((uint32_t *)(addr))
#define LOAD_LITTLE_32_5(addr) load_little_32_5((uint32_t *)(addr))
#define LOAD_LITTLE_32_6(addr) load_little_32_6((uint32_t *)(addr))
#define LOAD_LITTLE_32_7(addr) load_little_32_7((uint32_t *)(addr))
#define LOAD_LITTLE_32_8(addr) load_little_32_8((uint32_t *)(addr))
#define LOAD_LITTLE_32_9(addr) load_little_32_9((uint32_t *)(addr))
#define LOAD_LITTLE_32_a(addr) load_little_32_a((uint32_t *)(addr))
#define LOAD_LITTLE_32_b(addr) load_little_32_b((uint32_t *)(addr))
#define LOAD_LITTLE_32_c(addr) load_little_32_c((uint32_t *)(addr))
#define LOAD_LITTLE_32_d(addr) load_little_32_d((uint32_t *)(addr))
#define LOAD_LITTLE_32_e(addr) load_little_32_e((uint32_t *)(addr))
#define LOAD_LITTLE_32_f(addr) load_little_32_f((uint32_t *)(addr))
#if !defined(__lint) && defined(__GNUC__)
static __inline__ void
set_little(uint8_t asi)
{
__asm__ __volatile__(
"wr %%g0, %0, %%asi\n\t"
:
: "r" (asi));
}
static __inline__ uint8_t
get_little(void)
{
uint8_t asi;
__asm__ __volatile__(
"rd %%asi, %0\n\t"
: "=r" (asi));
return (asi);
}
#define LL_TEMPLATE(__off) \
static __inline__ uint32_t \
load_little_32_##__off(uint32_t *addr) \
{ \
uint32_t value; \
__asm__( \
"lduwa [%1 + %2]%%asi, %0\n\t" \
: "=r" (value) \
: "r" (addr), "i" ((0x##__off) << 2)); \
return (value); \
}
LL_TEMPLATE(0)
LL_TEMPLATE(1)
LL_TEMPLATE(2)
LL_TEMPLATE(3)
LL_TEMPLATE(4)
LL_TEMPLATE(5)
LL_TEMPLATE(6)
LL_TEMPLATE(7)
LL_TEMPLATE(8)
LL_TEMPLATE(9)
LL_TEMPLATE(a)
LL_TEMPLATE(b)
LL_TEMPLATE(c)
LL_TEMPLATE(d)
LL_TEMPLATE(e)
LL_TEMPLATE(f)
#undef LL_TEMPLATE
#endif
#if !defined(__GNUC__)
extern void set_little(uint32_t);
extern uint32_t get_little(void);
extern uint32_t load_little_32_0(uint32_t *);
extern uint32_t load_little_32_1(uint32_t *);
extern uint32_t load_little_32_2(uint32_t *);
extern uint32_t load_little_32_3(uint32_t *);
extern uint32_t load_little_32_4(uint32_t *);
extern uint32_t load_little_32_5(uint32_t *);
extern uint32_t load_little_32_6(uint32_t *);
extern uint32_t load_little_32_7(uint32_t *);
extern uint32_t load_little_32_8(uint32_t *);
extern uint32_t load_little_32_9(uint32_t *);
extern uint32_t load_little_32_a(uint32_t *);
extern uint32_t load_little_32_b(uint32_t *);
extern uint32_t load_little_32_c(uint32_t *);
extern uint32_t load_little_32_d(uint32_t *);
extern uint32_t load_little_32_e(uint32_t *);
extern uint32_t load_little_32_f(uint32_t *);
#endif
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif