GCC Wikia
Advertisement

このページを編集する際は,編集に関する方針に従ってください.[]

概要[]

引数[]

実装[]

 1960 /* Initialize R from the integer pair HIGH+LOW.  */
 HIGHとLOWのペアから浮動小数点の初期化
1961 
1962 void
1963 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1964                    unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1965                    int unsigned_p)
1966 {

~
*0ならばget_zeroですむ

1967   if (low == 0 && high == 0)
1968     get_zero (r, 0);

~
~

1969   else
1970     {

~
*仮数部以外の初期化

1971       memset (r, 0, sizeof (*r));
1972       r->cl = [[rvc_normal>enum real_value_class]];
1973       r->sign = high < 0 && !unsigned_p;
1974       SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
1975 

~

1976       if (r->sign)
1977         {
1978           high = ~high;
1979           if (low == 0)
1980             high += 1;
1981           else
1982             low = -low;
1983         }
1984 

~
*仮数部にHIGHとLOWを入れていく

1985       if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1986         {
1987           r->sig[[[SIGSZ]]-1] = high;
1988           r->sig[[[SIGSZ]]-2] = low;
1989         }
1990       else
1991         {
1992           gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
1993           r->sig[[[SIGSZ]]-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1994           r->sig[[[SIGSZ]]-2] = high;
1995           r->sig[[[SIGSZ]]-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1996           r->sig[[[SIGSZ]]-4] = low;
1997         }
1998 

*正規化

1999       normalize (r);
2000     }
2001 

~
*モードがある場合

2002   if (mode != [[VOIDmode>enum real_value_class]])
2003     real_convert (r, mode, r);
2004 }


リンク元

Advertisement