diff --git a/mach/vax4/libem/lpb.s b/mach/vax4/libem/lpb.s index 4150bb4ab..8d92d6754 100644 --- a/mach/vax4/libem/lpb.s +++ b/mach/vax4/libem/lpb.s @@ -1,18 +1,25 @@ # $Header$ + # special version to work with A68S, by CHL .globl .lpb - + # compute AB, given LB .lpb: cmpl r0,fp bneq L1 moval 4(ap),r0 rsb L1: - movl fp,r1 + movl 4(r0),r1 # mask for saved registers + addl2 $24,r0 # position of AB if no registers saved + movl $16,r2 # position of first bit to test L2: - cmpl 12(r1),r0 - beql L3 - movl 12(r1),r1 - jbr L2 + subl3 r2,$28,r3 # remaining size of mask + ffs r2,r3,r1,r2 # find first bit set in mask + beql L3 # no more bits set + addl2 $4,r0 # for each saved register + incl r2 + jbr L2 L3: - addl3 $4,8(r1),r0 # Argument Base = ap + 4 - rsb + extzv $30,$2,r1,r2 # Now find out about the stack alignment + # between fp and ap + addl2 r2,r0 # add alignment + rsb diff --git a/mach/vax4/libem/strlb.s b/mach/vax4/libem/strlb.s index 463f8bbb3..23065e107 100644 --- a/mach/vax4/libem/strlb.s +++ b/mach/vax4/libem/strlb.s @@ -1,4 +1,5 @@ # $Header$ + # revised version by CHL .globl .strlb # Store the value that is on the stack in fp. # Compute ap. @@ -9,16 +10,16 @@ movl $20,ap # Compute argumentbase from local base. # Distance is 5 longwords + the number of # registers saved. - movl $1,r3 # Now check register save mask - movl $12,r2 -L1: - bitl r3,6(fp) - beql L2 - addl2 $4,ap # Add 1 longword for each register saved -L2: - ashl $1,r3,r3 - sobgeq r2,L1 - + movl 4(fp),r3 # mask for saved registers + movl $16,r2 # position of first bit to test +L4: + subl3 r2,$28,r1 # remaining size of mask + ffs r2,r1,r3,r2 # find first bit set in mask + beql L5 # no more bits set + addl2 $4,ap # for each saved register + incl r2 + jbr L4 +L5: extzv $14,$2,6(fp),r3 # Now find out about the stack alignment # between fp and ap addl2 r3,ap # add alignment