ack/lang/occam/lib/par_vax.s
2007-02-25 22:49:23 +00:00

52 lines
1.3 KiB
ArmAsm

# VAX code for the top_* primitives
.set BIG, 0x8000 # 32K chunk per movc3
.text
.align 1
.globl _top_size
.globl _top_save
.globl _top_load
_top_size: .word 0x0000
subl3 sp, 4(ap), r0 # bytes between stack pointer and break
addl2 $(8+6+1)*4, r0 # add 8 regs, 6 pushed longwords (line, file,
ret # ap, fp, size, sp) and 1 extra argument
_top_save: .word 0x0ff0 # save regs r4-r11
movq hol0, -(sp) # push line number and file name
movq ap, -(sp) # push LB equivalents ap and fp
pushl 4(ap) # push size
pushal -4(sp) # push sp (the sp AFTER pushing)
movl $BIG, r6 # chunk size in r6
movl 4(ap), r7 # size of block to move
movl sp, r1 # source address
movl 8(ap), r3 # destination address
cmpl r7, r6
jlequ 0f
1: movc3 r6, (r1), (r3) # move chunk of the block, add r6 to r1 and r3
subl2 r6, r7
cmpl r7, r6
jgtru 1b
0: movc3 r7, (r1), (r3) # move what's left
movl $1, r0 # return 1
ret
_top_load: .word 0x0000
movl 4(ap), r1 # source
movl (r1), sp # restore sp
movl $BIG, r6 # chunk size
movl 4(r1), r7 # size
movl sp, r3 # destination
cmpl r7, r6
jlequ 0f
1: movc3 r6, (r1), (r3) # move chunk of the block back
subl2 r6, r7
cmpl r7, r6
jgtru 1b
0: movc3 r7, (r1), (r3) # move what's left back
addl2 $8, sp # pop saved sp and size
movq (sp)+, ap # pop LB's
movq (sp)+, hol0 # pop line and file
clrl r0 # return 0
ret