/* { dg-do run } */ /* { dg-require-effective-target p9vector_hw } */ /* { dg-options "-mdejagnu-cpu=power9 -O2" } */ #include #define TRUE 1 #define FALSE 0 #ifdef DEBUG #include #endif #define EXTRACT 0 void abort (void); int result_wrong_ull (vector unsigned long long vec_expected, vector unsigned long long vec_actual) { int i; for (i = 0; i < 2; i++) if (vec_expected[i] != vec_actual[i]) return TRUE; return FALSE; } int result_wrong_uc (vector unsigned char vec_expected, vector unsigned char vec_actual) { int i; for (i = 0; i < 16; i++) if (vec_expected[i] != vec_actual[i]) return TRUE; return FALSE; } #ifdef DEBUG void print_ull (vector unsigned long long vec_expected, vector unsigned long long vec_actual) { int i; printf("expected unsigned long long data\n"); for (i = 0; i < 2; i++) printf(" %lld,", vec_expected[i]); printf("\nactual signed char data\n"); for (i = 0; i < 2; i++) printf(" %lld,", vec_actual[i]); printf("\n"); } void print_uc (vector unsigned char vec_expected, vector unsigned char vec_actual) { int i; printf("expected unsigned char data\n"); for (i = 0; i < 16; i++) printf(" %d,", vec_expected[i]); printf("\nactual unsigned char data\n"); for (i = 0; i < 16; i++) printf(" %d,", vec_actual[i]); printf("\n"); } #endif #if EXTRACT vector unsigned long long vext (vector unsigned char *vc) { return vextract_si_vchar (*vc, 5); } #endif int main() { vector signed int vsi_arg; vector unsigned int vui_arg; vector unsigned char vec_uc_arg, vec_uc_result, vec_uc_expected; vector unsigned long long vec_ull_result, vec_ull_expected; unsigned long long ull_result, ull_expected; vec_uc_arg = (vector unsigned char){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; vsi_arg = (vector signed int){0xA, 0xB, 0xC, 0xD}; #ifdef __BIG_ENDIAN__ vec_uc_expected = (vector unsigned char){0, 0, 0, 0xB, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; #else vec_uc_expected = (vector unsigned char){0xC, 0, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; #endif /* Test vec_insert4b() */ /* Insert into char 0 location */ vec_uc_result = vec_insert4b (vsi_arg, vec_uc_arg, 0); if (result_wrong_uc(vec_uc_expected, vec_uc_result)) { #ifdef DEBUG printf("Error: vec_insert4b pos 0, result does not match expected result\n"); print_uc (vec_uc_expected, vec_uc_result); #else abort(); #endif } /* insert into char 4 location */ #ifdef __BIG_ENDIAN__ vec_uc_expected = (vector unsigned char){1, 2, 3, 4, 0, 0, 0, 3, 9, 10, 11, 12, 13, 14, 15, 16}; #else vec_uc_expected = (vector unsigned char){1, 2, 3, 4, 2, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16}; #endif vui_arg = (vector unsigned int){0x4, 0x3, 0x2, 0x1}; vec_uc_result = vec_insert4b (vui_arg, vec_uc_arg, 4); if (result_wrong_uc(vec_uc_expected, vec_uc_result)) { #ifdef DEBUG printf("Error: vec_insert4b pos 4, result does not match expected result\n"); print_uc (vec_uc_expected, vec_uc_result); #else abort(); #endif } /* Test vec_extract4b() */ /* Extract 4b, from char 0 location */ #ifdef __BIG_ENDIAN__ vec_uc_arg = (vector unsigned char){0, 0, 0, 10, 0, 0, 0, 20, 0, 0, 0, 30, 0, 0, 0, 40}; vec_ull_expected = (vector unsigned long long){10, 0}; #else vec_uc_arg = (vector unsigned char){10, 0, 0, 0, 20, 0, 0, 0, 30, 0, 0, 0, 40, 0, 0, 0}; vec_ull_expected = (vector unsigned long long){0, 10}; #endif vec_ull_result = vec_extract4b(vec_uc_arg, 0); if (result_wrong_ull(vec_ull_expected, vec_ull_result)) { #ifdef DEBUG printf("Error: vec_extract4b pos 0, result does not match expected result\n"); print_ull (vec_ull_expected, vec_ull_result); #else abort(); #endif } /* Extract 4b, from char 12 location */ #ifdef __BIG_ENDIAN__ vec_uc_arg = (vector unsigned char){0, 0, 0, 10, 0, 0, 0, 20, 0, 0, 0, 30, 0, 0, 0, 40}; vec_ull_expected = (vector unsigned long long){40, 0}; #else vec_uc_arg = (vector unsigned char){10, 0, 0, 0, 20, 0, 0, 0, 30, 0, 0, 0, 40, 0, 0, 0}; vec_ull_expected = (vector unsigned long long){0, 40}; #endif vec_ull_result = vec_extract4b(vec_uc_arg, 12); if (result_wrong_ull(vec_ull_expected, vec_ull_result)) { #ifdef DEBUG printf("Error: vec_extract4b pos 12, result does not match expected result\n"); print_ull (vec_ull_expected, vec_ull_result); #else abort(); #endif } }