comp.lang.ada
 help / color / mirror / Atom feed
* Using Log_Float in inline assembler for ARM
@ 2023-11-19 12:22 Ahlan Marriott
  2023-11-24  9:09 ` Ahlan Marriott
  0 siblings, 1 reply; 3+ messages in thread
From: Ahlan Marriott @ 2023-11-19 12:22 UTC (permalink / raw)


Hi,
The following procedure Unbiased_Rounding for Float works as expected.

   function Unbiased_Rounding (X : Float) return Float is
      Y : Float;
   begin
      Asm ("vrintn.f32 %0,%1",
            Outputs  => Float'asm_output ("=t", Y),
            Inputs   => Float'asm_input ("t", X));
      return Y;
  end Unbiased_Rounding;

according to https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html
the constraint t means "VFP floating-point registers s0-s31. Used for 32 bit values” and the constraint w means "VFP floating-point registers d0-d31 and the appropriate subset d0-d15 based on command line options. Used for 64 bit values only”

therefore we wrote our long_float version as

  function Unbiased_Rounding (X : Long_Float) return Long_Float is
      Y : Long_Float;
   begin
      Asm ("vrintn.f64 %0,%1",
            Outputs  => Long_Float'asm_output ("=w", Y),
            Inputs   => Long_Float'asm_input ("w", X));
      return Y;
   end Unbiased_Rounding;

however this fails to compile.
GNAT 11.2/0-4 (Alire) complains
Error: invalid instruction shape -- `vrintn.f64 s14,s14’

presumably because the operands are S registers rather than double precisions D registers.
Is this a bug or have we misunderstood something?

Best wishes,
Ahlan

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-11-24 10:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-19 12:22 Using Log_Float in inline assembler for ARM Ahlan Marriott
2023-11-24  9:09 ` Ahlan Marriott
2023-11-24 10:43   ` Jeffrey R.Carter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox