xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/jit/docs/examples/tut04-toyvm/fibonacci.toy (revision 36ac495d2b3ea2b9d96377b2143ebfedac224b92)
1*36ac495dSmrg# Simple recursive fibonacci implementation, roughly equivalent to:
2*36ac495dSmrg#
3*36ac495dSmrg#  int fibonacci (int arg)
4*36ac495dSmrg#  {
5*36ac495dSmrg#     if (arg < 2)
6*36ac495dSmrg#       return arg
7*36ac495dSmrg#     return fibonacci (arg-1) + fibonacci (arg-2)
8*36ac495dSmrg#  }
9*36ac495dSmrg
10*36ac495dSmrg# Initial state:
11*36ac495dSmrg# stack: [arg]
12*36ac495dSmrg
13*36ac495dSmrg# 0:
14*36ac495dSmrgDUP
15*36ac495dSmrg# stack: [arg, arg]
16*36ac495dSmrg
17*36ac495dSmrg# 1:
18*36ac495dSmrgPUSH_CONST 2
19*36ac495dSmrg# stack: [arg, arg, 2]
20*36ac495dSmrg
21*36ac495dSmrg# 2:
22*36ac495dSmrgBINARY_COMPARE_LT
23*36ac495dSmrg# stack: [arg, (arg < 2)]
24*36ac495dSmrg
25*36ac495dSmrg# 3:
26*36ac495dSmrgJUMP_ABS_IF_TRUE 13
27*36ac495dSmrg# stack: [arg]
28*36ac495dSmrg
29*36ac495dSmrg# 4:
30*36ac495dSmrgDUP
31*36ac495dSmrg# stack: [arg, arg]
32*36ac495dSmrg
33*36ac495dSmrg# 5:
34*36ac495dSmrgPUSH_CONST  1
35*36ac495dSmrg# stack: [arg, arg, 1]
36*36ac495dSmrg
37*36ac495dSmrg# 6:
38*36ac495dSmrgBINARY_SUBTRACT
39*36ac495dSmrg# stack: [arg,  (arg - 1)
40*36ac495dSmrg
41*36ac495dSmrg# 7:
42*36ac495dSmrgRECURSE
43*36ac495dSmrg# stack: [arg, fib(arg - 1)]
44*36ac495dSmrg
45*36ac495dSmrg# 8:
46*36ac495dSmrgROT
47*36ac495dSmrg# stack: [fib(arg - 1), arg]
48*36ac495dSmrg
49*36ac495dSmrg# 9:
50*36ac495dSmrgPUSH_CONST  2
51*36ac495dSmrg# stack: [fib(arg - 1), arg, 2]
52*36ac495dSmrg
53*36ac495dSmrg# 10:
54*36ac495dSmrgBINARY_SUBTRACT
55*36ac495dSmrg# stack: [fib(arg - 1), arg,  (arg - 2)
56*36ac495dSmrg
57*36ac495dSmrg# 11:
58*36ac495dSmrgRECURSE
59*36ac495dSmrg# stack: [fib(arg - 1), fib(arg - 1)]
60*36ac495dSmrg
61*36ac495dSmrg# 12:
62*36ac495dSmrgBINARY_ADD
63*36ac495dSmrg# stack: [fib(arg - 1) + fib(arg - 1)]
64*36ac495dSmrg
65*36ac495dSmrg# 13:
66*36ac495dSmrgRETURN
67