platform ps2, handle audio similar to psp
[picodrive.git] / pico / pico_port.h
CommitLineData
bce14421 1#ifndef PICO_PORT_INCLUDED
2#define PICO_PORT_INCLUDED
3
48c9e01b 4// provide size_t, uintptr_t
5#include <stdlib.h>
6#if !(defined(_MSC_VER) && _MSC_VER < 1800)
7#include <stdint.h>
8#endif
57c5a5e5 9#include "pico_types.h"
48c9e01b 10
73bda1ad 11#ifdef USE_LIBRETRO_VFS
12#include "file_stream_transforms.h"
13#endif
14
bce14421 15#if defined(__GNUC__) && defined(__i386__)
16#define REGPARM(x) __attribute__((regparm(x)))
17#else
18#define REGPARM(x)
19#endif
20
21#ifdef __GNUC__
22#define NOINLINE __attribute__((noinline))
23#define ALIGNED(n) __attribute__((aligned(n)))
35f2b65e 24#define unlikely(x) __builtin_expect((x), 0)
90b1c9db 25#define likely(x) __builtin_expect(!!(x), 1)
bce14421 26#else
27#define NOINLINE
28#define ALIGNED(n)
35f2b65e 29#define unlikely(x) (x)
90b1c9db 30#define likely(x) (x)
bce14421 31#endif
32
24aab4da 33#ifdef _MSC_VER
34#define snprintf _snprintf
35#define strcasecmp _stricmp
36#define strncasecmp _strnicmp
37#define strdup _strdup
38#endif
39
57c5a5e5 40
886ce067 41// There's no standard way to determine endianess at compile time. Try using
42// some well known non-standard macros for detection.
57c5a5e5 43#if defined __BYTE_ORDER__
44#define CPU_IS_LE __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1a5a036e 45#elif defined __BYTE_ORDER
57c5a5e5 46#define CPU_IS_LE __BYTE_ORDER == __LITTLE_ENDIAN
47#elif defined __BIG_ENDIAN__ || defined _M_PPC // Windows on PPC was big endian
48#define CPU_IS_LE 0
49#elif defined __LITTLE_ENDIAN__ || defined _WIN32 // all other Windows is LE
50#define CPU_IS_LE 1
51#else
52#warning "can't detect byte order, assume little endian"
53#define CPU_IS_LE 1
54#endif
886ce067 55// NB mixed endian integer platforms are not supported.
57c5a5e5 56
57#if CPU_IS_LE
58// address/offset operations
59#define MEM_BE2(a) ((a)^1) // addr/offs of u8 in u16, or u16 in u32
60#define MEM_BE4(a) ((a)^3) // addr/offs of u8 in u32
61#define MEM_LE2(a) (a)
62#define MEM_LE4(a) (a)
63// swapping
0d8d97f8 64#define CPU_BE2(v) ((u32)((u64)(v)<<16)|((u32)(v)>>16))
57c5a5e5 65#define CPU_BE4(v) (((u32)(v)>>24)|(((v)>>8)&0x00ff00)| \
66 (((v)<<8)&0xff0000)|(u32)((v)<<24))
67#define CPU_LE2(v) (v) // swap of 2*u16 in u32
68#define CPU_LE4(v) (v) // swap of 4*u8 in u32
69#else
70// address/offset operations
71#define MEM_BE2(a) (a)
72#define MEM_BE4(a) (a)
73#define MEM_LE2(a) ((a)^1)
74#define MEM_LE4(a) ((a)^3)
75// swapping
76#define CPU_BE2(v) (v)
77#define CPU_BE4(v) (v)
0d8d97f8 78#define CPU_LE2(v) ((u32)((u64)(v)<<16)|((u32)(v)>>16))
57c5a5e5 79#define CPU_LE4(v) (((u32)(v)>>24)|(((v)>>8)&0x00ff00)| \
80 (((v)<<8)&0xff0000)|(u32)((v)<<24))
81#endif
82
bce14421 83#endif // PICO_PORT_INCLUDED