1#include <prim/seadEndian.h>
2
3namespace
4{
5u8 Swap8(u8 val)
6{
7 return val;
8}
9
10u8 Null8(u8 val)
11{
12 return val;
13}
14
15u16 Swap16(u16 val)
16{
17 return (val << 8 | val >> 8) & 0xFFFF;
18}
19
20u16 Null16(u16 val)
21{
22 return val;
23}
24
25u32 Swap32(u32 val)
26{
27 return val << 24 | (val & 0xFF00) << 8 | val >> 24 | (val >> 8 & 0xFF00);
28}
29
30u32 Null32(u32 val)
31{
32 return val;
33}
34
35u64 Swap64(u64 val)
36{
37 // Couldn't make an implementation that matches the original assembly
38 // But this should be much more efficient
39 return val << 56 | (val & 0xFF00) << 40 | (val & 0xFF0000) << 24 | (val & 0xFF000000) << 8 |
40 val >> 56 | (val >> 40 & 0xFF00) | (val >> 24 & 0xFF0000) | (val >> 8 & 0xFF000000);
41}
42
43u64 Null64(u64 val)
44{
45 return val;
46}
47} // anonymous namespace
48
49namespace sead
50{
51const Endian::Types Endian::cHostEndian = Endian::markToEndian(bom: 0xfeff);
52
53const Endian::ConvFuncTable Endian::cConvFuncTable = {
54 .conv8: {&Null8, &Swap8},
55 .conv16: {&Null16, &Swap16},
56 .conv32: {&Null32, &Swap32},
57 .conv64: {&Null64, &Swap64},
58};
59
60} // namespace sead
61