mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 07:19:29 +01:00 
			
		
		
		
	usage in case PIC generation is on (some by adding PIC-versions of
    the assembler code, most by adding -Cg- to the options to be used).
    Note: the Intel assembler reader does not yet support the Delphi
    PIC construct, so tests with that (like test/tasmread and test/tcg1)
    do not work with -Cg on non-Darwin (Darwin needs a different PIC
    construct)
git-svn-id: trunk@9370 -
		
	
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{ %CPU=i386 }
 | 
						|
{ %OPT=-Cg- }
 | 
						|
{ testfdiv variant with GNU AS output forced }
 | 
						|
{$ifdef win32}
 | 
						|
{$ifdef VER1_0}
 | 
						|
{$output_format asw}
 | 
						|
{$else}
 | 
						|
{$output_format as}
 | 
						|
{$endif}
 | 
						|
{$else}
 | 
						|
{$output_format as}
 | 
						|
{$endif win32}
 | 
						|
{ This test program deals with the
 | 
						|
  the delicate problem of
 | 
						|
  non commutative FPU instruction
 | 
						|
  where the destination register
 | 
						|
  is ST(1) to ST(7)
 | 
						|
 | 
						|
    Whereas Intel interprets
 | 
						|
      fdiv st(1),st
 | 
						|
    as
 | 
						|
      st(1):=st(1) / st
 | 
						|
    The ATT read
 | 
						|
      fdiv %st,%st(1)
 | 
						|
    as
 | 
						|
      st(1):=st/st(1)
 | 
						|
    Should be tested with
 | 
						|
    different output styles :
 | 
						|
    for go32v2
 | 
						|
      -Aas -Acoff and -Anasmcoff
 | 
						|
    for win32
 | 
						|
      -Aas -Apecoff and -Anasmwin32
 | 
						|
    for linux
 | 
						|
      -Aas and -Anasmelf
 | 
						|
    }
 | 
						|
 | 
						|
program  test_nasm_div;
 | 
						|
 | 
						|
 | 
						|
var
 | 
						|
  x,y,z : double;
 | 
						|
 | 
						|
begin
 | 
						|
  x:=4;
 | 
						|
  y:=2;
 | 
						|
  Writeln('4/2=',x/y:0:2);
 | 
						|
  if x/y <> 2.0 then
 | 
						|
    Halt(1);
 | 
						|
{$asmmode att}
 | 
						|
  asm
 | 
						|
    fldl y
 | 
						|
    fldl x
 | 
						|
    fdivp %st,%st(1)
 | 
						|
    fstpl z
 | 
						|
  end;
 | 
						|
  Writeln('ATT result of 4/2=',z:0:2);
 | 
						|
  if z <> 2.0 then
 | 
						|
    Halt(1);
 | 
						|
  asm
 | 
						|
    fldl y
 | 
						|
    fldl x
 | 
						|
    fdiv %st(1),%st
 | 
						|
    fstpl z
 | 
						|
    fstp %st
 | 
						|
  end;
 | 
						|
  Writeln('ATT result of 4/2=',z:0:2);
 | 
						|
  if z <> 2.0 then
 | 
						|
    Halt(1);
 | 
						|
  asm
 | 
						|
    fldl y
 | 
						|
    fldl x
 | 
						|
    fdiv %st,%st(1)
 | 
						|
    fstp %st
 | 
						|
    fstpl z
 | 
						|
  end;
 | 
						|
  Writeln('ATT result of 4/2=',z:0:2);
 | 
						|
  if z <> 2.0 then
 | 
						|
    Halt(1);
 | 
						|
  asm
 | 
						|
    fldl y
 | 
						|
    fldl x
 | 
						|
    fadd
 | 
						|
    fstpl z
 | 
						|
  end;
 | 
						|
  Writeln('ATT result of 4+2=',z:0:2);
 | 
						|
  if z <> 6.0 then
 | 
						|
    Halt(1);
 | 
						|
{$asmmode intel}
 | 
						|
  asm
 | 
						|
    fld x
 | 
						|
    fld y
 | 
						|
    fdivp  st(1),st
 | 
						|
    fstp z
 | 
						|
  end;
 | 
						|
  Writeln('Intel result of 4/2=',z:0:2);
 | 
						|
  if z <> 2.0 then
 | 
						|
    Halt(1);
 | 
						|
  asm
 | 
						|
    fld y
 | 
						|
    fld x
 | 
						|
    fdiv  st,st(1)
 | 
						|
    fstp z
 | 
						|
    fstp st
 | 
						|
  end;
 | 
						|
  Writeln('Intel result of 4/2=',z:0:2);
 | 
						|
  if z <> 2.0 then
 | 
						|
    Halt(1);
 | 
						|
  asm
 | 
						|
    fld y
 | 
						|
    fld x
 | 
						|
    fadd
 | 
						|
    fstp z
 | 
						|
  end;
 | 
						|
  Writeln('Intel result of 4+2=',z:0:2);
 | 
						|
  if z <> 6.0 then
 | 
						|
    Halt(1);
 | 
						|
 | 
						|
  Writeln('All tests completed successfully!');
 | 
						|
end.
 |