program MOVE_TST;
const
s_length = 60;
// s1: string[s_length] = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// s2: string[s_length] = '12345678902234567890323456789042345678905234567890';
s1: array[0..s_length] of char = '4abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'#0;
s2: array[0..s_length] of char = '212345678902234567890323456789042345678905234567890'#0;
var
s3: string[s_length];
i: integer;
procedure Move(const source;var dest;count:longint);assembler;
asm
# count <= 0 ?
ble $6,$0,.Lmoveexit
nop
# source = dest ?
beq $4,$5,.Lmoveexit
nop
# possible overlap?
bgt $4,$5,.Lnopossibleoverlap
nop
# source < dest ....
add $7,$6,$4
# overlap?
# source+count < dest ?
blt $7,$5,.Lnopossibleoverlap
nop
.Lcopybackward:
# check alignment of source and dest
or $2,$4,$5
# move src and dest to the end of the blocks
# assuming 16 byte block size
addiu $3,$6,-1
add $4,$4,$3
add $5,$5,$3
b .Lmovebytewise
li $3,-1
.Lnopossibleoverlap:
# check alignment of source and dest
or $2,$4,$5
# everything 16 byte aligned ?
andi $13,$2,15
beq $13,$0,.Lmovetwordwise
# load direction in delay slot
li $3,16
andi $13,$2,7
beq $13,$0,.Lmoveqwordwise
li $3,8
andi $13,$2,3
beq $13,$0,.Lmovedwordwise
li $3,4
andi $13,$2,1
beq $13,$0,.Lmovewordwise
li $3,2
b .Lmovebytewise
li $3,1
.Lmovetwordwise:
srl $13,$6,4
sll $14,$13,4
beq $14,$0,.Lmoveqwordwise_shift
nop
.Lmovetwordwise_loop:
lw $9,0($4)
lw $10,4($4)
addiu $13,$13,-1
lw $11,8($4)
lw $12,12($4)
addu $4,$4,$3
sw $9,0($5)
sw $10,4($5)
sw $11,8($5)
sw $12,12($5)
addu $5,$5,$3
bne $13,$0,.Lmovetwordwise_loop
nop
subu $6,$6,$14
beq $6,$0,.Lmoveexit
nop
.Lmoveqwordwise_shift:
sra $3,$3,1
.Lmoveqwordwise:
srl $13,$6,3
sll $14,$13,3
beq $14,$0,.Lmovedwordwise_shift
nop
.Lmoveqwordwise_loop:
lw $9,0($4)
lw $10,4($4)
addiu $13,$13,-1
add $4,$3,$4
sw $9,0($5)
sw $10,4($5)
add $5,$3,$5
bne $13,0,.Lmoveqwordwise_loop
nop
subu $6,$6,$14
beq $6,$0,.Lmoveexit
nop
.Lmovedwordwise_shift:
sra $3,$3,1
.Lmovedwordwise:
srl $13,$6,2
sll $14,$13,2
beq $14,$0,.Lmovewordwise_shift
nop
.Lmovedwordwise_loop:
lw $9,0($4)
addiu $13,$13,-1
addu $4,$4,$3
sw $9,0($5)
addu $5,$5,$3
bne $13,$0,.Lmovedwordwise_loop
nop
subu $6,$6,$14
beq $6,$0,.Lmoveexit
nop
.Lmovewordwise_shift:
sra $3,$3,1
.Lmovewordwise:
srl $13,$6,1
sll $14,$13,1
beq $14,$0, .Lmovebytewise_shift
nop
.Lmovewordwise_loop:
lhu $9,0($4)
addiu $13,$13,-1
add $4,$4,$3
sh $9,0($5)
add $5,$5,$3
bne $13,$0,.Lmovewordwise_loop
nop
subu $6,$6,$14
beq $6,$0, .Lmoveexit
nop
.Lmovebytewise_shift:
sra $3,$3,1
.Lmovebytewise:
beq $6,$0, .Lmoveexit
nop
lbu $9,0($4)
addiu $6,$6,-1
add $4,$4,$3
sb $9,0($5)
add $5,$5,$3
bne $6,$0,.Lmovebytewise
nop
.Lmoveexit:
end; |