         Edinburgh IMP77 Compiler - Version 8.4
    1 %begin
		.Ltext0:
				.align	2
		ACKERMANN.7691:
		.LFB186:
		.LVL11:
				sub	sp, sp, #1376
				stp	x29, x30, [sp]
				add	x29, sp, 0
				stp	x19, x20, [sp, 16]
				stp	x21, x22, [sp, 32]
				stp	x23, x24, [sp, 48]
				str	x25, [sp, 64]
				adrp	x2, :got:__stack_chk_guard
				ldr	x2, [x2, #:got_lo12:__stack_chk_guard]
				ldr	x3, [x2]
				str	x3, [x29, 1368]
				mov	x3,0
    2   %integer %function ackermann(%integer m,n)
		.LVL0:
				stp	x29, x30, [sp, -32]!
				add	x29, sp, 0
				str	x19, [sp, 16]
				mov	w19, w0
				bl	_imp_initialise
		.LVL12:
    3     %result = n+1 %if m = 0
				cbz	w0, .L8
		.L2:
    4     %result = ackermann(m-1,1) %if n = 0
				cbz	w1, .L9
		.L4:
				add	w0, w1, 1
		.LVL6:
				ret
		.LVL7:
		.L9:
    5     %result = ackermann(m-1,ackermann(m,n-1))
				sub	w1, w1, #1
		.LVL1:
				bl	ACKERMANN.7691
		.LVL2:
				mov	w1, w0
				sub	w0, w19, #1
				bl	ACKERMANN.7691
		.LVL3:
		.L1:
				mov	w1, 1
		.LVL8:
				sub	w0, w0, #1
		.LVL9:
				bl	ACKERMANN.7691
		.LVL10:
				b	.L1
		.LFE186:
				.align	2
				.global	main
		main:
		.LFB185:
    6   %end
				ldr	x19, [sp, 16]
		.LVL4:
				ldp	x29, x30, [sp], 32
				ret
		.LVL5:
		.L8:
    7
    8   %owninteger i,j,k,k1,t1,t2
    9
   10   k = 16;  k1 = 1
				adrp	x0, .LANCHOR0
				add	x1, x0, :lo12:.LANCHOR0
				mov	w2, 16
				str	w2, [x0, #:lo12:.LANCHOR0]
   11   %for i = 1,1,6 %cycle
				mov	w0, 1
				str	w0, [x1, 4]
   12     t1 = cputime            ;! cputime is in clocks_per_tick which is 1000000
				str	w0, [x19, 12]
   13     j = ackermann(3,i)
				mov	w20, 3
		.LBB24:
				ldr	w1, [x19, 8]
				mov	w0, w20
				bl	ACKERMANN.7691
		.LVL18:
				str	w0, [x19, 16]
		.LBB33:
		.LBB34:
				bl	_imp_cputime
		.LVL19:
		.LBE34:
		.LBE33:
   14     t2 = cputime
				mov	w0, 0
				ldr	w0, [x19, 8]
				cmp	w0, 6
				beq	.L17
		.L12:
				str	w0, [x19, 20]
   15     %if j # k-3 %then printstring("Wrong result!  ") %and newline
				mov	x19, x1
				add	w0, w0, 1
				str	w0, [x19, 8]
		.LBB31:
		.LBB32:
				bl	_imp_cputime
		.LVL17:
		.LBE32:
		.LBE31:
				ldr	w0, [x19]
				sub	w0, w0, #3
				ldr	w1, [x19, 16]
				cmp	w0, w1
				beq	.L11
		.LBB35:
   16     print((t2-t1){/1000},7,3)
				adrp	x22, .LANCHOR1
				add	x22, x22, :lo12:.LANCHOR1
				add	x21, x29, 1112
				b	.L12
		.L11:
		.LVL13:
		.LBE24:
				ldr	w2, [x19, 20]
				ldr	w0, [x19, 12]
				sub	w2, w2, w0
		.LBB25:
		.LBB26:
				mov	w1, w20
				mov	w0, 7
				scvtf	d0, w2
				bl	_imp_print
		.LVL14:
		.LBE26:
		.LBE25:
				mov	x25, 256
				mov	x2, x25
				mov	x1, x22
				mov	x0, x21
				bl	memcpy
		.LVL20:
				add	x23, x29, 344
				mov	x2, x25
				mov	x1, x21
				mov	x0, x23
				bl	memcpy
		.LVL21:
				add	x24, x29, 856
				mov	x2, x25
				mov	x1, x23
				mov	x0, x24
				bl	memcpy
		.LVL22:
		.LBE35:
		.LBB36:
		.LBB37:
				add	x23, x29, 80
				mov	x2, x25
				mov	x1, x24
				mov	x0, x23
				bl	memcpy
		.LVL23:
				mov	x0, x23
				bl	_imp_printstring
		.LVL24:
		.LBE37:
		.LBE36:
		.LBB38:
		.LBB39:
				bl	_imp_newline
		.LVL25:
				b	.L11
		.L17:
		.L13:
		.LBE39:
		.LBE38:
		.LBB40:
   17     print(3000*(t2-t1)/(512*k1-15*k+9*i+37),7,3)
				ldr	w2, [x19, 20]
				ldr	w0, [x19, 12]
				sub	w2, w2, w0
				mov	w0, 3000
				mul	w2, w2, w0
				ldr	w0, [x19, 4]
				ldr	w1, [x19]
				sub	w1, w1, w1, lsl 4
				add	w0, w1, w0, lsl 9
				ldr	w1, [x19, 8]
				add	w1, w1, w1, lsl 3
				add	w0, w0, w1
				add	w0, w0, 37
				sdiv	w2, w2, w0
		.LBB27:
		.LBB28:
				mov	w1, w20
				mov	w0, 7
				scvtf	d0, w2
				bl	_imp_print
		.LVL15:
		.LBE28:
		.LBE27:
		.LBB29:
		.LBB30:
				bl	_imp_newline
		.LVL16:
		.LBE30:
		.LBE29:
   18     newline
   19     k1 = 4*k1;  k = 2*k
				ldr	w0, [x19, 4]
				lsl	w0, w0, 2
				str	w0, [x19, 4]
   20   %repeat
				ldr	w0, [x19]
				lsl	w0, w0, 1
				str	w0, [x19]
		.LDL1:
   21   printstring("Done."); newline
				add	x19, x29, 1112
				mov	x20, 256
				mov	x2, x20
				adrp	x1, .LANCHOR1
				add	x1, x1, :lo12:.LANCHOR1
				add	x1, x1, x20
				mov	x0, x19
				bl	memcpy
		.LVL26:
				add	x21, x29, 600
				mov	x2, x20
				mov	x1, x19
				mov	x0, x21
				bl	memcpy
		.LVL27:
				mov	x2, x20
				mov	x1, x21
				mov	x0, x19
				bl	memcpy
		.LVL28:
		.LBE40:
		.LBB41:
		.LBB42:
				add	x0, x29, 80
				mov	x2, x20
				mov	x1, x19
				mov	x19, x0
				bl	memcpy
		.LVL29:
				mov	x0, x19
				bl	_imp_printstring
		.LVL30:
		.LBE42:
		.LBE41:
		.LBB43:
		.LBB44:
				bl	_imp_newline
		.LVL31:
		.LBE44:
		.LBE43:
		.LBB45:
		.LBB46:
				mov	w0, 0
				bl	exit
		.LVL32:
		.LBE46:
		.LBE45:
		.LFE185:
				.section	.rodata
				.align	3
				.set	.LANCHOR1,. + 0
		.LC0:
				.byte	15
				.string	"Wrong result!  "
				.zero	239
		.LC1:
				.byte	5
				.string	"Done."
				.zero	249
				.bss
				.align	2
				.set	.LANCHOR0,. + 0
		K.7697:
				.zero	4
		K1.7698:
				.zero	4
		I.7695:
				.zero	4
		T1.7699:
				.zero	4
		J.7696:
				.zero	4
		T2.7700:
				.zero	4
		.Letext0:
   22 %endofprogram
   23 Statements compiled
