Skip to content

Commit 735078a

Browse files
committed
Reimplement cntlz{w,d} with builtins
1 parent b689501 commit 735078a

3 files changed

Lines changed: 12 additions & 18 deletions

File tree

include/ogc/machine/processor.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,6 @@
104104
#define __stswx(base,bytes,value) \
105105
__asm__ __volatile__ ("mtxer %2; stswx %1,%y0" : "=Z"(*(u32*)(base)) : "r"(value), "r"(bytes) : "xer");
106106

107-
#define cntlzw(_val) ({register u32 _rval; \
108-
__asm__ __volatile__("cntlzw %0, %1" : "=r"((_rval)) : "r"((_val))); _rval;})
109-
110107
#define _CPU_MSR_GET( _msr_value ) \
111108
do { \
112109
_msr_value = 0; \
@@ -201,6 +198,16 @@ static inline u64 bswap64(u64 val)
201198
}
202199
#endif
203200

201+
static inline u32 cntlzw(u32 val)
202+
{
203+
return __builtin_clzg(val, 32);
204+
}
205+
206+
static inline u32 cntlzd(u64 val)
207+
{
208+
return __builtin_clzg(val, 64);
209+
}
210+
204211
// Basic I/O
205212

206213
static inline u32 read32(u32 addr)

libogc/pad.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -919,7 +919,7 @@ u32 PAD_ScanPads(void)
919919
}
920920
}
921921

922-
state |= (state & (PAD_TRIGGER_R | PAD_TRIGGER_L)) << (__builtin_clz(PAD_TRIGGER_R | PAD_TRIGGER_L) - __builtin_clz(PADEX_TRIGGER_R | PADEX_TRIGGER_L));
922+
state |= (state & (PAD_TRIGGER_R | PAD_TRIGGER_L)) << (cntlzw(PAD_TRIGGER_R | PAD_TRIGGER_L) - cntlzw(PADEX_TRIGGER_R | PADEX_TRIGGER_L));
923923

924924
oldstate = __pad_keys[i].state;
925925
__pad_keys[i].up = ~state & oldstate;
@@ -1011,7 +1011,7 @@ u32 PAD_ScanPads(void)
10111011
if(steering.gas>(UINT8_MAX/2)) state |= PADEX_PEDAL_GAS;
10121012
if(steering.brake>(UINT8_MAX/2)) state |= PADEX_PEDAL_BRAKE;
10131013

1014-
state |= (state & (PAD_TRIGGER_R | PAD_TRIGGER_L)) << (__builtin_clz(PAD_TRIGGER_R | PAD_TRIGGER_L) - __builtin_clz(PADEX_TRIGGER_R | PADEX_TRIGGER_L));
1014+
state |= (state & (PAD_TRIGGER_R | PAD_TRIGGER_L)) << (cntlzw(PAD_TRIGGER_R | PAD_TRIGGER_L) - cntlzw(PADEX_TRIGGER_R | PADEX_TRIGGER_L));
10151015

10161016
oldstate = __pad_keys[i].state;
10171017
__pad_keys[i].up = ~state & oldstate;

libogc/video.c

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,19 +1780,6 @@ static void printDebugCalculations(void)
17801780
}
17811781
#endif
17821782

1783-
static __inline__ u32 cntlzd(u64 bit)
1784-
{
1785-
u32 hi,lo,value = 0;
1786-
1787-
hi = (u32)(bit>>32);
1788-
lo = (u32)(bit&-1);
1789-
1790-
value = cntlzw(hi);
1791-
if(value>=32) value += cntlzw(lo);
1792-
1793-
return value;
1794-
}
1795-
17961783
static const struct _timing* __gettiming(u32 vimode)
17971784
{
17981785
switch(vimode) {

0 commit comments

Comments
 (0)