http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60528

            Bug ID: 60528
           Summary: MIPS GCC puts out complex constant incorrectly when in
                    big-endian mode
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sje at gcc dot gnu.org
                CC: rsandifo at gcc dot gnu.org
            Target: mips-*-*

The included test program prints out:

x = 0.634964 1.298458
x = inf inf

on MIPS instead of:

x = 0.634964 1.298458
x = 0.182506 1.163916

To reproduce the problem you need to compile the program with no optimization
(-O0) and in big-endian mode.  Little endian mode seems fine.  When I compare
the assembly language output to an earlier 4.8.1 GCC, the latest GCC output
contains the following code to store the complex constant passed in to csinh:

$LC0:
    .word    1071927711
    .word    3624173458
    .word    1073006203
    .word    1962331215

Earlier GCC compilers that worked contained:

$LC0:
    .word    1071927711
    .word    -670793838
    .word    1073006203
    .word    1962331215


Test case:

#include <stdio.h>
#include <complex.h>
#include <math.h>

int main()
{
    double complex x;
    x = 0.63496391478473613 + 1.2984575814159773I;
    printf("x = %f %f\n", creal(x), cimag(x));
    x = csinh(x);
    printf("x = %f %f\n", creal(x), cimag(x));
    return 0;
}

Reply via email to