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