dc05cb2dc8
Switch .cms to pass inputs and outputs on the real stack, not in registers; like we do with .and, .or (81c677d
) and .xor (c578c49
). At this point, nearly all functions in libem use the real stack, not registers, for passing inputs and outputs. This simplifies the ncg table (which needs fewer lists of specific registers) but slows calls to libem. For example, afterba9b021
, each call to .aar4 is about 10 instructions slower. I moved 3 inputs and 1 output from registers to the real stack. A program would take 4 instructions to move registers to stack, 4 to move stack to registers, and perhaps 2 to adjust the stack pointer.
31 lines
651 B
ArmAsm
31 lines
651 B
ArmAsm
.sect .text
|
|
|
|
! Compare sets a, b.
|
|
! Stack: ( b a size -- result )
|
|
! Result is 0 if equal, nonzero if not equal.
|
|
|
|
.define .cms
|
|
.cms:
|
|
lwz r3, 0(sp) ! r3 = size of each set
|
|
srwi r7, r3, 2
|
|
mtspr ctr, r7 ! ctr = size / 4
|
|
addi r4, sp, 4 ! r4 = ptr to set a
|
|
add r5, r4, r3 ! r5 = ptr to set b
|
|
li r6, 0 ! r6 = index
|
|
1:
|
|
lwzx r7, r4, r6
|
|
lwzx r8, r5, r6
|
|
cmpw cr0, r7, r8 ! compare words in sets
|
|
addi r6, r6, 4
|
|
bne cr0, 2f ! branch if not equal
|
|
bdnz 1b ! loop ctr times
|
|
li r9, 0 ! equal: return 0
|
|
b 3f
|
|
2:
|
|
li r9, 1 ! not equal: return 1
|
|
3:
|
|
slwi r7, r3, 1
|
|
add sp, sp, r7 ! adjust stack pointer
|
|
stw r9, 0(sp) ! push result
|
|
blr
|