         Edinburgh IMP77 Compiler - Version 8.4
    1 %BEGIN
				.section	".text"
		.Ltext0:
				.align 4
				.proc	04
		FACT.6060:
		.LFB186:
				.register	%g7, #ignore
		.LVL3:
				save	%sp, -1472, %sp
		.LVL4:
				ldx	[%g7+40], %g1
				stx	%g1, [%fp+2039]
				mov	0, %g1
    2 %owninteger fail=0
				mov	%i1, %o1
				call	_imp_initialise, 0
				 mov	%i0, %o0
		.LVL5:
    3 %INTEGER I
    4 %INTEGERFN FACT(%INTEGER N,mult)
		.LVL0:
				save	%sp, -176, %sp
		.LVL1:
    5       %IF N<=1 %THENRESULT=mult
				cmp	%i0, 1
				bg,pn	%icc, .L5
				 mov	%i1, %o0
    6       %RESULT=FACT(N-1,mult*N)
				mulx	%i0, %i1, %i1
				add	%i0, -1, %i0
				sra	%i1, 0, %o1
				call	FACT.6060, 0
				 sra	%i0, 0, %o0
		.LVL2:
				sra	%o0, 0, %i0
				return	%i7+8
				 nop
		.LFE186:
				.section	".rodata"
		.LC1:
				.byte	5
				.asciz	"ERROR"
				.skip	249
		.LC0:
				.byte	7
				.asciz	"TEST OK"
				.skip	247
				.section	".text"
				.align 4
				.global main
				.proc	04
		main:
		.LFB185:
    7 %END
				sra	%o0, 0, %i0
				return	%i7+8
				 nop
		.L5:
		.L3:
    8 %ROUTINE COMPARE(%INTEGER I,J)
    9       %UNLESS I=J %START
				cmp	%i3, %i4
				be,pn	%icc, .L10
				 mov	256, %o2
		.LBB27:
   10          PRINTSTRING("ERROR")
				sethi	%hi(.LC1), %i2
				or	%i2, %lo(.LC1), %i2
		.LBE26:
				mov	%i2, %o1
				call	memcpy, 0
				 add	%fp, 1527, %o0
		.LVL13:
				mov	256, %o2
				add	%fp, 1527, %o1
				call	memcpy, 0
				 add	%fp, 1783, %o0
		.LVL14:
				mov	256, %o2
				add	%fp, 1783, %o1
				call	memcpy, 0
				 add	%fp, 1271, %o0
		.LVL15:
		.LBE27:
		.LBB28:
		.LBB29:
				mov	256, %o2
				add	%fp, 1271, %o1
				call	memcpy, 0
				 add	%fp, 751, %o0
		.LVL16:
				call	_imp_printstring, 0
				 add	%fp, 751, %o0
		.LVL17:
		.LBE29:
		.LBE28:
   11          WRITE(I,5); WRITE(J,5)
				mov	5, %o1
				call	_imp_writeint, 0
				 mov	%i3, %o0
		.LVL18:
   12          Fail=1; NEWLINE
				sethi	%hi(FAIL.6056), %i0
		.LVL6:
		.LBE25:
		.LBE24:
				ba,pt	%xcc, .L8
				 mov	1, %i1
		.LVL7:
		.L10:
				mov	5, %o1
				call	_imp_writeint, 0
				 sra	%i4, 0, %o0
		.LVL19:
		.LBB30:
		.LBB31:
				call	_imp_newline, 0
				 st	%i1, [%i0+%lo(FAIL.6056)]
		.LVL20:
		.LBE31:
		.LBE30:
		.LBE32:
		.LBE33:
				ba,pt	%xcc, .L14
				 cmp	%i5, 100
		.LVL21:
		.L9:
   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	1, %i4
		.LBB24:
		.LBB25:
		.LBB26:
				sethi	%hi(FAIL.6056), %g1
				lduw	[%g1+%lo(FAIL.6056)], %g1
				cmp	%g1, 0
				be,pn	%icc, .L13
				 mov	256, %o2
		.L11:
		.LVL22:
		.LBB34:
		.LBB35:
				call	exit, 0
				 mov	0, %o0
		.LVL23:
		.L13:
		.LBE35:
		.LBE34:
		.LBB36:
   17 %ENDOFPROGRAM
				sethi	%hi(.LC0), %o1
				or	%o1, %lo(.LC0), %o1
				call	memcpy, 0
				 add	%fp, 1527, %o0
		.LVL24:
				mov	256, %o2
				add	%fp, 1527, %o1
				call	memcpy, 0
				 add	%fp, 1015, %o0
		.LVL25:
				mov	256, %o2
				add	%fp, 1015, %o1
				call	memcpy, 0
				 add	%fp, 1527, %o0
		.LVL26:
		.LBE36:
		.LBB37:
		.LBB38:
				mov	256, %o2
				add	%fp, 1527, %o1
				call	memcpy, 0
				 add	%fp, 751, %o0
		.LVL27:
				call	_imp_printstring, 0
				 add	%fp, 751, %o0
		.LVL28:
				ba,pt	%xcc, .L11
				 nop
		.LBE38:
		.LBE37:
		.LFE185:
				.common	FAIL.6056,4,4
		.Letext0:
   19 Statements compiled
				cmp	%i5, 100
		.L14:
				be,pn	%icc, .L9
				 mov	%i5, %i4
		.LVL8:
		.L8:
				add	%i4, 1, %i5
		.LVL9:
				mov	1, %o1
				call	FACT.6060, 0
				 sra	%i5, 0, %o0
		.LVL10:
				mov	%o0, %i3
				mov	1, %o1
				call	FACT.6060, 0
				 sra	%i4, 0, %o0
		.LVL11:
				mulx	%i5, %o0, %i4
		.LVL12:
		.LBB33:
		.LBB32:
