diff --git a/tests/ia64-test-nat-asm.S b/tests/ia64-test-nat-asm.S index ba3ba7c5..ca2625d5 100644 --- a/tests/ia64-test-nat-asm.S +++ b/tests/ia64-test-nat-asm.S @@ -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