ack/mach/powerpc/libem/csb.s

33 lines
865 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 .csb
.csb:
lwz r3, 0(sp)
lwz r4, 4(sp)
addi sp, sp, 8
lwz r5, 0(r3) ! r5 = default target
2007-11-02 18:56:58 +00:00
lwz r6, 4(r3) ! fetch count
mr. r6, r6 ! skip loop if count is zero
beq 3f ! (needed by Modula-2 "CASE i OF END")
mtspr ctr, r6
1: lwzu r7, 8(r3) ! fetch target index, increment pointer
cmpw r4, r7 ! compare with value
beq 2f
bdnz 1b ! if not equal, go again
b 3f
2: lwz r5, 4(r3) ! r5 = new target
3: mtspr ctr, r5
mr. r5, r5 ! test target
bnectr ! jump to target if non-zero
2007-11-02 18:56:58 +00:00
b .trap_ecase ! otherwise trap