The source below is meant to return an int32_t that is the result of "rounding" the upper 32 bits of an __int128_t, where rounding pays attention to the bits that have been discarded and the low bit of what is kept. Since it's an ICE, the details are probably irrelevant.
[EMAIL PROTECTED] cat brokengcc.cxx #include <inttypes.h> int32_t round32hi(const __int128_t &arg){ const int SHIFT = 96; const int mshift = 96; const __int128_t M = (~__int128_t(0))<<mshift; const __int128_t L = (~M) + 1; const __int128_t L1 = __int128_t(L)>>1; const __int128_t Mlo = __int128_t(~M)>>1; __int128_t vv = arg & M; if( (arg & (L1)) // hi bit of discard set && ( (arg & Mlo) // and ( any other bits of discard set || (arg & L) ) ) // or lo bit of keep set ) vv += L; return int32_t(vv>>SHIFT); } [EMAIL PROTECTED] gcc -v -c -O brokengcc.cxx Reading specs from /proj/desres/root/Linux/x86_64/gcc/4.1.2/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/specs Target: x86_64-unknown-linux-gnu Configured with: /state/partition1/tmp/tmpwsa5nr/gcc-4.1.2/configure --enable-languages=c,c++,fortran --prefix=/proj/desres/root/Linux/x86_64/gcc/4.1.2 Thread model: posix gcc version 4.1.2 /proj/desres/root/Linux/x86_64/gcc/4.1.2/libexec/gcc/x86_64-unknown-linux-gnu/4.1.2/cc1plus -quiet -v -D_GNU_SOURCE brokengcc.cxx -quiet -dumpbase brokengcc.cxx -mtune=k8 -auxbase brokengcc -O -version -o /scratch/tmp/ccer1yVv.s ignoring nonexistent directory "/proj/desres/root/Linux/x86_64/gcc/4.1.2/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/../../../../x86_64-unknown-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /proj/desres/root/Linux/x86_64/gcc/4.1.2/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/../../../../include/c++/4.1.2 /proj/desres/root/Linux/x86_64/gcc/4.1.2/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/../../../../include/c++/4.1.2/x86_64-unknown-linux-gnu /proj/desres/root/Linux/x86_64/gcc/4.1.2/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/../../../../include/c++/4.1.2/backward /usr/local/include /proj/desres/root/Linux/x86_64/gcc/4.1.2/include /proj/desres/root/Linux/x86_64/gcc/4.1.2/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/include /usr/include End of search list. GNU C++ version 4.1.2 (x86_64-unknown-linux-gnu) compiled by GNU C version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4). GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 9975ef1eec7edce53d85d34b86837808 brokengcc.cxx: In function 'int32_t round32hi(const __int128_t&)': brokengcc.cxx:16: error: unrecognizable insn: (insn 92 91 50 3 (parallel [ (set (reg:DI 38 r9 [ vv+8 ]) (plus:DI (plus:DI (ltu:DI (reg:CC 17 flags) (const_int 0 [0x0])) (reg:DI 38 r9 [ vv+8 ])) (const_int 4294967296 [0x100000000]))) (clobber (reg:CC 17 flags)) ]) -1 (nil) (nil)) brokengcc.cxx:16: internal compiler error: in extract_insn, at recog.c:2084 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. [EMAIL PROTECTED] -- Summary: ICE wnen using __int128_t on x86_64 Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: john dot salmon at deshaw dot com GCC build triplet: x86_64-unknown-linux-gnu GCC host triplet: x86_64-unknown-linux-gnu GCC target triplet: x86_64-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31167