summaryrefslogtreecommitdiff
path: root/src/nw4r/g3d/platform/g3d_cpu.cpp
blob: 0851e59ce880a654e9073fa5963393eaca9fa65f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "nw4r/g3d.h" // IWYU pragma: export

namespace nw4r {
namespace g3d {
namespace detail {

void Copy32ByteBlocks(register void *pDst, register const void *pSrc, register u32 size) {
    register f32 work0, work1, work2, work3;

    for (size /= 32; size > 0; size--) {
        // clang-format off
        asm {
            lfd  work0, 0(pSrc)
            stfd work0, 0(pDst)

            lfd  work1, 8(pSrc)
            stfd work1, 8(pDst)

            lfd  work2, 16(pSrc)
            stfd work2, 16(pDst)
            
            lfd  work3, 24(pSrc)
            stfd work3, 24(pDst)
        }
        // clang-format on

        pDst = static_cast<u8 *>(pDst) + 32;
        pSrc = static_cast<const u8 *>(pSrc) + 32;
    }
}

void ZeroMemory32ByteBlocks(register void *pDst, register u32 size) {
    register f32 zero = 0.0f;

    for (size /= 32; size > 0; size--) {
        // clang-format off
        asm {
            psq_st zero,  0(pDst), 0, 0
            psq_st zero,  8(pDst), 0, 0
            psq_st zero, 16(pDst), 0, 0
            psq_st zero, 24(pDst), 0, 0
        }
        // clang-format on

        pDst = static_cast<u8 *>(pDst) + 32;
    }
}

} // namespace detail
} // namespace g3d
} // namespace nw4r