         Edinburgh IMP77 Compiler - Version 8.4
    1 %begin
		.Ltext0:
				.align	1
				.thumb
				.thumb_func
		ACKERMANN.10027:
		.LFB186:
				@ Volatile: function does not return.
				@ args = 0, pretend = 0, frame = 1032
				@ frame_needed = 0, uses_anonymous_args = 0
		.LVL10:
				push	{r7, lr}
				sub	sp, sp, #1272
				ldr	r3, .L18
		.LPIC0:
				add	r3, pc
				ldr	r2, .L18+4
				ldr	r3, [r3, r2]
				ldr	r3, [r3]
				str	r3, [sp, #1268]
    2   %integer %function ackermann(%integer m,n)
				@ args = 0, pretend = 0, frame = 0
				@ frame_needed = 0, uses_anonymous_args = 0
		.LVL0:
				push	{r4, lr}
				mov	r4, r0
				bl	_imp_initialise(PLT)
		.LVL11:
    3     %result = n+1 %if m = 0
				cbz	r0, .L8
		.L2:
    4     %result = ackermann(m-1,1) %if n = 0
				cbz	r1, .L9
		.L4:
				adds	r0, r1, #1
		.LVL5:
				bx	lr
		.LVL6:
		.L9:
    5     %result = ackermann(m-1,ackermann(m,n-1))
				subs	r1, r1, #1
		.LVL1:
				bl	ACKERMANN.10027(PLT)
		.LVL2:
				mov	r1, r0
				subs	r0, r4, #1
				bl	ACKERMANN.10027(PLT)
		.LVL3:
		.L1:
				movs	r1, #1
		.LVL7:
				subs	r0, r0, #1
		.LVL8:
				bl	ACKERMANN.10027(PLT)
		.LVL9:
				b	.L1
		.LFE186:
				.global	__aeabi_idiv
				.align	1
				.global	main
				.thumb
				.thumb_func
		main:
		.LFB185:
    6   %end
				pop	{r4, pc}
		.LVL4:
		.L8:
    7
    8   %owninteger i,j,k,k1,t1,t2
    9
   10   k = 16;  k1 = 1
				ldr	r3, .L18+8
		.LPIC1:
				add	r3, pc
				movs	r2, #16
				str	r2, [r3]
   11   %for i = 1,1,6 %cycle
				movs	r2, #1
				str	r2, [r3, #4]
   12     t1 = cputime            ;! cputime is in clocks_per_tick which is 1000000
				str	r0, [r5, #12]
   13     j = ackermann(3,i)
				movs	r6, #3
		.LBB24:
				ldr	r1, [r5, #8]
				mov	r0, r6
				bl	ACKERMANN.10027(PLT)
		.LVL19:
				str	r0, [r5, #16]
		.LBB33:
		.LBB34:
				bl	_imp_cputime(PLT)
		.LVL20:
		.LBE34:
		.LBE33:
   14     t2 = cputime
				movs	r3, #0
				ldr	r3, [r4, #8]
				cmp	r3, #6
				beq	.L17
		.L12:
				str	r0, [r5, #20]
   15     %if j # k-3 %then printstring("Wrong result!  ") %and newline
				ldr	r5, .L18+12
		.LPIC3:
				add	r5, pc
				adds	r3, r3, #1
				str	r3, [r5, #8]
		.LBB31:
		.LBB32:
				bl	_imp_cputime(PLT)
		.LVL18:
		.LBE32:
		.LBE31:
				ldr	r3, [r5]
				subs	r3, r3, #3
				ldr	r2, [r5, #16]
				cmp	r3, r2
				beq	.L11
		.LBB35:
   16     print((t2-t1){/1000},7,3)
				ldr	r7, .L18+16
		.LPIC10:
				add	r7, pc
				b	.L12
		.L11:
		.LVL12:
		.LBE24:
				ldr	r4, .L18+20
		.LPIC11:
				add	r4, pc
				ldr	r3, [r4, #20]
				ldr	r2, [r4, #12]
				subs	r3, r3, r2
				vmov	s0, r3	@ int
		.LBB25:
		.LBB26:
				mov	r1, r6
				movs	r0, #7
				vcvt.f64.s32	d0, s0
		.LVL13:
				bl	_imp_print(PLT)
		.LVL14:
		.LBE26:
		.LBE25:
				mov	r8, #256
				mov	r2, r8
				mov	r1, r7
				add	r4, sp, #1012
				mov	r0, r4
				bl	memcpy(PLT)
		.LVL21:
				mov	r2, r8
				mov	r1, r4
				add	r4, sp, #244
				mov	r0, r4
				bl	memcpy(PLT)
		.LVL22:
				mov	r2, r8
				mov	r1, r4
				add	r4, sp, #756
				mov	r0, r4
				bl	memcpy(PLT)
		.LVL23:
		.LBE35:
		.LBB36:
		.LBB37:
				movs	r2, #240
				add	r1, sp, #772
				mov	r0, sp
				bl	memcpy(PLT)
		.LVL24:
				ldm	r4, {r0, r1, r2, r3}
				bl	_imp_printstring(PLT)
		.LVL25:
		.LBE37:
		.LBE36:
		.LBB38:
		.LBB39:
				bl	_imp_newline(PLT)
		.LVL26:
				b	.L11
		.L17:
		.L13:
		.LBE39:
		.LBE38:
		.LBB40:
   17     print(3000*(t2-t1)/(512*k1-15*k+9*i+37),7,3)
				ldr	r0, [r4, #20]
				ldr	r3, [r4, #12]
				subs	r0, r0, r3
				ldr	r3, [r4, #4]
				ldr	r1, [r4]
				sub	r1, r1, r1, lsl #4
				add	r1, r1, r3, lsl #9
				ldr	r3, [r4, #8]
				add	r3, r3, r3, lsl #3
				add	r1, r1, r3
				adds	r1, r1, #37
				movw	r3, #3000
				mul	r0, r3, r0
				bl	__aeabi_idiv(PLT)
		.LVL15:
				vmov	s15, r0	@ int
				vcvt.f64.s32	d0, s15
		.LBB27:
		.LBB28:
				mov	r1, r6
				movs	r0, #7
				bl	_imp_print(PLT)
		.LVL16:
		.LBE28:
		.LBE27:
		.LBB29:
		.LBB30:
				bl	_imp_newline(PLT)
		.LVL17:
		.LBE30:
		.LBE29:
   18     newline
   19     k1 = 4*k1;  k = 2*k
				ldr	r3, [r4, #4]
				lsls	r3, r3, #2
				str	r3, [r4, #4]
   20   %repeat
				ldr	r3, [r4]
				lsls	r3, r3, #1
				str	r3, [r4]
		.LDL1:
   21   printstring("Done."); newline
				mov	r6, #256
				mov	r2, r6
				ldr	r1, .L18+24
		.LPIC23:
				add	r1, pc
				add	r1, r1, r6
				add	r4, sp, #1012
				mov	r0, r4
				bl	memcpy(PLT)
		.LVL27:
				mov	r2, r6
				mov	r1, r4
				add	r5, sp, #500
				mov	r0, r5
				bl	memcpy(PLT)
		.LVL28:
				mov	r2, r6
				mov	r1, r5
				mov	r0, r4
				bl	memcpy(PLT)
		.LVL29:
		.LBE40:
		.LBB41:
		.LBB42:
				movs	r2, #240
				addw	r1, sp, #1028
				mov	r0, sp
				bl	memcpy(PLT)
		.LVL30:
				ldm	r4, {r0, r1, r2, r3}
				bl	_imp_printstring(PLT)
		.LVL31:
		.LBE42:
		.LBE41:
		.LBB43:
		.LBB44:
				bl	_imp_newline(PLT)
		.LVL32:
		.LBE44:
		.LBE43:
		.LBB45:
		.LBB46:
				movs	r0, #0
				bl	exit(PLT)
		.LVL33:
		.L19:
				.align	2
		.L18:
				.word	_GLOBAL_OFFSET_TABLE_-(.LPIC0+4)
				.word	__stack_chk_guard(GOT)
				.word	.LANCHOR0-(.LPIC1+4)
				.word	.LANCHOR0-(.LPIC3+4)
				.word	.LANCHOR1-(.LPIC10+4)
				.word	.LANCHOR0-(.LPIC11+4)
				.word	.LANCHOR1-(.LPIC23+4)
		.LBE46:
		.LBE45:
		.LFE185:
				.section	.rodata
				.align	2
				.set	.LANCHOR1,. + 0
		.LC0:
				.byte	15
				.ascii	"Wrong result!  \000"
				.space	239
		.LC1:
				.byte	5
				.ascii	"Done.\000"
				.space	249
				.bss
				.align	2
				.set	.LANCHOR0,. + 0
		K.10033:
				.space	4
		K1.10034:
				.space	4
		I.10031:
				.space	4
		T1.10035:
				.space	4
		J.10032:
				.space	4
		T2.10036:
				.space	4
		.Letext0:
   22 %endofprogram
   23 Statements compiled
