         Edinburgh IMP77 Compiler - Version 8.4
    1 %BEGIN
		.Ltext0:
				.align	2
		FACT.7693:
		.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]
				stp	x27, x28, [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,mult)
		.LVL0:
				stp	x29, x30, [sp, -16]!
				add	x29, sp, 0
		.L3:
    5       %IF N<=1 %THENRESULT=mult
				cmp	w0, 1
				bgt	.L8
    6       %RESULT=FACT(N-1,mult*N)
				mul	w1, w0, w1
		.LVL3:
				sub	w0, w0, #1
		.LVL4:
				bl	FACT.7693
		.LVL5:
				ldp	x29, x30, [sp], 16
				ret
		.LFE186:
				.align	2
				.global	main
		main:
		.LFB185:
    7 %END
				mov	w0, w1
		.LVL1:
				ret
		.LVL2:
		.L8:
    8 %ROUTINE COMPARE(%INTEGER I,J)
    9       %UNLESS I=J %START
				cmp	w23, w27
				beq	.L12
		.LBB27:
   10          PRINTSTRING("ERROR")
				adrp	x26, .LANCHOR0
				add	x26, x26, :lo12:.LANCHOR0
				add	x25, x29, 872
				add	x24, x29, 1128
				b	.L10
		.LVL8:
		.L12:
				mov	w20, w19
		.LBE26:
		.LBE25:
		.LBE24:
				cmp	w19, 100
				beq	.L11
		.LVL9:
		.L10:
				add	w19, w20, 1
		.LVL10:
				mov	w1, w22
				mov	w0, w19
				bl	FACT.7693
		.LVL11:
				mov	w23, w0
				mov	w1, w22
				mov	w0, w20
				bl	FACT.7693
		.LVL12:
				mul	w27, w0, w19
		.LVL13:
		.LBB33:
		.LBB32:
				mov	x28, 256
				mov	x2, x28
				mov	x1, x26
				mov	x0, x25
				bl	memcpy
		.LVL14:
				mov	x2, x28
				mov	x1, x25
				mov	x0, x24
				bl	memcpy
		.LVL15:
				add	x21, x29, 616
				mov	x2, x28
				mov	x1, x24
				mov	x0, x21
				bl	memcpy
		.LVL16:
		.LBE27:
		.LBB28:
		.LBB29:
				add	x20, x29, 96
				mov	x2, x28
				mov	x1, x21
				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, w23
				bl	_imp_writeint
		.LVL19:
   12          Fail=1; NEWLINE
				mov	w1, 5
				mov	w0, w27
				bl	_imp_writeint
		.LVL20:
				adrp	x0, .LANCHOR1
				str	w22, [x0, #:lo12:.LANCHOR1]
		.LBB30:
		.LBB31:
				bl	_imp_newline
		.LVL21:
				b	.L12
		.L11:
		.LBE31:
		.LBE30:
		.LBE32:
		.LBE33:
   13       %FINISH
   14 %END
   15       COMPARE(FACT(I,1),I*FACT(I-1,1)) %FOR I=2,1,100
   16       %if fail=0 %then printstring("TEST OK")
				mov	w20, 1
				adrp	x0, .LANCHOR1
				ldr	w0, [x0, #:lo12:.LANCHOR1]
				cbz	w0, .L16
		.LVL22:
		.L13:
		.LBB34:
		.LBB35:
				mov	w0, 0
				bl	exit
		.LVL23:
		.L16:
		.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	.L13
		.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
				mov	w22, w20
		.LBB24:
		.LBB25:
		.LBB26:
