Skip to content

Commit d21cb16

Browse files
committed
Add __{l,st}s{w,d}{i,x}
Fix upper 32-bit being picked from 64-bit variables Minor optimizations
1 parent c288109 commit d21cb16

2 files changed

Lines changed: 36 additions & 8 deletions

File tree

include/ogc/machine/processor.h

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,27 +82,51 @@
8282

8383
#define __lhbrx(base,index) \
8484
({ register u16 res; \
85-
__asm__ __volatile__ ("lhbrx %0,%1,%2" : "=r"(res) : "b%"(index), "r"(base) : "memory"); \
85+
__asm__ __volatile__ ("lhbrx %0,%1,%2" : "=r"(res) : "Ob"(index), "r"(base) : "memory"); \
8686
res; })
8787

8888
#define __lwbrx(base,index) \
8989
({ register u32 res; \
90-
__asm__ __volatile__ ("lwbrx %0,%1,%2" : "=r"(res) : "b%"(index), "r"(base) : "memory"); \
90+
__asm__ __volatile__ ("lwbrx %0,%1,%2" : "=r"(res) : "Ob"(index), "r"(base) : "memory"); \
91+
res; })
92+
93+
#define __lswi(base,bytes) \
94+
({ register u32 res; \
95+
__asm__ __volatile__ ("lswi %0,%P1,%2" : "=&b"(res) : "Q"(*(u32*)(base)), "i"(bytes)); \
96+
res; })
97+
98+
#define __lsdi(base,bytes) \
99+
({ register u64 res; \
100+
__asm__ __volatile__ ("lswi %0,%P1,%2" : "=&b"(res) : "Q"(*(u64*)(base)), "i"(bytes)); \
91101
res; })
92102

93103
#define __lswx(base,bytes) \
94104
({ register u32 res; \
95105
__asm__ __volatile__ ("mtxer %2; lswx %0,%y1" : "=&b"(res) : "Z"(*(u32*)(base)), "r"(bytes) : "xer"); \
96106
res; })
97107

108+
#define __lsdx(base,bytes) \
109+
({ register u64 res; \
110+
__asm__ __volatile__ ("mtxer %2; lswx %0,%y1" : "=&b"(res) : "Z"(*(u64*)(base)), "r"(bytes) : "xer"); \
111+
res; })
112+
98113
#define __sthbrx(base,index,value) \
99-
__asm__ __volatile__ ("sthbrx %0,%1,%2" : : "r"(value), "b%"(index), "r"(base) : "memory")
114+
__asm__ __volatile__ ("sthbrx %0,%1,%2" : : "r"((u16)(value)), "Ob"(index), "r"(base) : "memory")
100115

101116
#define __stwbrx(base,index,value) \
102-
__asm__ __volatile__ ("stwbrx %0,%1,%2" : : "r"(value), "b%"(index), "r"(base) : "memory")
117+
__asm__ __volatile__ ("stwbrx %0,%1,%2" : : "r"((u32)(value)), "Ob"(index), "r"(base) : "memory")
118+
119+
#define __stswi(base,bytes,value) \
120+
__asm__ __volatile__ ("stswi %1,%P0,%2" : "=Q"(*(u32*)(base)) : "r"((u32)(value)), "i"(bytes));
121+
122+
#define __stsdi(base,bytes,value) \
123+
__asm__ __volatile__ ("stswi %1,%P0,%2" : "=Q"(*(u64*)(base)) : "r"((u64)(value)), "i"(bytes));
103124

104125
#define __stswx(base,bytes,value) \
105-
__asm__ __volatile__ ("mtxer %2; stswx %1,%y0" : "=Z"(*(u32*)(base)) : "r"(value), "r"(bytes) : "xer");
126+
__asm__ __volatile__ ("mtxer %2; stswx %1,%y0" : "=Z"(*(u32*)(base)) : "r"((u32)(value)), "r"(bytes) : "xer");
127+
128+
#define __stsdx(base,bytes,value) \
129+
__asm__ __volatile__ ("mtxer %2; stswx %1,%y0" : "=Z"(*(u64*)(base)) : "r"((u64)(value)), "r"(bytes) : "xer");
106130

107131
#define _CPU_MSR_GET( _msr_value ) \
108132
do { \

libogc/n64.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ distribution.
2828
#include <gctypes.h>
2929
#include <ogc/irq.h>
3030
#include <ogc/lwp.h>
31+
#include <ogc/machine/processor.h>
3132
#include <ogc/n64.h>
3233
#include <ogc/si.h>
3334
#include <ogc/system.h>
@@ -169,10 +170,13 @@ static void ShortCommandProc(s32 chan, s32 result)
169170
N64ControlBlock *cb = &__N64[chan];
170171

171172
if (result == N64_ERR_READY) {
172-
if (cb->in[0] != 0x05 || cb->in[1] != 0x00)
173+
u32 type = __lswi(cb->in, 2);
174+
u8 status = cb->in[2];
175+
176+
if (type != SI_N64_CONTROLLER)
173177
cb->result = N64_ERR_NO_CONTROLLER;
174178
else if (cb->status)
175-
*cb->status = cb->in[2];
179+
*cb->status = status;
176180
}
177181
}
178182

@@ -222,7 +226,7 @@ static void ReadProc(s32 chan, s32 result)
222226
N64Status *status = (N64Status *)cb->ptr;
223227

224228
if (result == N64_ERR_READY) {
225-
status->button = cb->in[1] << 8 | cb->in[0];
229+
status->button = __lhbrx(cb->in, 0);
226230
status->stickX = cb->in[2];
227231
status->stickY = cb->in[3];
228232
}

0 commit comments

Comments
 (0)