|

楼主 |
发表于 2010-12-6 23:33:21
|
显示全部楼层
我们写几个无聊的函数来测试一下:
def stdcall fac(x)
var n = 1 in
(for i = 1, i < x + 0.1 in
n = n * i) :
n;
def stdcall fib(x)
var a = 1, b = 1, c in
(for i = 3, i < x + 0.1 in
c = a + b :
a = b :
b = c) :
b;
def stdcall bar(x y)
var n = 1 in
(for i = 1, i < y + 0.1 in
n = n * x) :
n;
def stdcall baz(x y)
if y < 0 then
1 / bar(x, 0 - y)
else
bar(x, y);
def stdcall foo(x y)
var n = 0 in
(for i = 1, i < x + 0.1 in
n = n + baz(i, y)) :
n;
效果:
ready> def stdcall fac(x)
var n = 1 in
(for i = 1, i < x + 0.1 in
n = n * i) :
n;
def stdcall fib(x)
var a = 1, b = 1, c in
(for i = 3, i < x + 0.1 in
c = a + b :
a = b :
b = c) :
b;
def stdcall bar(x y)
var n = 1 in
(for i = 1, i < y + 0.1 in
n = n * x) :
n;
def stdcall baz(x y)
if y < 0 then
1 / bar(x, 0 - y)
else
bar(x, y);
def stdcall foo(x y)
var n = 0 in
(for i = 1, i < x + 0.1 in
n = n + baz(i, y)) :
n;
ready> Parsed a function definition.
define x86_stdcallcc double @fac(double %x) {
entry:
br label %loop
loop: ; preds = %loop_1, %entry
%n.0 = phi double [ 1.000000e+000, %entry ], [ %multmp, %loop_1 ]
%i.0 = phi double [ 1.000000e+000, %entry ], [ %nextvar, %loop_1 ]
%addtmp = fadd double %x, 1.000000e-001
%cmptmp = fcmp ult double %i.0, %addtmp
br i1 %cmptmp, label %loop_1, label %afterloop
loop_1: ; preds = %loop
%multmp = fmul double %n.0, %i.0
%nextvar = fadd double %i.0, 1.000000e+000
br label %loop
afterloop: ; preds = %loop
ret double %n.0
}
ready> ready> Parsed a function definition.
define x86_stdcallcc double @fib(double %x) {
entry:
br label %loop
loop: ; preds = %loop_1, %entry
%a.0 = phi double [ 1.000000e+000, %entry ], [ %b.0, %loop_1 ]
%b.0 = phi double [ 1.000000e+000, %entry ], [ %addtmp6, %loop_1 ]
%i.0 = phi double [ 3.000000e+000, %entry ], [ %nextvar, %loop_1 ]
%addtmp = fadd double %x, 1.000000e-001
%cmptmp = fcmp ult double %i.0, %addtmp
br i1 %cmptmp, label %loop_1, label %afterloop
loop_1: ; preds = %loop
%addtmp6 = fadd double %a.0, %b.0
%nextvar = fadd double %i.0, 1.000000e+000
br label %loop
afterloop: ; preds = %loop
ret double %b.0
}
ready> ready> Parsed a function definition.
define x86_stdcallcc double @bar(double %x, double %y) {
entry:
br label %loop
loop: ; preds = %loop_1, %entry
%n.0 = phi double [ 1.000000e+000, %entry ], [ %multmp, %loop_1 ]
%i.0 = phi double [ 1.000000e+000, %entry ], [ %nextvar, %loop_1 ]
%addtmp = fadd double %y, 1.000000e-001
%cmptmp = fcmp ult double %i.0, %addtmp
br i1 %cmptmp, label %loop_1, label %afterloop
loop_1: ; preds = %loop
%multmp = fmul double %n.0, %x
%nextvar = fadd double %i.0, 1.000000e+000
br label %loop
afterloop: ; preds = %loop
ret double %n.0
}
ready> ready> Parsed a function definition.
define x86_stdcallcc double @baz(double %x, double %y) {
entry:
%cmptmp = fcmp ult double %y, 0.000000e+000
br i1 %cmptmp, label %then, label %else
then: ; preds = %entry
%subtmp = fsub double 0.000000e+000, %y
%calltmp = call x86_stdcallcc double @bar(double %x, double %subtmp)
%divtmp = fdiv double 1.000000e+000, %calltmp
ret double %divtmp
else: ; preds = %entry
%calltmp8 = call x86_stdcallcc double @bar(double %x, double %y)
ret double %calltmp8
}
ready> ready> Parsed a function definition.
define x86_stdcallcc double @foo(double %x, double %y) {
entry:
br label %loop
loop: ; preds = %loop_1, %entry
%n.0 = phi double [ 0.000000e+000, %entry ], [ %addtmp8, %loop_1 ]
%i.0 = phi double [ 1.000000e+000, %entry ], [ %nextvar, %loop_1 ]
%addtmp = fadd double %x, 1.000000e-001
%cmptmp = fcmp ult double %i.0, %addtmp
br i1 %cmptmp, label %loop_1, label %afterloop
loop_1: ; preds = %loop
%calltmp = call x86_stdcallcc double @baz(double %i.0, double %y)
%addtmp8 = fadd double %n.0, %calltmp
%nextvar = fadd double %i.0, 1.000000e+000
br label %loop
afterloop: ; preds = %loop
ret double %n.0
}
ready>
输入这些函数以后,点击Command3,看看是不是“OK”了 ……然后你会看到多出一个“test.obj”文件…… |
|