38 lines
502 B
ArmAsm
38 lines
502 B
ArmAsm
.global csa
|
|
|
|
ECASE=20
|
|
STACK_CLICK=4
|
|
|
|
csa:
|
|
! jump table address in %o0
|
|
! index in %o1
|
|
|
|
ld [%o0], %o4 ! default address
|
|
ld [%o0+4], %o2
|
|
subcc %o1, %o2, %o1 ! index - lower bound
|
|
bl 1f
|
|
ld [%o0+2*4], %o3
|
|
cmp %o1, %o3 ! rel. index, upper - lower bound
|
|
bgt 1f
|
|
nop
|
|
sll %o1, 2, %o5
|
|
add %o0, %o5, %o3 ! %o3 = @jump address
|
|
ld [%o3+12], %o2 ! %o2 = jump address
|
|
tst %o2
|
|
be 1f
|
|
nop
|
|
jmp %o2
|
|
nop
|
|
1:
|
|
tst %o4
|
|
beq 2f
|
|
nop
|
|
jmp %o4
|
|
nop
|
|
2:
|
|
mov ECASE, %o0
|
|
set trp, %g1
|
|
jmp %g1
|
|
nop
|
|
.align 4
|