Newsgroup: it.comp.lang.c
Titolo: illegal instruction?

Sto usando l'assembler intrinseco per cercare di risparmiarmi un po' di
fatica con l'asm.
Dato il seguente sorgente
#include <mmintrin.h>
 
int main(void) {
        __m64 temp, soglie_minime;
        unsigned char rossomin = 1;
        unsigned char verdemin = 2;
        unsigned char blumin = 2;
        unsigned char rossomax = 3;
        unsigned char verdemax = 4;
        unsigned char blumax = 5;
 
        temp = _mm_cvtsi32_si64 ( (unsigned int) (blumin << 16) + (verdemin << 8) + rossomin);
        soglie_minime = _mm_slli_si64 (temp, 32);
        _mm_add_si64 (temp, soglie_minime);
 
        return 0;
}
compilato con gcc-3.3 -mmmx -g test.c -o test
se lo eseguo mi dà illegal instruction. Il gdb dice:
14              _mm_add_si64 (temp, soglie_minime);
(gdb) step
_mm_add_si64 (__m1={131585, 0}, __m2={0, 131585}) at /usr/lib/gcc-lib/i386-linux/3.3/include/mmintrin.h:192
192       return (__m64) __builtin_ia32_paddq ((long long)__m1, (long long)__m2);
(gdb) step
 
Program received signal SIGILL, Illegal instruction.
0x080483e0 in _mm_add_si64 (__m1={131585, 0}, __m2={0, 131585})
    at /usr/lib/gcc-lib/i386-linux/3.3/include/mmintrin.h:192
192       return (__m64) __builtin_ia32_paddq ((long long)__m1, (long long)__m2);
(gdb)
Qualcuno di voi ha una vaga idea di cosa voglia dire?

 Qualcuno di voi ha una vaga idea di cosa voglia dire?
Questo e' il newsgroup sbagliato, perche' il tuo codice contiene 
elementi non standard. Probabilmente puoi chiedere in un newsgroup 
dedicato al tuo compilatore e/o al tuo sistema operativo e/o alla tua 
macchina.
L'unica cosa che ti so dire e' che probabilmente l'eseguibile contiene 
un'istruzione che non esiste, forse a causa dell'uso sbagliato delle 
funzioni non standard, da cui il segnale SIGILL che ricevi.

 [Codice contenente header, funzioni e tipi non standard]
non standard? ok, non sarà ansi, ma ho visto molti comilatori lo
supportano. Il visual studio di M$, il compilatore di intel e il gcc.
e come, se volessi restare nell standard cosa faccio per ottimizzare il
codice?

 codice?
Ti sogni l'asm =)
-- 
Qualsiasi
"We all know Linux is great...it does infinite loops in 5 seconds." Torvalds

Qualcuno di voi ha una vaga idea di cosa voglia dire?
Molto vagamente (mai usato gcc, tantomeno con quell'header)...
penso che quell'istruzione sia tradotta in assembler, probabilmente
nel file mmintrin.h c'e' un'istruzione del tipo:
#define  _mm_add_si64 (x,y,z)   _asm  ....
che produce un'opcode illegale, cioe' un'istruzione incompatibile con
l'assemblatore usato.

 codice?
Dipende cosa devi ottimizzare esattamente...

 Dipende cosa devi ottimizzare esattamente...
mi sembra un po' un discorso troppo vago. Insomma, e' vero che i
compilatori ottimizzanti alleviano un po' la vita del programmatore, pero'
per quanto buoni siano se il programma ha una complessita' superiore a
quella di ciaomondo non riescono ad ottenere il massimo.
Nel mio specifico devo fare una mera comparazione di unsigned char, solo
che se me la faccio a mano scopro che ordinando in modo furbo le
operazioni riesco ad elaborarne fino ad 8 in un colpo solo.
Non conosco bene gli altri compilatori commerciali quindi non liposso
commentare, ma il gcc non e' in grado di arrivare a queste ottimizzazioni
da solo, ancjhe se gli passi -O3 -mmmx -msse -m3dnow .
Comunque ho visto che tutte le librerie ottimizzate non fanno uso di ANSI
C ma si basano proprio su queste istruzioni.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

acc ha scritto:



quindi potrebbe essere un baco del compilatore?
Effettivamente per ora non ho risolto perche' ho visto che se abilito il
flag -O3 il programma gira e non si incarta, solo che se provo a mettere
la stessa istruzione in una libreria dinamica, pur usando l'-O3, da'
sempre illegal instruction.
Per ora ho risolta usando le estensioni alle istruzioni mmx presenti nelle
istruzioni sse.


 C ma si basano proprio su queste istruzioni.
Puo' essere. Pero' questo non e' il posto adatto per discuterne. Secondo 
me dovresti chiedere in un newsgroup sul gcc e/o in uno sui processori 
Intel.

sempre illegal instruction.
-O3 ?  Che roba e' ?  Serve Ad abilitare il buco dell'ozono ?