# Copyright (C) 2002-2009, Parrot Foundation.
# $Id: stack.pir 38369 2009-04-26 12:57:09Z fperrad $

#
# stack__duplicate()
#
# duplicate element at top of stack
# befunge stack:
#   before:     ... v
#   after:      ... v v
# no return value
#
.sub "stack__duplicate"
    $I0 = stack__pop()

    $P0 = get_global "stack"
    push $P0, $I0
    push $P0, $I0
    set_global "stack", $P0
    .return()
.end


#
# val = stack__pop()
#
# pop and return a value from the stack, or 0 if stack is empty.
# befunge stack:
#    before:    ... v
#    after:     ...
#
.sub "stack__pop"
    $P0 = get_global "stack"

    $I0 = $P0
    if $I0 > 0 goto STACK__POP__POP
    .return(0)

  STACK__POP__POP:
    $I1 = pop $P0
    set_global "stack", $P0
    .return($I1)
.end


#
# stack__push(v)
#
# push a value on the stack.
# befunge stack:
#    before:    ...
#    after:     ... v
# no return value
#
.sub "stack__push"
    .param int v
    $P0 = get_global "stack"
    push $P0, v
    set_global "stack", $P0
.end


#
# stack__swap()
#
# swap.
# befunge stack:
#   before:     ... a b
#   after:      ... b a
# no return value
#
.sub "stack__swap"
    $I0 = stack__pop()
    $I1 = stack__pop()
    stack__push($I0)
    stack__push($I1)
.end


########################################################################
# Local Variables:
#   mode: pir
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir:

