How to handle SCmode.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I have a 32bit processor . My arithmetic and float operations confine to SImode(32) and SFmode (32). But for the test case mentioned below, my compiler gives internal compiler error: in init_move_cost, at regclass.c:323 in gcc-4.3.3 version source. compiler crashes at code gcc_assert (have_regs_of_mode[m]);implies gcc_assert(have_regs_of_mode[SCmode] ).

My concerned macro definitions are

#define MODES_TIEABLE_P(MODE1, MODE2) \
       ((MODE1 == QImode && MODE2 == HImode) ||  \
               (MODE1 == HImode && MODE2 == QImode)||  \
               (MODE1 == QImode && MODE2 == SImode)||  \
               (MODE1 == SImode && MODE2 == QImode)||  \
               (MODE1 == HImode && MODE2 == SImode)||  \
               (MODE1 == SImode && MODE2 == HImode))

#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
 if (GET_MODE_CLASS (MODE) == MODE_INT                 \
     && GET_MODE_SIZE (MODE) < 4)\
   (UNSIGNEDP) = ((MODE) == SImode ? 0 : (UNSIGNEDP)), \
   (MODE) =  SImode


#define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE)    \
 if ((GET_MODE_CLASS (MODE) == MODE_INT                \
      || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT)    \
     && GET_MODE_SIZE (MODE) < 4)                      \
(MODE) = SImode;
#define HARD_REGNO_NREGS(REGNO, MODE) hard_regno_nregs(REGNO, MODE)

#define HARD_REGNO_MODE_OK(REGNO, MODE) hard_regno_mode_ok(REGNO, MODE)



int hard_regno_nregs (reg, mode)
    enum machine_mode mode;
    int reg;
{
   int width = (GET_MODE_SIZE(mode) * BITS_PER_UNIT);
   if (width <= 32)
   {
       return 1;
   }
   else
   {
       return 2; // 2 because of complex_float
   }
}

int hard_regno_mode_ok (reg, mode)
    enum machine_mode mode;
    int reg;
{
   int width = GET_MODE_SIZE(mode) * BITS_PER_UNIT;
   if (width == 32 || width == 16 || width == 8)
   {
       return 1;
   }
   return 0;
}


Can any one point me to solution.
Thanks in advance,
Sumanth G



Testcase;
__complex__ float
__attribute__ ((noinline)) foo (__complex__ float x)
{
 return x;
}

__complex__ float
__attribute__ ((noinline)) bar (__complex__ float x)
{
 return foo (x);
}

int main()
{
 __complex__ float a, b;
 __real__ a = 9;
 __imag__ a = 42;

 b = bar (a);

 if (a != b)
   abort ();

 return 0;
}


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux