aboutsummaryrefslogtreecommitdiffstats
path: root/translate/grt/config/ia64.S
diff options
context:
space:
mode:
Diffstat (limited to 'translate/grt/config/ia64.S')
-rw-r--r--translate/grt/config/ia64.S193
1 files changed, 193 insertions, 0 deletions
diff --git a/translate/grt/config/ia64.S b/translate/grt/config/ia64.S
new file mode 100644
index 000000000..cd77d497a
--- /dev/null
+++ b/translate/grt/config/ia64.S
@@ -0,0 +1,193 @@
+ .file "ia64.S"
+ .pred.safe_across_calls p1-p5,p16-p63
+
+ .text
+ .align 16
+ .proc grt_stack_loop
+grt_stack_loop:
+ alloc r32 = ar.pfs, 0, 1, 1, 0
+ .body
+ ;;
+1: mov r33 = r4
+ br.call.sptk.many b0 = b1
+ ;;
+ br 1b
+ .endp
+
+ .global grt_stack_switch#
+ .proc grt_stack_switch#
+ /* r32: struct stack_context *TO, r33: struct stack_context *FROM. */
+ // Registers to be saved:
+ // ar.rsc, ar.bsp, ar.pfs, ar.lc, ar.rnat [5]
+ // gp, r4-r7 (+ Nat) [6]
+ // f2-f5, f16-f31 [20]
+ // p1-p5, p16-p63 [1] ???
+ // b1-b5 [5]
+grt_stack_switch:
+ .prologue 2, 2
+ .vframe r2
+ alloc r31=ar.pfs, 2, 0, 0, 0
+ adds r12 = -160, r12
+ .body
+ ;;
+ // Save ar.rsc, ar.bsp, ar.pfs
+ {
+ mov r14 = ar.rsc
+ mov r15 = ar.bsp
+ adds r22 = (5*8), r12
+ }
+ ;;
+ {
+ st8 [r12] = r14 // sp + 0 <- ar.rsc
+ st8.spill [r22] = r1, 8 // sp + 40 <- r1
+ adds r20 = 8, r12
+ }
+ ;;
+ st8 [r20] = r15, 8 // sp + 8 <- ar.bsp
+ st8.spill [r22] = r4, 8 // sp + 48 <- r4
+ ;;
+ mov r15 = ar.lc
+ st8 [r20] = r31, 8 // sp + 16 <- ar.pfs
+ st8.spill [r22] = r5, 8 // sp + 56 <- r5
+ ;;
+ mov r14 = b0
+ st8 [r20] = r15, 8 // sp + 24 <- ar.lc
+ // Flush dirty registers to the backing store
+ flushrs
+ ;;
+ // Set the RSE in enforced lazy mode.
+ mov ar.rsc = 0
+ ;;
+ mov r15 = ar.rnat
+ st8.spill [r22] = r6, 8 // sp + 64 <- r6
+ ;;
+ mov r16 = b1
+ st8.spill [r22] = r7, 16 // sp + 72 <- r7
+ st8 [r20] = r15, 64 // sp + 32 <- ar.rnat
+ ;;
+ mov r15 = b2
+ mov r17 = ar.unat
+ st8 [r20] = r14, 8 // sp + 96 <- b0
+ ;;
+ mov r14 = b3
+ st8 [r22] = r17, 24 // sp + 88 <- ar.unat
+ st8 [r20] = r16, 16 // sp + 104 <- b1
+ ;;
+ st8 [r22] = r15, 16 // sp + 112 <- b2
+ st8 [r20] = r14, 16 // sp + 120 <- b3
+ mov r16 = b4
+ ;;
+ st8 [r22] = r16, 16 // sp + 128 <- b4
+ // Read new sp.
+ ld8 r21 = [r32]
+ mov r15 = b5
+ ;;
+ mov r14 = pr
+ st8 [r20] = r15 // sp + 136 <- b5
+ ;;
+ st8 [r22] = r14 // sp + 144 <- pr
+ adds r20 = 8, r21
+ ;;
+ invala
+ // Save sp.
+ st8 [r33] = r12
+ ld8 r14 = [r21], 88 // sp + 0 (ar.rsc)
+ ;;
+ ld8 r15 = [r21], -56 // sp + 88 (ar.unat)
+ ld8 r16 = [r20], 8 // sp + 8 (ar.bsp)
+ ;;
+ ld8 r17 = [r21], 8 // sp + 32 (ar.rnat)
+ ld8 r18 = [r20], 8 // sp + 16 (ar.pfs)
+ mov ar.unat = r15
+ ;;
+ ld8 r15 = [r20], 72 // sp + 24 (ar.lc)
+ ld8.fill r1 = [r21], 8 // sp + 40 (r1)
+ mov ar.bspstore = r16
+ ;;
+ mov ar.rnat = r17
+ mov ar.pfs = r18
+ ld8.fill r4 = [r21], 8 // sp + 48 (r4)
+ ;;
+ mov ar.rsc = r14
+ mov ar.lc = r15
+ ld8 r17 = [r20], 8 // sp + 96 (b0)
+ ;;
+ mov b0 = r17
+ ld8.fill r5 = [r21], 8 // sp + 56 (r5)
+ ld8 r14 = [r20], 8 // sp + 104 (b1)
+ ;;
+ mov b1 = r14
+ ld8.fill r6 = [r21], 8 // sp + 64 (r6)
+ ld8 r15 = [r20], 8 // sp + 112 (b2)
+ ;;
+ mov b2 = r15
+ ld8.fill r7 = [r21], 8 // sp + 72 (r7)
+ ld8 r14 = [r20], 8 // sp + 120 (b3)
+ ;;
+ mov b3 = r14
+ ld8 r15 = [r20], 8 // sp + 128 (b4)
+ ;;
+ mov b4 = r15
+ ld8 r14 = [r20], 8 // sp + 136 (b5)
+ ;;
+ mov b5 = r14
+ ld8 r15 = [r20], 8 // sp + 144 (pr)
+ mov r12 = r21
+ ;;
+ mov pr = r15, -1
+ br.ret.sptk.many b0
+ ;;
+ .endp grt_stack_switch#
+
+ .align 16
+ // r32: func, r33: arg
+ .global grt_stack_create#
+ .proc grt_stack_create#
+grt_stack_create:
+ .prologue 14, 34
+ .save ar.pfs, r35
+ alloc r35 = ar.pfs, 2, 4, 0, 0
+ .save rp, r34
+ mov r34 = b0
+ ;;
+ .body
+ br.call.sptk.many b0 = grt_stack_allocate#
+ ;;
+ // Compute backing store.
+ movl r14=stack_max_size
+ ld8 r22 = [r32], 8 // read ip (-> b1)
+ adds r20 = -(160 + 16), r8
+ adds r21 = -(160 + 16) + 32, r8
+ ;;
+ mov r18 = 0x0f // ar.rsc: LE, PL=3, Eager
+ ld4 r14 = [r14] // r16: bsp
+ st8 [r21] = r0, 8 // sp + 32 (ar.rnat = 0)
+ ld8 r23 = [r32] // read r1 from func
+ st8 [r8] = r20 // Save cur_sp
+ ;;
+ st8 [r20] = r18, 8 // sp + 0 (ar.rsc)
+ st8 [r21] = r23, 64 // sp + 40 (r1 = func.r1)
+ sub r14 = r8, r14 // Backing store base
+ ;;
+ adds r14 = 16, r14 // Add sizeof (stack_context)
+ st8 [r21] = r22, -8 // sp + 104 (b1 = func.ip)
+ ;;
+ movl r15 = grt_stack_loop
+ mov r16 = (0 << 7) | 1 // CFM: sol=0, sof=1
+ st8 [r20] = r14, 8 // sp + 8 (ar.bsp)
+ ;;
+ st8 [r21] = r15, -48 // sp + 96 (b0 = grt_stack_loop)
+ st8 [r20] = r16, 8 // sp + 16 (ar.pfs)
+ ;;
+ st8 [r20] = r0, 8 // sp + 24 (ar.lc)
+ st8 [r21] = r33 // sp + 48 (r4 = arg)
+ ;;
+ st8 [r20] = r0, 8 // sp + 32 (ar.rnat)
+ ;;
+
+ mov ar.pfs = r35
+ mov b0 = r34
+ br.ret.sptk.many b0
+ ;;
+ .endp grt_stack_create#
+ .ident "GCC: (GNU) 4.0.2"