[fpc-devel] Code generation oddity on SPARC Linux

Mark Morgan Lloyd markMLl.fpc-devel at telemetry.co.uk
Fri Aug 26 22:42:12 CEST 2011


I have a fragment of code that looks like this:

VAR     z, a, alpha, b, c, d, e: Int64;
         f: DOUBLE;

BEGIN
   td:= td + 0.5;                       // astronomical to civil
   z:= Floor(td);
   f:= td - z;
   IF z < 2299161.0 THEN
     a:= z
   ELSE BEGIN
     alpha:= Floor((z - 1867216.25) / 36524.25);
     a:= z + 1 + alpha - Floor(alpha / 4)
   END;

Using 2.4.4 with -a -al -s this compiles to a .s which looks like this:

.Ll34:
# [439] IF z < 2299161.0 THEN
         ld      [%i6-32],%o0
         ld      [%i6-28],%o1
         call    fpc_int64_to_double
         nop
         sethi   %hi(_$MOONPHASE$_Ld8),%o0
         ld      [%lo(_$MOONPHASE$_Ld8)+%o0],%f1
         fcmpd   %f0,%f1
         nop
         fbl     .Lj87
         nop
         ba      .Lj88
         nop
.Lj87:
         .stabn 68,0,441,.Ll35 - MOONPHASE_JYEAR$DOUBLE$INT64$INT64$DOUBLE
.Ll35:
# [441] a:= z

This appears to be the only place in the program where  fcmpd %f0,%f1 
is generated, although the same opcode is generated with other registers 
as opeands. Assembling with as (2.17 or 2.18), I get this error:

moonphase.s:629: Error: Illegal operands

If I change the code to look like this:

   f:= td - z;
   IF z - 2299161.0 < 0 THEN
     a:= z
   ELSE BEGIN

it generates this:

.Ll34:
# [440] IF z - 2299161.0 < 0 THEN
         ld      [%i6-32],%o0
         ld      [%i6-28],%o1
         call    fpc_int64_to_double
         nop
         sethi   %hi(_$MOONPHASE$_Ld8),%o0
         ld      [%lo(_$MOONPHASE$_Ld8)+%o0],%f1
         fsubs   %f0,%f1,%f0
         sethi   %hi(_$MOONPHASE$_Ld9),%o0
         ld      [%lo(_$MOONPHASE$_Ld9)+%o0],%f1
         fcmps   %f0,%f1
         nop
         fbl     .Lj87

Having a workaround makes this not particularly crucial, but I'd welcome 
any comments.

-- 
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]



More information about the fpc-devel mailing list