NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
OSFastCast.h
1#ifndef RVL_SDK_OS_FAST_CAST_H
2#define RVL_SDK_OS_FAST_CAST_H
3#include <types.h>
4#ifdef __cplusplus
5extern "C" {
6#endif
7
8#define OS_GQR_TYPE_U8 4
9#define OS_GQR_TYPE_U16 5
10#define OS_GQR_TYPE_S8 6
11#define OS_GQR_TYPE_S16 7
12
13static void OSInitFastCast(void) {
14 // clang-format off
15 asm {
16 li r3, 4
17 oris r3, r3, 4
18 mtspr 0x392, r3
19
20 li r3, 5
21 oris r3, r3, 5
22 mtspr 0x393, r3
23
24 li r3, 6
25 oris r3, r3, 6
26 mtspr 0x394, r3
27
28 li r3, 7
29 oris r3, r3, 7
30 mtspr 0x395, r3
31 }
32 // clang-format on
33}
34
35static void OSSetGQR6(register u32 type, register u32 scale) {
36 register u32 val = ((scale << 8 | type) << 16) | ((scale << 8) | type);
37
38 // clang-format off
39 asm {
40 mtspr 0x396, val
41 }
42 // clang-format on
43}
44
45static void OSSetGQR7(register u32 type, register u32 scale) {
46 register u32 val = ((scale << 8 | type) << 16) | ((scale << 8) | type);
47
48 // clang-format off
49 asm {
50 mtspr 0x397, val
51 }
52 // clang-format on
53}
54
55/******************************************************************************
56 *
57 * Convert from U8
58 *
59 ******************************************************************************/
60static f32 __OSu8tof32(register u8* in) {
61 register f32 ret;
62
63 // clang-format off
64 asm {
65 psq_l ret, 0(in), 1, 2
66 }
67 // clang-format on
68
69 return ret;
70}
71
72static void OSu8tof32(u8* in, volatile f32* out) {
73 *out = __OSu8tof32(in);
74}
75
76/******************************************************************************
77 *
78 * Convert from U16
79 *
80 ******************************************************************************/
81static inline f32 __OSu16tof32(register u16* arg) {
82 register f32 ret;
83
84 // clang-format off
85 asm {
86 psq_l ret, 0(arg), 1, 3
87 }
88 // clang-format on
89
90 return ret;
91}
92
93static inline void OSu16tof32(u16* in, volatile f32* out) {
94 *out = __OSu16tof32(in);
95}
96
97/******************************************************************************
98 *
99 * Convert from S16
100 *
101 ******************************************************************************/
102static f32 __OSs16tof32(register s16* arg) {
103 register f32 ret;
104
105 // clang-format off
106 asm {
107 psq_l ret, 0(arg), 1, 5
108 }
109 // clang-format on
110
111 return ret;
112}
113
114static void OSs16tof32(s16* in, volatile f32* out) {
115 *out = __OSs16tof32(in);
116}
117
118/******************************************************************************
119 *
120 * Convert from F32
121 *
122 ******************************************************************************/
123static u8 __OSf32tou8(register f32 arg) {
124 f32 a;
125 register f32* ptr = &a;
126 u8 r;
127
128 // clang-format off
129 asm {
130 psq_st arg, 0(ptr), 1, 2
131 }
132 // clang-format on
133
134 r = *(u8*)ptr;
135 return r;
136}
137
138static void OSf32tou8(f32* in, volatile u8* out) {
139 *out = __OSf32tou8(*in);
140}
141
142static u16 __OSf32tou16(register f32 arg) {
143 f32 a;
144 register f32* ptr = &a;
145 u16 r;
146
147 // clang-format off
148 asm {
149 psq_st arg, 0(ptr), 1, 3
150 }
151 // clang-format on
152
153 r = *(u16*)ptr;
154 return r;
155}
156
157static void OSf32tou16(f32* in, volatile u16* out) {
158 *out = __OSf32tou16(*in);
159}
160
161static s16 __OSf32tos16(register f32 arg) {
162 f32 a;
163 register f32* ptr = &a;
164 s16 r;
165
166 // clang-format off
167 asm {
168 psq_st arg, 0(ptr), 1, 5
169 }
170 // clang-format on
171
172 r = *(s16*)ptr;
173 return r;
174}
175
176static void OSf32tos16(f32* in, volatile s16* out) {
177 *out = __OSf32tos16(*in);
178}
179
180#ifdef __cplusplus
181}
182#endif
183#endif