declare i32 @printf(i8*, ...) declare void @putchar(i32) @maxiter = internal constant i32 32 @lbound = internal constant double -2.0 @rbound = internal constant double 1.0 @tbound = internal constant double 1.5 @bbound = internal constant double -1.5 @hincr = internal constant double 0.03125 @vincr = internal constant double 0.0625 define internal i32 @mandeliter(double %x, double %y) { entry: br label %loopbody loopbody: %a = phi double [%x, %entry], [%na, %increment] %b = phi double [%y, %entry], [%nb, %increment] %n = phi i32 [0, %entry], [%nn, %increment] %a2 = fmul double %a, %a %b2 = fmul double %b, %b %a2mb2 = fsub double %a2, %b2 %na = fadd double %a2mb2, %x %ab = fmul double %a, %b %ab2 = fadd double %ab, %ab %nb = fadd double %ab2, %y %norm = fadd double %a2, %b2 %cmp = fcmp ogt double %norm, 4.0 br i1 %cmp, label %afterloop, label %increment increment: %nn = add i32 %n, 1 %maxiter = load i32, i32* @maxiter %icmp = icmp slt i32 %nn, %maxiter br i1 %icmp, label %loopbody, label %afterloop afterloop: %retn = phi i32 [%n, %loopbody], [%nn, %increment] ret i32 %retn } @num_formatstr = internal constant [4 x i8] c"%d \00" define internal void @printnum32(i32 %n) { entry: %f = getelementptr [4 x i8], [4 x i8]* @num_formatstr, i64 0, i32 0 call i32(i8*, ...) @printf(i8* %f, i32 %n) ret void } define internal void @printnum8(i8 %n) { entry: %n32 = sext i8 %n to i32 tail call void @printnum32(i32 %n32) ret void } @shadestr = internal constant [10 x i8] c" .,-:!%@#\00" define i32 @main() { entry: %lbound = load double, double* @lbound %rbound = load double, double* @rbound %tbound = load double, double* @tbound %bbound = load double, double* @bbound %hincr = load double, double* @hincr %vincr = load double, double* @vincr br label %yloop yloop: %y = phi double [%tbound, %entry], [%ny, %yloop2] br label %xloop xloop: %x = phi double [%lbound, %yloop], [%nx, %xloop] %n = call i32 @mandeliter(double %x, double %y) %nL = mul i32 %n, 8 %maxiter = load i32, i32* @maxiter %nLdM = sdiv i32 %nL, %maxiter %shadechrp = getelementptr [10 x i8], [10 x i8]* @shadestr, i64 0, i32 %nLdM %shadechr = load i8, i8* %shadechrp %shadeint = sext i8 %shadechr to i32 call void @putchar(i32 %shadeint) %nx = fadd double %x, %hincr %xcmp = fcmp ole double %nx, %rbound br i1 %xcmp, label %xloop, label %yloop2 yloop2: %ny = fsub double %y, %vincr call void @putchar(i32 10) %ycmp = fcmp oge double %ny, %bbound br i1 %ycmp, label %yloop, label %return return: ret i32 0 }