tw24796.pp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. {$apptype console}
  2. {$mode objfpc}
  3. {$inline on}
  4. {$define debug_inline}
  5. var
  6. fault_mask: integer = 0;
  7. /////////////////////////////////////////
  8. function dummy1( x: integer; var y: integer ): boolean; {$ifdef debug_inline}inline;{$endif}
  9. begin
  10. y := x + 1;
  11. result := ( y = x + 1 );
  12. end;
  13. function dummy2( x: integer; out y: integer ): boolean; {$ifdef debug_inline}inline;{$endif}
  14. begin
  15. y := x + 1;
  16. result := ( y = x + 1 );
  17. end;
  18. procedure test1;
  19. var
  20. y: integer;
  21. begin
  22. y := 0;
  23. if not dummy1( y, y ) then
  24. begin
  25. writeln( 'fail 1' );
  26. fault_mask := fault_mask or 1;
  27. end;
  28. if not dummy2( y, y ) then
  29. begin
  30. writeln( 'fail 2' );
  31. fault_mask := fault_mask or 2;
  32. end;
  33. end;
  34. /////////////////////////////////////////
  35. type
  36. bits64 = qword;
  37. procedure add128( a0, a1, b0, b1 : bits64; var z0Ptr, z1Ptr : bits64); {$ifdef debug_inline}inline;{$endif}
  38. // routine from the SOFTFPU unit
  39. var
  40. z1 : bits64;
  41. begin
  42. z1 := a1 + b1;
  43. z1Ptr := z1; // overrites "a1" when called as below and inlined
  44. z0Ptr := a0 + b0 + ord( z1 < a1 ); // z1 compared with wrong value
  45. end;
  46. const
  47. correct_zSig0 = bits64($0001A784379D99DB);
  48. correct_zSig1 = bits64($4200000000000000);
  49. procedure test2;
  50. var
  51. zSig0, zSig1, aSig0, aSig1: bits64;
  52. begin
  53. zSig0 := bits64($000054B40B1F852B);
  54. zSig1 := bits64($DA00000000000000);
  55. aSig0 := bits64($000152D02C7E14AF);
  56. aSig1 := bits64($6800000000000000);
  57. // this usage pattern from routine SOFTFPU::float128_mul
  58. add128( zSig0, zSig1, aSig0, aSig1, zSig0, zSig1 );
  59. if zSig0 <> correct_zSig0 then
  60. begin
  61. writeln( 'fail 3' ); // fail if add128 is inlined
  62. fault_mask := fault_mask or 4;
  63. end;
  64. end;
  65. /////////////////////////////////////////
  66. begin
  67. test1;
  68. test2;
  69. if fault_mask = 0 then
  70. writeln( 'pass' )
  71. else
  72. halt( fault_mask );
  73. end.