Edit PowerPC assembly for .and, .cms, .ior, .xor, .zer
Remove one addi instruction from some loops. These loops had
increased 2 pointers, they now increase 1 index. I must initialize
the index, so I add "li r6, 0" before each loop.
Change .zer to use subf instead of neg, add.
Change .xor to take the size on the real stack, as .and and .or have
done since 81c677d
.
This commit is contained in:
parent
13beb5e336
commit
c578c495bb
|
@ -5,20 +5,18 @@
|
|||
|
||||
.define .and
|
||||
.and:
|
||||
lwz r3, 0 (sp) ! r3 = size
|
||||
addi sp, sp, 4
|
||||
|
||||
mr r4, sp ! r4 = ptr to set a
|
||||
add r5, sp, r3 ! r5 = ptr to set b
|
||||
srwi r6, r3, 2
|
||||
mtspr ctr, r6 ! ctr = r3 / 4
|
||||
lwz r3, 0(sp) ! r3 = size
|
||||
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:
|
||||
lwz r7, 0(r4)
|
||||
lwz r8, 0(r5)
|
||||
lwzx r7, r4, r6
|
||||
lwzx r8, r5, r6
|
||||
and r8, r7, r8 ! intersection of words
|
||||
stw r8, 0(r5)
|
||||
addi r4, r4, 4
|
||||
addi r5, r5, 4
|
||||
stwx r8, r5, r6
|
||||
addi r6, r6, 4
|
||||
bdnz 1b ! loop ctr times
|
||||
add sp, sp, r3
|
||||
mr sp, r5
|
||||
blr
|
||||
|
|
|
@ -7,24 +7,23 @@
|
|||
|
||||
.define .cms
|
||||
.cms:
|
||||
srwi r7, r3, 2
|
||||
mtspr ctr, r7 ! ctr = size / 4
|
||||
mr r4, sp ! r4 = ptr to set a
|
||||
add r5, sp, r3 ! r5 = ptr to set b
|
||||
mr r6, r3 ! r6 = size
|
||||
srwi r3, r3, 2
|
||||
mtspr ctr, r3 ! ctr = size / 4
|
||||
li r6, 0 ! r6 = index
|
||||
add r9, r5, r3 ! r9 = future sp
|
||||
1:
|
||||
lwz r7, 0(r4)
|
||||
lwz r8, 0(r5)
|
||||
lwzx r7, r4, r6
|
||||
lwzx r8, r5, r6
|
||||
cmpw cr0, r7, r8 ! compare words in sets
|
||||
addi r4, r4, 4
|
||||
addi r5, r5, 4
|
||||
addi r6, r6, 4
|
||||
bne cr0, 2f ! branch if not equal
|
||||
bdnz 1b ! loop ctr times
|
||||
addi r3, r0, 0 ! equal: return 0
|
||||
li r3, 0 ! equal: return 0
|
||||
b 3f
|
||||
2:
|
||||
addi r3, r0, 1 ! not equal: return 1
|
||||
li r3, 1 ! not equal: return 1
|
||||
3:
|
||||
slwi r6, r6, 1 ! r6 = size * 2
|
||||
add sp, sp, r6 ! remove sets from stack
|
||||
mr sp, r9 ! remove sets from stack
|
||||
blr
|
||||
|
|
|
@ -5,20 +5,18 @@
|
|||
|
||||
.define .ior
|
||||
.ior:
|
||||
lwz r3, 0 (sp)
|
||||
addi sp, sp, 4
|
||||
|
||||
mr r4, sp ! r4 = ptr to set a
|
||||
add r5, sp, r3 ! r5 = ptr to set b
|
||||
srwi r6, r3, 2
|
||||
mtspr ctr, r6 ! ctr = r3 / 4
|
||||
lwz r3, 0(sp) ! r3 = size
|
||||
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:
|
||||
lwz r7, 0(r4)
|
||||
lwz r8, 0(r5)
|
||||
lwzx r7, r4, r6
|
||||
lwzx r8, r5, r6
|
||||
or r8, r7, r8 ! union of words
|
||||
stw r8, 0(r5)
|
||||
addi r4, r4, 4
|
||||
addi r5, r5, 4
|
||||
stwx r8, r5, r6
|
||||
addi r6, r6, 4
|
||||
bdnz 1b ! loop ctr times
|
||||
add sp, sp, r3
|
||||
mr sp, r5
|
||||
blr
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
.sect .text
|
||||
|
||||
! Set symmetric difference.
|
||||
! Stack: ( b a -- a/b )
|
||||
! With r3 = size of set
|
||||
! Stack: ( b a size -- a/b )
|
||||
|
||||
.define .xor
|
||||
.xor:
|
||||
mr r4, sp ! r4 = ptr to set a
|
||||
add r5, sp, r3 ! r5 = ptr to set b
|
||||
srwi r6, r3, 2
|
||||
mtspr ctr, r6 ! ctr = r3 / 4
|
||||
lwz r3, 0(sp) ! r3 = size
|
||||
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:
|
||||
lwz r7, 0(r4)
|
||||
lwz r8, 0(r5)
|
||||
lwzx r7, r4, r6
|
||||
lwzx r8, r5, r6
|
||||
xor r8, r7, r8 ! symmetric difference of words
|
||||
stw r8, 0(r5)
|
||||
addi r4, r4, 4
|
||||
addi r5, r5, 4
|
||||
stwx r8, r5, r6
|
||||
addi r6, r6, 4
|
||||
bdnz 1b ! loop ctr times
|
||||
add sp, sp, r3
|
||||
mr sp, r5
|
||||
blr
|
||||
|
|
|
@ -5,17 +5,15 @@
|
|||
|
||||
.define .zer
|
||||
.zer:
|
||||
lwz r3, 0(sp)
|
||||
addi sp, sp, 4
|
||||
|
||||
srwi r7, r3, 2
|
||||
li r4, 0 ! r4 = zero
|
||||
neg r5, r3
|
||||
add sp, sp, r5 ! allocate set
|
||||
mr r6, sp ! r6 = ptr to set
|
||||
mtspr ctr, r7 ! ctr = r3 / 4
|
||||
lwz r3, 0(sp) ! r3 = size
|
||||
srwi r5, r3, 2
|
||||
mtspr ctr, r5 ! ctr = word size - 4
|
||||
li r4, 0 ! r4 = 0
|
||||
addi sp, sp, 4
|
||||
subf sp, r3, sp ! sp = ptr to new set
|
||||
li r6, 0 ! r6 = index
|
||||
1:
|
||||
stw r4, 0(r6) ! store zero in set
|
||||
stwx r4, sp, r6 ! store zero in set
|
||||
addi r6, r6, 4
|
||||
bdnz 1b ! loop ctr times
|
||||
blr
|
||||
|
|
|
@ -1374,11 +1374,13 @@ PATTERNS
|
|||
yields {XOR_RC, %2, lo(%1.val)}
|
||||
|
||||
pat xor defined($1) /* XOR set */
|
||||
with STACK
|
||||
kills ALL
|
||||
gen
|
||||
move {CONST, $1}, R3
|
||||
bl {LABEL, ".xor"}
|
||||
leaving
|
||||
loc $1
|
||||
cal ".xor"
|
||||
|
||||
pat xor !defined($1)
|
||||
leaving
|
||||
cal ".xor"
|
||||
|
||||
pat com $1==INT32 /* NOT word */
|
||||
with AND_RR
|
||||
|
|
Loading…
Reference in a new issue