When attempting to compile Xine for Solaris I got the following error: 
 
gcc -O3 -mcpu=ultrasparc -mtune=ultrasparc  -fno-inline-functions -c  
test.c -o test.o 
/var/tmp//cco3qSnO.s: Assembler messages: 
/var/tmp//cco3qSnO.s:464: Error: Illegal operands: There are only 32  
single precision f registers; [0-31] 
 
Note: This only fails if I have both -O3 and -fno-inline-functions set. 
 
gcc -v 
Reading specs  
from /opt/gcc3.3/lib/gcc-lib/sparc-sun-solaris2.8/3.3.6/specs 
Configured with: ../configure --host=sparc-sun-solaris2.8  
--prefix=/opt/gcc3.3 --enable-shared --with-gnu-ld  
--with-ld=/opt/gcc3.3/bin/ld --with-gnu-as --with-as=/opt/gcc3.3/bin/as  
--with-cpu=ultrasparc 
Thread model: posix 
gcc version 3.3.6 
 
I have attached a test case but will include it inlined as well.  This  
is based off of Xine 1.1.0 src/libffmpeg/libavcodec/eval.c 
 
 
===== begin testt.c ===== 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 
 
#ifndef NAN 
  #define NAN 0 
#endif 
 
#ifndef M_PI 
#define M_PI 3.14159265358979323846 
#endif 
 
typedef struct Parser{ 
    int stack_index; 
    char *s; 
    double *const_value; 
    const char **const_name;          // NULL terminated 
    double (**func1)(void *, double a); // NULL terminated 
    const char **func1_name;          // NULL terminated 
    double (**func2)(void *, double a, double b); // NULL terminated 
    char **func2_name;          // NULL terminated 
    void *opaque; 
} Parser; 
 
static int strmatch(const char *s, const char *prefix){ 
    int i; 
    for(i=0; prefix[i]; i++){ 
        if(prefix[i] != s[i]) return 0; 
    } 
    return 1; 
} 
 
static double evalPrimary(Parser *p){ 
    double d, d2=NAN; 
    char *next= p->s; 
    int i; 
 
    /* number */ 
    d= strtod(p->s, &next); 
    if(next != p->s){ 
        p->s= next; 
        return d; 
    } 
 
    /* named constants */ 
    for(i=0; p->const_name && p->const_name[i]; i++){ 
        if(strmatch(p->s, p->const_name[i])){ 
            p->s+= strlen(p->const_name[i]); 
            return p->const_value[i]; 
        } 
    } 
 
    p->s= strchr(p->s, '('); 
    if(p->s==NULL){ 
        printf("Parser: missing ( in \"%s\"\n", next); 
        return NAN; 
    } 
    p->s++; // "(" 
    d= evalExpression(p); 
    if(p->s[0]== ','){ 
        p->s++; // "," 
        d2= evalExpression(p); 
    } 
    if(p->s[0] != ')'){ 
        printf("Parser: missing ) in \"%s\"\n", next); 
        return NAN; 
    } 
    p->s++; // ")" 
 
         if( strmatch(next, "sinh"  ) ) d= sinh(d); 
    else if( strmatch(next, "cosh"  ) ) d= cosh(d); 
    else if( strmatch(next, "tanh"  ) ) d= tanh(d); 
    else if( strmatch(next, "sin"   ) ) d= sin(d); 
    else if( strmatch(next, "cos"   ) ) d= cos(d); 
    else if( strmatch(next, "tan"   ) ) d= tan(d); 
    else if( strmatch(next, "exp"   ) ) d= exp(d); 
    else if( strmatch(next, "log"   ) ) d= log(d); 
    else if( strmatch(next, "squish") ) d= 1/(1+exp(4*d)); 
    else if( strmatch(next, "gauss" ) ) d= exp(-d*d/2)/sqrt(2*M_PI); 
    else if( strmatch(next, "abs"   ) ) d= fabs(d); 
    else if( strmatch(next, "max"   ) ) d= d > d2 ? d : d2; 
    else if( strmatch(next, "min"   ) ) d= d < d2 ? d : d2; 
    else if( strmatch(next, "gt"    ) ) d= d > d2 ? 1.0 : 0.0; 
    else if( strmatch(next, "gte"    ) ) d= d >= d2 ? 1.0 : 0.0; 
    else if( strmatch(next, "lt"    ) ) d= d > d2 ? 0.0 : 1.0; 
    else if( strmatch(next, "lte"    ) ) d= d >= d2 ? 0.0 : 1.0; 
    else if( strmatch(next, "eq"    ) ) d= d == d2 ? 1.0 : 0.0; 
    else if( strmatch(next, "("     ) ) d= d; 
//    else if( strmatch(next, "l1"    ) ) d= 1 + d2*(d - 1); 
//    else if( strmatch(next, "sq01"  ) ) d= (d >= 0.0 && d <=1.0) ?  
1.0 : 0.0; 
    else{ 
        for(i=0; p->func1_name && p->func1_name[i]; i++){ 
            if(strmatch(next, p->func1_name[i])){ 
                return p->func1[i](p->opaque, d); 
            } 
        } 
 
        for(i=0; p->func2_name && p->func2_name[i]; i++){ 
            if(strmatch(next, p->func2_name[i])){ 
                return p->func2[i](p->opaque, d, d2); 
            } 
        } 
 
        printf("Parser: unknown function in \"%s\"\n", next); 
        return NAN; 
    } 
 
    return d; 
}

-- 
           Summary: gcc optimization error for sparc with xine/ffmpeg, bad
                    assembly generated
           Product: gcc
           Version: 3.3.6
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: aaronw at net dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: sparc-sun-solaris2.8
  GCC host triplet: sparc-sun-solaris2.8
GCC target triplet: sparc-sun-solaris2.8


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

Reply via email to