mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2025-02-02 04:52:53 +01:00
(LOAD_VAL): New macro.
(save_static_to_stacked): Use LOAD_VAL. (save_static_to_fr): Rename from save_static_to_fpreg(). (save_static_to_br): New function. (save_static_to_mem): Likewise. (Logical change 1.175)
This commit is contained in:
parent
d2a5a239aa
commit
a5ed5ae3b7
1 changed files with 92 additions and 18 deletions
|
@ -37,6 +37,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|||
br.call.sptk.many rp = b6;; \
|
||||
mov gp = gp_save_reg
|
||||
|
||||
#define LOAD_VAL(reg) \
|
||||
ld8 reg = [in1], 8;; \
|
||||
tbit.nz p6, p0 = reg, 0;; \
|
||||
(p6) ld8.s reg = [r0]
|
||||
|
||||
|
||||
/* Save r4-r7 into stacked registers, load them up with the
|
||||
values passed via the pointer in in1 and then call the
|
||||
|
@ -60,19 +65,10 @@ save_static_to_stacked:
|
|||
.spillreg r7, loc5
|
||||
mov loc5 = r7
|
||||
.body
|
||||
ld8 r4 = [in1], 8;;
|
||||
ld8 r5 = [in1], 8;;
|
||||
ld8 r6 = [in1], 8;;
|
||||
ld8 r7 = [in1], 8;;
|
||||
tbit.nz p6, p0 = r4, 0
|
||||
tbit.nz p7, p0 = r5, 0
|
||||
tbit.nz p8, p0 = r6, 0
|
||||
tbit.nz p9, p0 = r7, 0;;
|
||||
(p6) ld8.s r4 = [r0]
|
||||
(p7) ld8.s r5 = [r0]
|
||||
(p8) ld8.s r6 = [r0]
|
||||
(p9) ld8.s r7 = [r0]
|
||||
|
||||
LOAD_VAL(r4)
|
||||
LOAD_VAL(r5)
|
||||
LOAD_VAL(r6)
|
||||
LOAD_VAL(r7)
|
||||
CALL_NEXT(loc6)
|
||||
|
||||
mov r4 = loc2
|
||||
|
@ -89,9 +85,9 @@ save_static_to_stacked:
|
|||
r4 with the value passed via in1 and call the function
|
||||
passed via in0. */
|
||||
|
||||
.global save_static_to_fpreg
|
||||
.proc save_static_to_fpreg
|
||||
save_static_to_fpreg:
|
||||
.global save_static_to_fr
|
||||
.proc save_static_to_fr
|
||||
save_static_to_fr:
|
||||
.prologue
|
||||
.regstk 2, 3, 2, 0
|
||||
.save ar.pfs, loc0
|
||||
|
@ -113,9 +109,87 @@ save_static_to_fpreg:
|
|||
CALL_NEXT(loc2)
|
||||
|
||||
getf.sig r4 = f2 // restore r4
|
||||
ldf.fill f2 = [sp], 16 // restore r2
|
||||
.restore sp
|
||||
add sp = 16, sp;;
|
||||
ldf.fill f2 = [sp] // restore r2
|
||||
|
||||
mov ar.pfs = loc0
|
||||
mov rp = loc1
|
||||
br.ret.sptk.many rp
|
||||
.endp save_static_to_fpreg
|
||||
.endp save_static_to_fr
|
||||
|
||||
/* If r4 is not a NaT, save b3 to a stacked register and
|
||||
then save r4 in b3. The non-NaTness of r4 is saved in
|
||||
p1. */
|
||||
|
||||
.global save_static_to_br
|
||||
.proc save_static_to_br
|
||||
save_static_to_br:
|
||||
.prologue
|
||||
.regstk 2, 5, 2, 0
|
||||
.save ar.pfs, loc0
|
||||
alloc loc0 = ar.pfs, 2, 5, 2, 0
|
||||
.save rp, loc1
|
||||
mov loc1 = rp
|
||||
|
||||
.save pr, loc2
|
||||
mov loc2 = pr // save predicates
|
||||
|
||||
.spillreg b3, loc3
|
||||
mov loc3 = b3
|
||||
|
||||
tnat.z p1, p2 = r4;;
|
||||
.spillreg.p p1, r4, b3
|
||||
(p1) mov b3 = r4
|
||||
|
||||
.body
|
||||
|
||||
LOAD_VAL(r4)
|
||||
CALL_NEXT(loc4)
|
||||
|
||||
(p1) mov r4 = b3 // restore r4
|
||||
|
||||
mov ar.pfs = loc0
|
||||
mov rp = loc1
|
||||
mov pr = loc2, -1
|
||||
mov b3 = loc3 // restore b3
|
||||
br.ret.sptk.many rp
|
||||
.endp save_static_to_br
|
||||
|
||||
/* Spill r4 into memory and then save r5 in r4. */
|
||||
|
||||
.global save_static_to_mem
|
||||
.proc save_static_to_mem
|
||||
save_static_to_mem:
|
||||
.prologue
|
||||
.regstk 2, 4, 2, 0
|
||||
.save ar.pfs, loc0
|
||||
alloc loc0 = ar.pfs, 2, 4, 2, 0
|
||||
.save rp, loc1
|
||||
mov loc1 = rp
|
||||
.save ar.unat, loc2
|
||||
mov loc2 = ar.unat
|
||||
|
||||
.fframe 16
|
||||
.spillpsp r4, 16
|
||||
st8.spill [sp] = r4, -16
|
||||
|
||||
.spillreg r5, r4
|
||||
mov r4 = r5
|
||||
|
||||
.body
|
||||
|
||||
LOAD_VAL(r5)
|
||||
CALL_NEXT(loc3)
|
||||
|
||||
mov r5 = r4 // restore r5
|
||||
.restore sp
|
||||
add sp = 16, sp;;
|
||||
ld8.fill r4 = [sp] // restore r4
|
||||
|
||||
mov ar.pfs = loc0
|
||||
mov rp = loc1
|
||||
mov ar.unat = loc2 // restore ar.unat
|
||||
br.ret.sptk.many rp
|
||||
|
||||
.endp save_static_to_mem
|
||||
|
|
Loading…
Reference in a new issue