Mario Kart 64
Loading...
Searching...
No Matches
macros.h
Go to the documentation of this file.
1#ifndef _MACROS_H_
2#define _MACROS_H_
3
4#ifndef __sgi
5#define GLOBAL_ASM(...)
6#endif
7
8#if !defined(__sgi) && (!defined(NON_MATCHING) || !defined(AVOID_UB))
9// asm-process isn't supported outside of IDO, and undefined behavior causes
10// crashes.
11// #error Matching build is only possible on IDO; please build with NON_MATCHING=1.
12#endif
13
14#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
15
16#define GLUE(a, b) a##b
17#define GLUE2(a, b) GLUE(a, b)
18
19// Avoid compiler warnings for unused variables
20#ifdef __GNUC__
21#define UNUSED __attribute__((unused))
22#else
23#define UNUSED
24#endif
25
26// Avoid undefined behaviour for non-returning functions
27#ifdef __GNUC__
28#define NORETURN __attribute__((noreturn))
29#else
30#define NORETURN
31#endif
32
33// Avoid undefined behaviour for non-returning functions
34#ifdef __GNUC__
35#define NO_REORDER __attribute__((no_reorder))
36#else
37#define NO_REORDER
38#endif
39
40// Static assertions
41#ifdef __GNUC__
42#define STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
43#else
44#define STATIC_ASSERT(cond, msg) typedef char GLUE2(static_assertion_failed, __LINE__)[(cond) ? 1 : -1]
45#endif
46
47// Align to 8-byte boundary for DMA requirements
48#ifdef __GNUC__
49#define ALIGNED8 __attribute__((aligned(8)))
50#else
51#define ALIGNED8
52#endif
53
54// Align to 16-byte boundary for audio lib requirements
55#ifdef __GNUC__
56#define ALIGNED16 __attribute__((aligned(16)))
57#else
58#define ALIGNED16
59#endif
60
61// Fixed point macros
62#define FTOFIX(f) ((s32) ((f) * 65536.0))
63#define ITOFIX(i) ((s32) ((i) << 16))
64#define FIXTOF(x) ((double) ((x) / 65536.0))
65#define FIXTOI(x) ((s32) ((x) >> 16))
66
67// Split fixed-point values into its integer or fractional parts.
68#define toFixedInt(f) (FTOFIX(f) >> 16)
69#define toFrac(f) (FTOFIX(f) & 0xFFFF)
70
71// Setup a fixed-point matrix using floats or doubles. Recommend using doubles for more precision.
72#define toFixedPointMatrix(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16) \
73 { \
74 { ((toFixedInt(x1)) << 16) | toFixedInt(x2), ((toFixedInt(x3)) << 16) | toFixedInt(x4), \
75 (toFixedInt(x5) << 16) | toFixedInt(x6), (toFixedInt(x7) << 16) | toFixedInt(x8) }, \
76 { ((toFixedInt(x9)) << 16) | toFixedInt(x10), ((toFixedInt(x11)) << 16) | toFixedInt(x12), \
77 (toFixedInt(x13) << 16) | toFixedInt(x14), (toFixedInt(x15) << 16) | toFixedInt(x16) }, \
78 { ((toFrac(x1)) << 16) | toFrac(x2), ((toFrac(x3)) << 16) | toFrac(x4), (toFrac(x5) << 16) | toFrac(x6), \
79 (toFrac(x7) << 16) | toFrac(x8) }, \
80 { \
81 ((toFrac(x9)) << 16) | toFrac(x10), ((toFrac(x11)) << 16) | toFrac(x12), \
82 (toFrac(x13) << 16) | toFrac(x14), (toFrac(x15) << 16) | toFrac(x16) \
83 } \
84 }
85
86// convert a virtual address to physical.
87#define VIRTUAL_TO_PHYSICAL(addr) ((uintptr_t) (addr) & 0x1FFFFFFF)
88
89// convert a physical address to virtual.
90#define PHYSICAL_TO_VIRTUAL(addr) ((uintptr_t) (addr) | 0x80000000)
91
92// another way of converting virtual to physical
93#define VIRTUAL_TO_PHYSICAL2(addr) ((u8*) (addr) - 0x80000000U)
94
95// aligns an address to the next 16 bytes
96#define ALIGN16(val) (((val) + 0xF) & ~0xF)
97
104#define GET_PACKED_END(dl) (((u8*) dl) + sizeof(dl) - sizeof(dl[0]) - 0x07000000)
105
106#endif