progs/fun/fun_llvm.sc
changeset 1037 0b4a34ebd574
parent 976 4be299d9b41b
equal deleted inserted replaced
1036:b84e794b9e88 1037:0b4a34ebd574
       
     1 
       
     2 env = [i => 0, i => 1]
       
     3 
       
     4 
       
     5 def time_needed[T](code: => T) = {
       
     6   val start = System.nanoTime()
       
     7   code
       
     8   val end = System.nanoTime()
       
     9   (end - start)/(1.0e9)
       
    10 }
       
    11 
       
    12 time_needed(1, 1 + 2)
       
    13 
       
    14 def time_needed[T](f: T => T, arg: T) = {
       
    15   val start = System.nanoTime()
       
    16   f(arg)
       
    17   val end = System.nanoTime()
       
    18   (end - start)/(1.0e9)
       
    19 }
       
    20 
       
    21 
       
    22 
       
    23 
       
    24 
       
    25 
     1 // A Small LLVM Compiler for a Simple Functional Language
    26 // A Small LLVM Compiler for a Simple Functional Language
     2 // (includes a lexer and parser)
    27 // (includes a lexer and parser)
     3 //
    28 //
     4 //
    29 //
     5 // call with 
    30 // call with 
   101 
   126 
   102 def draw(k: KVal) = "│" ++ draw_val(k, "", false)
   127 def draw(k: KVal) = "│" ++ draw_val(k, "", false)
   103 
   128 
   104 // val k1 = KVar("foo")
   129 // val k1 = KVar("foo")
   105 // val k2 = KNum(1)
   130 // val k2 = KNum(1)
   106 // val k3 = Kop("-", Kop("+", k1, k2), KNum(2))
   131 // val k3 = Kop("-", Kop("+", k1, k2), KNum(2))    // not in SSA-form
   107 // println(draw(k3).mkString)
   132 // println(draw(k3))
   108 // println(draw(KCall("bar", List(k1,k2,k3,k2,k1))).mkString)
   133 // println(draw(KCall("bar", List(k1,k2,k3,k2,k1))))
   109 
   134 
   110 
   135 
   111 // CPS translation from Exps to KExps using a
   136 // CPS translation from Exps to KExps using a
   112 // continuation k.
   137 // continuation k.
   113 def CPS(e: Exp)(k: KVal => KExp) : KExp = e match {
   138 def CPS(e: Exp)(k: KVal => KExp) : KExp = e match {
   141     CPS(e)(y => KLet(z, KWrite(y), k(KVar(z))))
   166     CPS(e)(y => KLet(z, KWrite(y), k(KVar(z))))
   142   }
   167   }
   143 }   
   168 }   
   144 
   169 
   145 //initial continuation
   170 //initial continuation
   146 def CPSi(e: Exp) = CPS(e)(KReturn(_))
   171 def CPSi(e: Exp) = CPS(e)(x => KReturn(x))
   147 
   172 
   148 
   173 //write (1 + a)
       
   174 println(CPSi(Write(Aop("+", Num(1), Var("a")))).toString)
   149 
   175 
   150 //some testcases:
   176 //some testcases:
   151 // (1 + 2) * 3
   177 // (1 + 2) * 3
   152 println(CPSi(Aop("*", Aop("+", Num(1), Num(2)), Num(3))).toString)
   178 println(CPSi(Aop("*", Aop("+", Num(1), Num(2)), Num(3))).toString)
   153 
   179