         Edinburgh IMP77 Compiler - Version 8.4
    1 %BEGIN
		.Ltext0:
				.align	2
		FACT.7692:
		.LFB186:
		.LVL6:
				sub	sp, sp, #1392
				stp	x29, x30, [sp]
				add	x29, sp, 0
				stp	x19, x20, [sp, 16]
				stp	x21, x22, [sp, 32]
				stp	x23, x24, [sp, 48]
				stp	x25, x26, [sp, 64]
				str	x27, [sp, 80]
				adrp	x2, :got:__stack_chk_guard
				ldr	x2, [x2, #:got_lo12:__stack_chk_guard]
				ldr	x3, [x2]
				str	x3, [x29, 1384]
				mov	x3,0
    2 %owninteger fail=0
				bl	_imp_initialise
		.LVL7:
    3 %INTEGER I
    4 %INTEGERFN FACT(%INTEGER N)
		.LVL0:
				stp	x29, x30, [sp, -32]!
				add	x29, sp, 0
				str	x19, [sp, 16]
				mov	w19, w0
		.L3:
    5       %IF N<=1 %THENRESULT=1
				cmp	w0, 1
				bgt	.L9
    6       %RESULT=N*FACT(N-1)
				mov	w0, 1
		.LVL1:
				sub	w0, w0, #1
		.LVL3:
				bl	FACT.7692
		.LVL4:
				mul	w0, w0, w19
				ldr	x19, [sp, 16]
		.LVL5:
				ldp	x29, x30, [sp], 32
				ret
		.LFE186:
				.align	2
				.global	main
		main:
		.LFB185:
    7 %END
				ret
		.LVL2:
		.L9:
    8 %ROUTINE COMPARE(%INTEGER I,J)
    9       %UNLESS I=J %START
				cmp	w22, w27
				beq	.L13
		.LBB27:
   10          PRINTSTRING("ERROR")
				adrp	x26, .LANCHOR0
				add	x26, x26, :lo12:.LANCHOR0
				add	x25, x29, 872
				add	x24, x29, 1128
				add	x23, x29, 616
				b	.L11
		.LVL8:
		.L13:
				mov	w20, w19
		.LBE26:
		.LBE25:
		.LBE24:
				mov	x21, 256
				mov	x2, x21
				mov	x1, x26
				mov	x0, x25
				bl	memcpy
		.LVL14:
				mov	x2, x21
				mov	x1, x25
				mov	x0, x24
				bl	memcpy
		.LVL15:
				mov	x2, x21
				mov	x1, x24
				mov	x0, x23
				bl	memcpy
		.LVL16:
		.LBE27:
		.LBB28:
		.LBB29:
				add	x20, x29, 96
				mov	x2, x21
				mov	x1, x23
				mov	x0, x20
				bl	memcpy
		.LVL17:
				mov	x0, x20
				bl	_imp_printstring
		.LVL18:
		.LBE29:
		.LBE28:
   11          WRITE(I,5); WRITE(J,5)
				mov	w1, 5
				mov	w0, w22
				bl	_imp_writeint
		.LVL19:
   12          Fail=1; NEWLINE
				mov	w1, 5
				mov	w0, w27
				bl	_imp_writeint
		.LVL20:
				adrp	x0, .LANCHOR1
				mov	w1, 1
				str	w1, [x0, #:lo12:.LANCHOR1]
		.LBB30:
		.LBB31:
				bl	_imp_newline
		.LVL21:
				b	.L13
		.L12:
		.LBE31:
		.LBE30:
		.LBE32:
		.LBE33:
   13       %FINISH
   14 %END
   15       COMPARE(FACT(I),I*FACT(I-1)) %FOR I=2,1,10
   16       %if fail=0 %then printstring("TEST OK")
				mov	w20, 1
		.LBB24:
		.LBB25:
		.LBB26:
				adrp	x0, .LANCHOR1
				ldr	w0, [x0, #:lo12:.LANCHOR1]
				cbz	w0, .L17
		.LVL22:
		.L14:
		.LBB34:
		.LBB35:
				mov	w0, 0
				bl	exit
		.LVL23:
		.L17:
		.LBE35:
		.LBE34:
		.LBB36:
   17 %ENDOFPROGRAM
				add	x19, x29, 872
		.LVL24:
				mov	x20, 256
		.LVL25:
				mov	x2, x20
				adrp	x1, .LANCHOR0
				add	x1, x1, :lo12:.LANCHOR0
				add	x1, x1, x20
				mov	x0, x19
				bl	memcpy
		.LVL26:
				add	x21, x29, 360
				mov	x2, x20
				mov	x1, x19
				mov	x0, x21
				bl	memcpy
		.LVL27:
				mov	x2, x20
				mov	x1, x21
				mov	x0, x19
				bl	memcpy
		.LVL28:
		.LBE36:
		.LBB37:
		.LBB38:
				add	x0, x29, 96
				mov	x2, x20
				mov	x1, x19
				mov	x19, x0
				bl	memcpy
		.LVL29:
				mov	x0, x19
				bl	_imp_printstring
		.LVL30:
				b	.L14
		.LBE38:
		.LBE37:
		.LFE185:
				.section	.rodata
				.align	3
				.set	.LANCHOR0,. + 0
		.LC1:
				.byte	5
				.string	"ERROR"
				.zero	249
		.LC0:
				.byte	7
				.string	"TEST OK"
				.zero	247
				.bss
				.align	2
				.set	.LANCHOR1,. + 0
		FAIL.7689:
				.zero	4
		.Letext0:
   19 Statements compiled
				cmp	w19, 10
				beq	.L12
		.LVL9:
		.L11:
				add	w19, w20, 1
		.LVL10:
				mov	w0, w19
				bl	FACT.7692
		.LVL11:
				mov	w22, w0
				mov	w0, w20
				bl	FACT.7692
		.LVL12:
				mul	w27, w0, w19
		.LVL13:
		.LBB33:
		.LBB32:
