ack/mach/powerpc/libem/csa.s

35 lines
854 B
ArmAsm
Raw Normal View History

2007-11-02 18:56:58 +00:00
.sect .text
! this is not a subroutine, but just a
! piece of code that computes the jump-
! address and jumps to it.
! traps if resulting address is zero
!
! Stack: ( value tableaddr -- )
2007-11-02 18:56:58 +00:00
.define .csa
.csa:
lwz r3, 0(sp)
lwz r4, 4(sp)
addi sp, sp, 8
2007-11-02 18:56:58 +00:00
lwz r5, 0(r3) ! load default
mtspr ctr, r5
lwz r5, 4(r3) ! fetch lower bound
subf. r4, r5, r4 ! adjust value
bltctr ! jump to default if out of range
2007-11-02 18:56:58 +00:00
lwz r5, 8(r3) ! fetch range
cmplw r4, r5
bgtctr ! jump to default if out of range
2007-11-02 18:56:58 +00:00
addi r3, r3, 12 ! skip header
slwi r4, r4, 2 ! scale value (<<2)
2007-11-02 18:56:58 +00:00
lwzx r5, r3, r4 ! load target
mtspr ctr, r5
2007-11-02 18:56:58 +00:00
or. r5, r5, r5 ! test it
bnectr ! jump to target if non-zero
2007-11-02 18:56:58 +00:00
b .trap_ecase ! otherwise trap