// FIB3         Fibonacci numbers using the register stack

        .text                    // Section for code
        .align  32               // Desired alignment
        .global fib3             // These three lines
        .proc   fib3             //  mark the mandatory
fib3:                            //   function entry
        .prologue 4,r9           // Mask for ar.pfs only
        alloc   r9 = ar.pfs,1,7,0,8  // ins, locs, outs, rots
        .body                    // Now we really begin...
        mov     r34 = 1          // r34 = F(n-1)
        cmp.geu p6,p0 = 2,in0    // Set F(N)=1...
        add     in0 = -3,in0     // Loop count
        mov     ar.ec = 1        // No epilog phase
   (p6) br.cond.spnt.few done;;  //  ...if N=1 or 2
        mov     r35 = 1          // r35 = F(N-2)
        mov     ar.lc = in0;;    // Set the loop count
loop:   add     r33 = r34,r35    // r33 = newest F(n)
        br.ctop.sptk.few loop;;  // r34 = F(N) sought
done:   mov     ret0 = r34       // Return F(N)
        br.ret.sptk.many b0;;    // Back to caller
        .endp   fib3             // Mark end of procedure