         Edinburgh IMP77 Compiler - Version 8.4
    1 %BEGIN
		.Ltext0:
		FACT.6391:
		.LFB186:
		.LVL4:
				pushq	%r15
				pushq	%r14
				pushq	%r13
				pushq	%r12
				pushq	%rbp
				pushq	%rbx
				subq	$1064, %rsp
				movq	%fs:40, %rax
				movq	%rax, 1048(%rsp)
				xorl	%eax, %eax
    2 %owninteger fail=0
				call	_imp_initialise@PLT
		.LVL5:
    3 %INTEGER I
    4 %INTEGERFN FACT(%INTEGER N,mult)
		.LVL0:
				movl	%esi, %eax
				subq	$8, %rsp
		.L3:
    5       %IF N<=1 %THENRESULT=mult
				cmpl	$1, %edi
				jg	.L8
    6       %RESULT=FACT(N-1,mult*N)
				imull	%edi, %eax
				movl	%eax, %esi
		.LVL1:
				subl	$1, %edi
		.LVL2:
				call	FACT.6391
		.LVL3:
				addq	$8, %rsp
				ret
		.LFE186:
				.globl	main
		main:
		.LFB185:
    7 %END
				rep ret
		.L8:
    8 %ROUTINE COMPARE(%INTEGER I,J)
    9       %UNLESS I=J %START
				movl	%eax, 12(%rsp)
				cmpl	%eax, %r15d
				je	.L12
		.LVL11:
		.LBB26:
   10          PRINTSTRING("ERROR")
				movabsq	$353518113349, %rdx
				movl	$0, %ecx
				movq	%rdx, 529(%rsp)
				movq	%rcx, 537(%rsp)
				movb	$0, 545(%rsp)
				movw	$0, 546(%rsp)
				movl	$0, 548(%rsp)
				leaq	552(%rsp), %rdi
				movl	$29, %ecx
				movl	$0, %eax
		.LVL12:
				rep stosq
		.LVL13:
				movb	$5, 528(%rsp)
				movq	528(%rsp), %rax
				movq	536(%rsp), %rdx
				movq	%rax, 784(%rsp)
				movq	%rdx, 792(%rsp)
				movdqa	544(%rsp), %xmm0
				movaps	%xmm0, 800(%rsp)
				movdqa	560(%rsp), %xmm1
				movaps	%xmm1, 816(%rsp)
				movdqa	576(%rsp), %xmm2
				movaps	%xmm2, 832(%rsp)
				movdqa	592(%rsp), %xmm3
				movaps	%xmm3, 848(%rsp)
				movdqa	608(%rsp), %xmm4
				movaps	%xmm4, 864(%rsp)
				movdqa	624(%rsp), %xmm5
				movaps	%xmm5, 880(%rsp)
				movdqa	640(%rsp), %xmm6
				movaps	%xmm6, 896(%rsp)
				movdqa	656(%rsp), %xmm7
				movaps	%xmm7, 912(%rsp)
				movdqa	672(%rsp), %xmm0
				movaps	%xmm0, 928(%rsp)
				movq	688(%rsp), %r13
				movq	696(%rsp), %r14
				movq	%r13, 944(%rsp)
				movq	%r14, 952(%rsp)
				movq	704(%rsp), %rax
				movq	712(%rsp), %rdx
				movq	%rax, 960(%rsp)
				movq	%rdx, 968(%rsp)
				movq	720(%rsp), %rcx
				movq	728(%rsp), %rbx
				movq	%rcx, 976(%rsp)
				movq	%rbx, 984(%rsp)
				movq	736(%rsp), %rsi
				movq	744(%rsp), %rdi
				movq	%rsi, 992(%rsp)
				movq	%rdi, 1000(%rsp)
				movq	752(%rsp), %r9
				movq	760(%rsp), %r10
				movq	%r9, 1008(%rsp)
				movq	%r10, 1016(%rsp)
				movq	768(%rsp), %r11
				movq	776(%rsp), %r12
				movq	%r11, 1024(%rsp)
				movq	%r12, 1032(%rsp)
		.LVL14:
				movb	$5, 784(%rsp)
				movdqa	784(%rsp), %xmm1
				movaps	%xmm1, 272(%rsp)
				movdqa	544(%rsp), %xmm2
				movaps	%xmm2, 288(%rsp)
				movdqa	560(%rsp), %xmm3
				movaps	%xmm3, 304(%rsp)
				movdqa	576(%rsp), %xmm4
				movaps	%xmm4, 320(%rsp)
				movdqa	592(%rsp), %xmm5
				movaps	%xmm5, 336(%rsp)
				movdqa	608(%rsp), %xmm6
				movaps	%xmm6, 352(%rsp)
				movdqa	624(%rsp), %xmm7
				movaps	%xmm7, 368(%rsp)
				movdqa	640(%rsp), %xmm0
				movaps	%xmm0, 384(%rsp)
				movdqa	656(%rsp), %xmm1
				movaps	%xmm1, 400(%rsp)
				movdqa	672(%rsp), %xmm2
				movaps	%xmm2, 416(%rsp)
				movq	%r13, 432(%rsp)
				movq	%r14, 440(%rsp)
				movq	%rax, 448(%rsp)
				movq	%rdx, 456(%rsp)
				movq	%rcx, 464(%rsp)
				movq	%rbx, 472(%rsp)
				movq	%rsi, 480(%rsp)
				movq	%rdi, 488(%rsp)
				movq	%r9, 496(%rsp)
				movq	%r10, 504(%rsp)
				movq	%r11, 512(%rsp)
				movq	%r12, 520(%rsp)
		.LBE26:
		.LBB27:
		.LBB28:
				pushq	%r12
				pushq	%r11
				pushq	%r10
				pushq	%r9
				pushq	%rdi
				pushq	%rsi
				pushq	%rbx
				pushq	%rcx
				pushq	%rdx
				pushq	%rax
				pushq	%r14
				pushq	%r13
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	776(%rsp)
				pushq	1032(%rsp)
				pushq	1032(%rsp)
				call	_imp_printstring@PLT
		.LVL15:
		.LBE28:
		.LBE27:
   11          WRITE(I,5); WRITE(J,5)
				addq	$256, %rsp
				movl	$5, %esi
				movl	12(%rsp), %edi
				call	_imp_writeint@PLT
		.LVL16:
   12          Fail=1; NEWLINE
				movl	$5, %esi
				movl	%r15d, %edi
				call	_imp_writeint@PLT
		.LVL17:
				movl	$1, FAIL.6387(%rip)
		.LBB29:
		.LBB30:
				call	_imp_newline@PLT
		.LVL18:
				jmp	.L12
		.LVL19:
		.L11:
		.LBE30:
		.LBE29:
		.LBE25:
		.LBE24:
   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")
				movl	$1, %edi
				jmp	.L10
		.LVL6:
		.L12:
				movl	%ebp, %edi
				cmpl	$0, FAIL.6387(%rip)
				je	.L16
		.LVL20:
		.L13:
		.LBB31:
		.LBB32:
				movl	$0, %edi
				call	exit@PLT
		.LVL21:
		.L16:
		.LBE32:
		.LBE31:
		.LBB33:
   17 %ENDOFPROGRAM
				movabsq	$21197623525590356, %rax
				movl	$0, %edx
				movq	%rax, 529(%rsp)
				movq	%rdx, 537(%rsp)
				leaq	545(%rsp), %rdi
		.LVL22:
				movl	$239, %ecx
				movl	$0, %eax
				rep stosb
				movb	$7, 528(%rsp)
				leaq	16(%rsp), %rdi
				leaq	528(%rsp), %rsi
				movl	$32, %ecx
				rep movsq
		.LVL23:
				movb	$7, 16(%rsp)
				leaq	528(%rsp), %rdi
				leaq	16(%rsp), %rsi
				movl	$32, %ecx
				rep movsq
		.LBE33:
		.LBB34:
		.LBB35:
				subq	$256, %rsp
				leaq	784(%rsp), %rsi
				movl	$32, %ecx
				movq	%rsp, %rdi
				rep movsq
				call	_imp_printstring@PLT
		.LVL24:
				addq	$256, %rsp
				jmp	.L13
		.LBE35:
		.LBE34:
		.LFE185:
				.comm	FAIL.6387,4,4
		.Letext0:
   19 Statements compiled
				cmpl	$100, %ebp
				je	.L11
		.LVL7:
		.L10:
				leal	1(%rdi), %ebp
		.LVL8:
				movl	$1, %esi
				call	FACT.6391
		.LVL9:
				imull	%ebp, %eax
				movl	%eax, %r15d
				movl	$1, %esi
				movl	%ebp, %edi
				call	FACT.6391
		.LVL10:
		.LBB24:
		.LBB25:
