41 lines
439 B
ArmAsm
41 lines
439 B
ArmAsm
.global csb
|
|
ECASE=20
|
|
|
|
csb:
|
|
! case descriptor in %o0
|
|
! index in %o1
|
|
ld [%o0], %o2 ! default jump address
|
|
ld [%o0+4], %o3 ! # entries
|
|
inc 8, %o0
|
|
tst %o3
|
|
be 3f
|
|
nop
|
|
dec %o3
|
|
set 0xffff, %o4
|
|
and %o3, %o4, %o5
|
|
sll %o5, 3, %o3
|
|
1:
|
|
ld [%o0+%o3], %o4
|
|
cmp %o4, %o1
|
|
be 2f
|
|
nop
|
|
deccc 8, %o3
|
|
bge 1b
|
|
nop
|
|
b 3f
|
|
nop
|
|
2:
|
|
inc 4, %o3
|
|
ld [%o0+%o3], %o2
|
|
3:
|
|
tst %o2
|
|
be 4f
|
|
nop
|
|
jmp %o2
|
|
nop
|
|
4:
|
|
set ECASE, %o0
|
|
set trp, %g1
|
|
jmp %g1
|
|
nop
|