|  | @@ -13,87 +13,72 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |   **********************************************************************}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -{$ifndef FPC_SYSTEM_HAS_SAR_QWORD}
 | 
	
		
			
				|  |  | -{$define FPC_SYSTEM_HAS_SAR_QWORD}
 | 
	
		
			
				|  |  | -function fpc_SarInt64(Const AValue : Int64;const Shift : Byte): Int64; [Public,Alias:'FPC_SARINT64']; compilerproc; assembler; nostackframe;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +{$ifndef FPC_SYSTEM_HAS_MUL_LONGINT_TO_INT64}
 | 
	
		
			
				|  |  | +{$define FPC_SYSTEM_HAS_MUL_LONGINT_TO_INT64}
 | 
	
		
			
				|  |  | +function fpc_mul_longint_to_int64(f1,f2 : longint) : int64;[public,alias: 'FPC_MUL_LONGINT_TO_INT64']; assembler; nostackframe; compilerproc;
 | 
	
		
			
				|  |  |  asm
 | 
	
		
			
				|  |  | -  // d0 = shift
 | 
	
		
			
				|  |  | -  lea.l   4(sp),a0
 | 
	
		
			
				|  |  | -  move.l  d2,-(sp)
 | 
	
		
			
				|  |  | -  move.l  d0,d2
 | 
	
		
			
				|  |  | -{$ifndef CPUCOLDFIRE}
 | 
	
		
			
				|  |  | -  and.w   #63,d2
 | 
	
		
			
				|  |  | -  cmp.w   #32,d2
 | 
	
		
			
				|  |  | -{$else}
 | 
	
		
			
				|  |  | -  and.l   #63,d2
 | 
	
		
			
				|  |  | -  cmp.l   #32,d2
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | -  bge.s   @longshift
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  move.l  (a0)+,d0
 | 
	
		
			
				|  |  | -  move.l  (a0),d1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -{$ifdef CPUM68K_HAS_ROLROR}
 | 
	
		
			
				|  |  | -  cmp.w   #1,d2
 | 
	
		
			
				|  |  | -  beq.s   @oneshift
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | -{$ifdef CPU68000}
 | 
	
		
			
				|  |  | -  cmp.w   #16,d2
 | 
	
		
			
				|  |  | -  beq.s   @sixteenshift
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  move.l  d3,a0
 | 
	
		
			
				|  |  | -  move.l  d4,a1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  move.l  d0,d3
 | 
	
		
			
				|  |  | -  moveq.l #32,d4
 | 
	
		
			
				|  |  | -{$ifndef CPUCOLDFIRE}
 | 
	
		
			
				|  |  | -  sub.w   d2,d4
 | 
	
		
			
				|  |  | -{$else}
 | 
	
		
			
				|  |  | -  sub.l   d2,d4
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | -  asr.l   d2,d0
 | 
	
		
			
				|  |  | -  lsl.l   d4,d3
 | 
	
		
			
				|  |  | -  lsr.l   d2,d1
 | 
	
		
			
				|  |  | -  or.l    d3,d1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  move.l  a0,d3
 | 
	
		
			
				|  |  | -  move.l  a1,d4
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  bra.s   @quit
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -{$ifdef CPU68000}
 | 
	
		
			
				|  |  | -@sixteenshift:
 | 
	
		
			
				|  |  | -  move.w  d0,d1
 | 
	
		
			
				|  |  | -  swap    d1
 | 
	
		
			
				|  |  | -  swap    d0
 | 
	
		
			
				|  |  | -  ext.l   d0
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  bra.s   @quit
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -{$ifdef CPUM68K_HAS_ROLROR}
 | 
	
		
			
				|  |  | -@oneshift:
 | 
	
		
			
				|  |  | -  asr.l   #1,d0
 | 
	
		
			
				|  |  | -  roxr.l  #1,d1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  bra.s   @quit
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -@longshift:
 | 
	
		
			
				|  |  | -  move.l  (a0),d0
 | 
	
		
			
				|  |  | -  move.l  d0,d1
 | 
	
		
			
				|  |  | -  smi     d0
 | 
	
		
			
				|  |  | -{$if defined(CPU68020) or defined(CPUCOLDFIRE)}
 | 
	
		
			
				|  |  | -  extb.l  d0
 | 
	
		
			
				|  |  | -{$else}
 | 
	
		
			
				|  |  | -  ext.w   d0
 | 
	
		
			
				|  |  | -  ext.l   d0
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | -  sub.w   #32,d2
 | 
	
		
			
				|  |  | -  asr.l   d2,d1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -@quit:
 | 
	
		
			
				|  |  | -  move.l (sp)+,d2
 | 
	
		
			
				|  |  | +    tst.l    d0
 | 
	
		
			
				|  |  | +    beq.s    @xit0
 | 
	
		
			
				|  |  | +    tst.l    d1
 | 
	
		
			
				|  |  | +    beq.s    @xit0
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    movem.l  d2-d5,-(sp)
 | 
	
		
			
				|  |  | +    move.l   d0,d5
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    eor.l    d1,d5
 | 
	
		
			
				|  |  | +    move.l   d0,d2
 | 
	
		
			
				|  |  | +    bpl.s    @pos0
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    neg.l    d2
 | 
	
		
			
				|  |  | +    neg.l    d0
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@pos0:
 | 
	
		
			
				|  |  | +    move.l   d1,d4
 | 
	
		
			
				|  |  | +    bpl.s    @pos1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    neg.l    d4
 | 
	
		
			
				|  |  | +    neg.l    d1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@pos1:
 | 
	
		
			
				|  |  | +    move.l   d0,d3
 | 
	
		
			
				|  |  | +    swap     d4
 | 
	
		
			
				|  |  | +    swap     d3
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    mulu.w   d1,d0
 | 
	
		
			
				|  |  | +    mulu.w   d3,d1
 | 
	
		
			
				|  |  | +    mulu.w   d4,d2
 | 
	
		
			
				|  |  | +    mulu.w   d4,d3
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    swap     d0
 | 
	
		
			
				|  |  | +    clr.l    d4
 | 
	
		
			
				|  |  | +    add.w    d1,d0
 | 
	
		
			
				|  |  | +    addx.l   d4,d3
 | 
	
		
			
				|  |  | +    add.w    d2,d0
 | 
	
		
			
				|  |  | +    addx.l   d4,d3
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    clr.w    d1
 | 
	
		
			
				|  |  | +    clr.w    d2
 | 
	
		
			
				|  |  | +    swap     d1
 | 
	
		
			
				|  |  | +    swap     d2
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    add.l    d3,d1
 | 
	
		
			
				|  |  | +    swap     d0
 | 
	
		
			
				|  |  | +    add.l    d2,d1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    tst.l    d5
 | 
	
		
			
				|  |  | +    bpl.s    @xit
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    neg.l    d0
 | 
	
		
			
				|  |  | +    negx.l   d1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@xit:
 | 
	
		
			
				|  |  | +    movem.l  (sp)+,d2-d5
 | 
	
		
			
				|  |  | +    exg.l    d0,d1
 | 
	
		
			
				|  |  | +    rts
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@xit0:
 | 
	
		
			
				|  |  | +    clr.l    d0
 | 
	
		
			
				|  |  | +    clr.l    d1
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  | -{$endif}
 | 
	
		
			
				|  |  | +{$endif FPC_SYSTEM_HAS_MUL_LONGINT_TO_INT64}
 |