Sto eseguendo il porting di un codice di ottimizzazione SSE da Windows a Linux. E ho scoperto che il seguente codice, che funziona bene in MSVC, non funzionerà in GCC. Il codice serve per inizializzare un array di __m128i. Ogni __mi28i contiene 16 int8_t. Si somministra con gcc ma il risultato non è come previsto. In realtà, poiché gcc definisce __m128i come "long long int", il codice inizializzerà un array come: long long int coeffs_ssse3 [4] = {64, 83, 64, 36}. Ho cercato su Google e mi è stato detto che "L'unico modo portatile per inizializzare un vettore è usare _mm_set_XXX intrinsics." Tuttavia, voglio sapere c'è qualche altro modo per inizializzare l'array __m128i? Migliore staticamente e non è necessario modificare molto il codice seguente (poiché ho tonnellate di codice nel seguente formato). Qualsiasi suggerimento è apprezzato.Come inizializzare l'array __m128i staticamente in gcc?
static const __m128i coeffs_ssse3[4] =
{
{ 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0},
{ 83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1},
{ 64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0},
{ 36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1}
};
Grazie @Jason! Ho provato il tuo metodo e ha funzionato molto bene. (Nella tua risposta, uint8_t dovrebbe essere int8_t dato che la matrice contiene valori negativi. Potrebbe trattarsi di un errore di battitura e potresti modificare la risposta per renderla perfetta :) – shengbinmeng