/* { dg-do run } */ /* { dg-require-effective-target p8vector_hw } */ /* { dg-require-effective-target int128 } */ /* { dg-options "-mdejagnu-cpu=power8 -O3" } */ #include #ifdef DEBUG #include #endif void abort (void); /* Verify vec_revb builtins */ int main() { int i; vector bool char arg_bc, result_bc, expected_bc; vector unsigned char arg_uc, result_uc, expected_uc; vector signed char arg_sc, result_sc, expected_sc; vector bool short int arg_bsi, result_bsi, expected_bsi; vector unsigned short int arg_usi, result_usi, expected_usi; vector short int arg_si, result_si, expected_si; vector bool int arg_bi, result_bi, expected_bi; vector unsigned int arg_ui, result_ui, expected_ui; vector int arg_int, result_int, expected_int; vector bool long long int arg_blli, result_blli, expected_blli; vector unsigned long long int arg_ulli, result_ulli, expected_ulli; vector long long int arg_lli, result_lli, expected_lli; vector __uint128_t arg_uint128, result_uint128, expected_uint128; vector __int128_t arg_int128, result_int128, expected_int128; vector float arg_f, result_f, expected_f; vector double arg_d, result_d, expected_d; /* 8-bit ints */ /* The element is a byte. Reversing the byte in each byte element gives the same value. */ arg_bc = (vector bool char) {0x01, 0x23, 0x45, 0x67, 0x7E, 0x7C, 0x7A, 0x78, 0x02, 0x46, 0x7A, 0x7E, 0x13, 0x57, 0x7B, 0x7F}; expected_bc = arg_bc; result_bc = vec_revb (arg_bc); for (i = 0; i < 16; i++) { if (result_bc[i] != expected_bc[i]) #ifdef DEBUG printf("arg_bc[%d] = 0x%x, result_bc[%d] = 0x%x, expected_bc[%d] = 0x%x\n", i, arg_bc[i], i, result_bc[i], i, expected_bc[i]); #else abort(); #endif } arg_uc = (vector unsigned char) {0x01, 0x23, 0x45, 0x67, 0x7E, 0x7C, 0x7A, 0x78, 0x02, 0x46, 0x7A, 0x7E, 0x13, 0x57, 0x7B, 0x7F}; expected_uc = arg_uc; result_uc = vec_revb (arg_uc); for (i = 0; i < 16; i++) { if (result_uc[i] != expected_uc[i]) #ifdef DEBUG printf("arg_uc[%d] = 0x%x, result_uc[%d] = 0x%x, expected_uc[%d] = 0x%x\n", i, arg_uc[i], i, result_uc[i], i, expected_uc[i]); #else abort(); #endif } arg_sc = (vector signed char) {0x01, 0x23, 0x45, 0x67, 0x7E, 0x7C, 0x7A, 0x78, 0x02, 0x46, 0x7A, 0x7E, 0x13, 0x57, 0x7B, 0x7F}; expected_sc = arg_sc; result_sc = vec_revb (arg_sc); for (i = 0; i < 16; i++) { if (result_sc[i] != expected_sc[i]) #ifdef DEBUG printf("arg_sc[%d] = 0x%x, result_sc[%d] = 0x%x, expected_sc[%d] = 0x%x\n", i, arg_sc[i], i, result_sc[i], i, expected_sc[i]); #else abort(); #endif } /* 16-bit ints */ arg_bsi = (vector bool short int) {0x0123, 0x4567, 0xFEDC, 0xBA98, 0x0246, 0x8ACE, 0x1357, 0x9BDF}; expected_bsi = (vector bool short int) {0x2301, 0x6745, 0xDCFE, 0x98BA, 0x4602, 0xCE8A, 0x5713, 0xDF9B}; result_bsi = vec_revb (arg_bsi); for (i = 0; i < 8; i++) { if (result_bsi[i] != expected_bsi[i]) #ifdef DEBUG printf("arg_bsi[%d] = 0x%x, result_bsi[%d] = 0x%x, expected_bsi[%d] = 0x%x\n", i, arg_bsi[i], i, result_bsi[i], i, expected_bsi[i]); #else abort(); #endif } arg_usi = (vector unsigned short int) {0x0123, 0x4567, 0xFEDC, 0xBA98, 0x0246, 0x8ACE, 0x1357, 0x9BDF}; expected_usi = (vector unsigned short int) {0x2301, 0x6745, 0xDCFE, 0x98BA, 0x4602, 0xCE8A, 0x5713, 0xDF9B}; result_usi = vec_revb (arg_usi); for (i = 0; i < 8; i++) { if (result_usi[i] != expected_usi[i]) #ifdef DEBUG printf("arg_usi[%d] = 0x%x, result_usi[%d] = 0x%x, expected_usi[%d] = 0x%x\n", i, arg_usi[i], i, result_usi[i], i, expected_usi[i]); #else abort(); #endif } arg_si = (vector short int) {0x0123, 0x4567, 0xFEDC, 0xBA98, 0x0246, 0x8ACE, 0x1357, 0x9BDF}; expected_si = (vector short int) {0x2301, 0x6745, 0xDCFE, 0x98BA, 0x4602, 0xCE8A, 0x5713, 0xDF9B}; result_si = vec_revb (arg_si); for (i = 0; i < 8; i++) { if (result_si[i] != expected_si[i]) #ifdef DEBUG printf("arg_si[%d] = 0x%x, result_si[%d] = 0x%x, expected_si[%d] = 0x%x\n", i, arg_si[i], i, result_si[i], i, expected_si[i]); #else abort(); #endif } /* 32-bit ints */ arg_bi = (vector bool int) {0x01234567, 0xFEDCBA98, 0x02468ACE, 0x13579BDF}; expected_bi = (vector bool int) {0x67452301, 0x98BADCFE, 0xCE8A4602, 0xDF9B5713}; result_bi = vec_revb (arg_bi); for (i = 0; i < 4; i++) { if (result_bi[i] != expected_bi[i]) #ifdef DEBUG printf("arg_bi[%d] = 0x%x, result_bi[%d] = 0x%x, expected_bi[%d] = 0x%x\n", i, arg_bi[i], i, result_bi[i], i, expected_bi[i]); #else abort(); #endif } arg_ui = (vector unsigned int) {0x01234567, 0xFEDCBA98, 0x02468ACE, 0x13579BDF}; expected_ui = (vector unsigned int) {0x67452301, 0x98BADCFE, 0xCE8A4602, 0xDF9B5713}; result_ui = vec_revb (arg_ui); for (i = 0; i < 4; i++) { if (result_ui[i] != expected_ui[i]) #ifdef DEBUG printf("arg_ui[%d] = 0x%x, result_ui[%d] = 0x%x, expected_ui[%d] = 0x%x\n", i, arg_ui[i], i, result_ui[i], i, expected_ui[i]); #else abort(); #endif } arg_int = (vector int) {0x01234567, 0xFEDCBA98, 0x02468ACE, 0x13579BDF}; expected_int = (vector int) {0x67452301, 0x98BADCFE, 0xCE8A4602, 0xDF9B5713}; result_int = vec_revb (arg_int); for (i = 0; i < 4; i++) { if (result_int[i] != expected_int[i]) #ifdef DEBUG printf("arg_int[%d] = 0x%x, result_int[%d] = 0x%x, expected_int[%d] = 0x%x\n", i, arg_int[i], i, result_int[i], i, expected_int[i]); #else abort(); #endif } /* 64-bit ints */ arg_blli = (vector bool long long int) {0x01234567FEDCBA98, 0x02468ACE13579BDF}; expected_blli = (vector bool long long int) {0x98BADCFE67452301, 0xDF9B5713CE8A4602}; result_blli = vec_revb (arg_blli); for (i = 0; i < 2; i++) { if (result_blli[i] != expected_blli[i]) #ifdef DEBUG printf("arg_blli[%d] = 0x%x, result_blli[%d] = 0x%llx, expected_blli[%d] = 0x%llx\n", i, arg_blli[i], i, result_blli[i], i, expected_blli[i]); #else abort(); #endif } arg_ulli = (vector unsigned long long int) {0x01234567FEDCBA98, 0x02468ACE13579BDF}; expected_ulli = (vector unsigned long long int) {0x98BADCFE67452301, 0xDF9B5713CE8A4602}; result_ulli = vec_revb (arg_ulli); for (i = 0; i < 2; i++) { if (result_ulli[i] != expected_ulli[i]) #ifdef DEBUG printf("arg_ulli[%d] = 0x%x, result_ulli[%d] = 0x%llx, expected_ulli[%d] = 0x%llx\n", i, arg_ulli[i], i, result_ulli[i], i, expected_ulli[i]); #else abort(); #endif } arg_lli = (vector long long int) {0x01234567FEDCBA98, 0x02468ACE13579BDF}; expected_lli = (vector long long int) {0x98BADCFE67452301, 0xDF9B5713CE8A4602}; result_lli = vec_revb (arg_lli); for (i = 0; i < 2; i++) { if (result_lli[i] != expected_lli[i]) #ifdef DEBUG printf("arg_lli[%d] = 0x%x, result_lli[%d] = 0x%llx, expected_lli[%d] = 0x%llx\n", i, arg_lli[i], i, result_lli[i], i, expected_lli[i]); #else abort(); #endif } /* 128-bit ints */ arg_uint128[0] = 0x1627384950617243; arg_uint128[0] = arg_uint128[0] << 64; arg_uint128[0] |= 0x9405182930415263; expected_uint128[0] = 0x6352413029180594; expected_uint128[0] = expected_uint128[0] << 64; expected_uint128[0] |= 0x4372615049382716; result_uint128 = vec_revb (arg_uint128); if (result_uint128[0] != expected_uint128[0]) { #ifdef DEBUG printf("result_uint128[0] doesn't match expected_u128[0]\n"); printf("arg_uint128[0] = %llx ", arg_uint128[0] >> 64); printf(" %llx\n", arg_uint128[0] & 0xFFFFFFFFFFFFFFFF); printf("result_uint128[0] = %llx ", result_uint128[0] >> 64); printf(" %llx\n", result_uint128[0] & 0xFFFFFFFFFFFFFFFF); printf("expected_uint128[0] = %llx ", expected_uint128[0] >> 64); printf(" %llx\n", expected_uint128[0] & 0xFFFFFFFFFFFFFFFF); #else abort(); #endif } arg_int128[0] = 0x1627384950617283; arg_int128[0] = arg_int128[0] << 64; arg_int128[0] |= 0x9405182930415263; expected_int128[0] = 0x6352413029180594; expected_int128[0] = expected_int128[0] << 64; expected_int128[0] |= 0x8372615049382716;; result_int128 = vec_revb (arg_int128); if (result_int128[0] != expected_int128[0]) { #ifdef DEBUG printf("result_int128[0] doesn't match expected128[0]\n"); printf("arg_int128[0] = %llx ", arg_int128[0] >> 64); printf(" %llx\n", arg_int128[0] & 0xFFFFFFFFFFFFFFFF); printf("result_int128[0] = %llx ", result_int128[0] >> 64); printf(" %llx\n", result_int128[0] & 0xFFFFFFFFFFFFFFFF); printf("expected_int128[0] = %llx ", expected_int128[0] >> 64); printf(" %llx\n", expected_int128[0] & 0xFFFFFFFFFFFFFFFF); #else abort(); #endif } /* 32-bit floats */ /* 0x42f7224e, 0x43e471ec, 0x49712062, 0x4a0f2b38 */ arg_f = (vector float) {123.567, 456.89, 987654.123456, 2345678.0}; /* 0x4e22F742, 0xec71e443, 0x62207149, 0x382b0f4a */ expected_f = (vector float) {683528320.0, -1169716232068291395011477504.0, 739910526898278498304.0, 0.0000407838160754181444644927978515625}; result_f = vec_revb (arg_f); for (i = 0; i < 4; i++) { if (result_f[i] != expected_f[i]) #ifdef DEBUG printf(" arg_f[%d] = %f, result_f[%d] = %f, expected_f[%d] = %f\n", i, arg_f[i], i, result_f[i], i, expected_f[i]); #else abort(); #endif } /* 64-bit floats */ /* 0x419D6F34547E6B75 0x4194E5FEC781948B */ arg_d = (vector double) {123456789.123456789, 87654321.87654321}; /* 0x756B7E54346F9D41 0x8B9481C7FEE59441 */ expected_d = (vector double) {4.12815412905659550518671402044E257, -6.99269992046390236552018719554E-253}; result_d = vec_revb (arg_d); for (i = 0; i < 2; i++) { if (result_d[i] != expected_d[i]) #ifdef DEBUG printf("arg_d[%d] = %f, result_d[%d] = %f, expected_d[%d] = %f\n", i, arg_d[i], i, result_d[i], i, expected_d[i]); #else abort(); #endif } }