/* { dg-do run } */ /* { dg-require-effective-target p9vector_hw } */ /* { dg-options "-O2 -mdejagnu-cpu=power9" } */ #include #include void abort (void); int main() { int i; vector float vfa, vfb; vector unsigned short vresult, vexpected; vfa = (vector float){0.4, 1.6, 20.0, 99.9 }; vfb = (vector float){10.0, -2.0, 70.0, 999.0 }; /* Expected results. */ #ifdef __BIG_ENDIAN__ vexpected = (vector unsigned short) { 0x4900, 0xc000, 0x5460, 0x63ce, 0x3666, 0x3e66, 0x4d00, 0x563e }; #else vexpected = (vector unsigned short) { 0x3666, 0x3e66, 0x4d00, 0x563e, 0x4900, 0xc000, 0x5460, 0x63ce }; #endif /* vresult = vec_pack_to_short_fp32 (vfa, vfb); This built-in converts a pair of vector floats into a single vector of packed half-precision (F16) values. The result type is a vector of signed shorts. The expected codegen for this builtin is xvcvsphp t, vfa xvcvsphp u, vfb if (little endian) vpkuwum vresult, t, u else vpkuwum vresult, u, t */ vresult = vec_pack_to_short_fp32 (vfa, vfb); #ifdef DEBUG for(i = 0; i< 4; i++) { printf("i=[%d] %f \n",i,vfa[i]); } for(i = 0; i< 4; i++) { printf("i=[%d] %f \n",i+4,vfb[i]); } for(i = 0; i< 8; i++) { printf("i=[%d] %d \n",i,vresult[i]); } #endif for(i = 0; i< 8; i++) { if (vresult[i] != vexpected[i]) { printf("i=[%d] 0x%x != 0x%x \n",i,vresult[i],vexpected[i]); abort(); } } }