12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- {$apptype console}
- {$mode objfpc}
- {$inline on}
- {$define debug_inline}
- var
- fault_mask: integer = 0;
- /////////////////////////////////////////
- function dummy1( x: integer; var y: integer ): boolean; {$ifdef debug_inline}inline;{$endif}
- begin
- y := x + 1;
- result := ( y = x + 1 );
- end;
- function dummy2( x: integer; out y: integer ): boolean; {$ifdef debug_inline}inline;{$endif}
- begin
- y := x + 1;
- result := ( y = x + 1 );
- end;
- procedure test1;
- var
- y: integer;
- begin
- y := 0;
- if not dummy1( y, y ) then
- begin
- writeln( 'fail 1' );
- fault_mask := fault_mask or 1;
- end;
- if not dummy2( y, y ) then
- begin
- writeln( 'fail 2' );
- fault_mask := fault_mask or 2;
- end;
- end;
- /////////////////////////////////////////
- type
- bits64 = qword;
- procedure add128( a0, a1, b0, b1 : bits64; var z0Ptr, z1Ptr : bits64); {$ifdef debug_inline}inline;{$endif}
- // routine from the SOFTFPU unit
- var
- z1 : bits64;
- begin
- z1 := a1 + b1;
- z1Ptr := z1; // overrites "a1" when called as below and inlined
- z0Ptr := a0 + b0 + ord( z1 < a1 ); // z1 compared with wrong value
- end;
- const
- correct_zSig0 = bits64($0001A784379D99DB);
- correct_zSig1 = bits64($4200000000000000);
- procedure test2;
- var
- zSig0, zSig1, aSig0, aSig1: bits64;
- begin
- zSig0 := bits64($000054B40B1F852B);
- zSig1 := bits64($DA00000000000000);
- aSig0 := bits64($000152D02C7E14AF);
- aSig1 := bits64($6800000000000000);
- // this usage pattern from routine SOFTFPU::float128_mul
- add128( zSig0, zSig1, aSig0, aSig1, zSig0, zSig1 );
- if zSig0 <> correct_zSig0 then
- begin
- writeln( 'fail 3' ); // fail if add128 is inlined
- fault_mask := fault_mask or 4;
- end;
- end;
- /////////////////////////////////////////
- begin
- test1;
- test2;
- if fault_mask = 0 then
- writeln( 'pass' )
- else
- halt( fault_mask );
- end.
|