blob: 222c8b3a409c3cbcf9ef1e9c907fbdd056714b79 [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target power10_hw } */
/* { dg-options "-mdejagnu-cpu=power10 -save-temps" } */
/* { dg-final { scan-assembler-times {\mvdivsw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvdivuw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvdivsd\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvdivud\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvdivesw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvdiveuw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvdivesd\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvdiveud\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmodsw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmoduw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmodsd\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmodud\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmulhsw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmulhuw\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmulhsd\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmulhud\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvmulld\M} 2 } } */
#include <stdint.h>
#include <stdio.h>
#include <math.h>
#include <altivec.h>
#define DEBUG 0
#ifdef DEBUG
#include <stdio.h>
#endif
void abort (void);
int main()
{
int i;
vector int i_arg1, i_arg2;
vector unsigned int u_arg1, u_arg2;
vector long long int d_arg1, d_arg2;
vector long long unsigned int ud_arg1, ud_arg2;
vector int vec_i_expected, vec_i_result;
vector unsigned int vec_u_expected, vec_u_result;
vector long long int vec_d_expected, vec_d_result;
vector long long unsigned int vec_ud_expected, vec_ud_result;
/* Signed word divide */
i_arg1 = (vector int){ 20, 40, 60, 80};
i_arg2 = (vector int){ 2, 2, 2, 2};
vec_i_expected = (vector int){10, 20, 30, 40};
vec_i_result = vec_div (i_arg1, i_arg2);
for (i = 0; i < 4; i++)
{
if (vec_i_expected[i] != vec_i_result[i])
#ifdef DEBUG
printf("ERROR vec_div signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_i_result[i], i, vec_i_expected[i]);
#else
abort();
#endif
}
/* Unsigned word divide */
u_arg1 = (vector unsigned int){ 20, 40, 60, 80};
u_arg2 = (vector unsigned int){ 2, 2, 2, 2};
vec_u_expected = (vector unsigned int){10, 20, 30, 40};
vec_u_result = vec_div (u_arg1, u_arg2);
for (i = 0; i < 4; i++)
{
if (vec_u_expected[i] != vec_u_result[i])
#ifdef DEBUG
printf("ERROR vec_div unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_u_result[i], i, vec_u_expected[i]);
#else
abort();
#endif
}
/* Signed double word divide */
d_arg1 = (vector long long){ 24, 68};
d_arg2 = (vector long long){ 2, 2};
vec_d_expected = (vector long long){12, 34};
vec_d_result = vec_div (d_arg1, d_arg2);
for (i = 0; i < 2; i++)
{
if (vec_d_expected[i] != vec_d_result[i])
#ifdef DEBUG
printf("ERROR vec_div signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_d_result[i], i, vec_d_expected[i]);
#else
abort();
#endif
}
/* Unsigned double word divide */
ud_arg1 = (vector unsigned long long){ 24, 68};
ud_arg2 = (vector unsigned long long){ 2, 2};
vec_ud_expected = (vector unsigned long long){12, 34};
vec_ud_result = vec_div (ud_arg1, ud_arg2);
for (i = 0; i < 2; i++)
{
if (vec_ud_expected[i] != vec_ud_result[i])
#ifdef DEBUG
printf("ERROR vec_div unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_ud_result[i], i, vec_ud_expected[i]);
#else
abort();
#endif
}
/* Divide Extended signed word result = (arg1 << 32)/arg2 */
i_arg1 = (vector int){ 2, 4, 6, 8};
i_arg2 = (vector int){ 2048, 2048, 2048, 2048};
vec_i_expected = (vector int){4194304, 8388608, 12582912, 16777216};
vec_i_result = vec_dive (i_arg1, i_arg2);
for (i = 0; i < 4; i++)
{
if (vec_i_expected[i] != vec_i_result[i])
#ifdef DEBUG
printf("ERROR vec_dive signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_i_result[i], i, vec_i_expected[i]);
#else
abort();
#endif
}
/* Divide Extended unsigned word result = (arg1 << 32)/arg2 */
u_arg1 = (vector unsigned int){ 2, 4, 6, 8};
u_arg2 = (vector unsigned int){ 2048, 2048, 2048, 2048};
vec_u_expected = (vector unsigned int){4194304, 8388608,
12582912, 16777216};
vec_u_result = vec_dive (u_arg1, u_arg2);
for (i = 0; i < 4; i++)
{
if (vec_u_expected[i] != vec_u_result[i])
#ifdef DEBUG
printf("ERROR vec_dive unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_u_result[i], i, vec_u_expected[i]);
#else
abort();
#endif
}
/* Divide Extended double signed esult = (arg1 << 64)/arg2 */
d_arg1 = (vector long long int){ 2, 4};
d_arg2 = (vector long long int){ 4294967296, 4294967296};
vec_d_expected = (vector long long int){8589934592, 17179869184};
vec_d_result = vec_dive (d_arg1, d_arg2);
for (i = 0; i < 2; i++)
{
if (vec_d_expected[i] != vec_d_result[i])
#ifdef DEBUG
printf("ERROR vec_dive signed result[%d] = %lld != "
"expected[%d] = %lld\n",
i, vec_d_result[i], i, vec_d_expected[i]);
#else
abort();
#endif
}
/* Divide Extended double unsigned result = (arg1 << 64)/arg2 */
ud_arg1 = (vector long long unsigned int){ 2, 4};
ud_arg2 = (vector long long unsigned int){ 4294967296, 4294967296};
vec_ud_expected = (vector long long unsigned int){8589934592,
17179869184};
vec_ud_result = vec_dive (ud_arg1, ud_arg2);
for (i = 0; i < 2; i++)
{
if (vec_ud_expected[i] != vec_ud_result[i])
#ifdef DEBUG
printf("ERROR vec_dive unsigned result[%d] = %lld != "
"expected[%d] = %lld\n",
i, vec_ud_result[i], i, vec_ud_expected[i]);
#else
abort();
#endif
}
/* Signed word modulo */
i_arg1 = (vector int){ 23, 45, 61, 89};
i_arg2 = (vector int){ 2, 2, 2, 2};
vec_i_expected = (vector int){1, 1, 1, 1};
vec_i_result = vec_mod (i_arg1, i_arg2);
for (i = 0; i < 4; i++)
{
if (vec_i_expected[i] != vec_i_result[i])
#ifdef DEBUG
printf("ERROR vec_mod signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_i_result[i], i, vec_i_expected[i]);
#else
abort();
#endif
}
/* Unsigned word modulo */
u_arg1 = (vector unsigned int){ 25, 41, 67, 86};
u_arg2 = (vector unsigned int){ 3, 3, 3, 3};
vec_u_expected = (vector unsigned int){1, 2, 1, 2};
vec_u_result = vec_mod (u_arg1, u_arg2);
for (i = 0; i < 4; i++)
{
if (vec_u_expected[i] != vec_u_result[i])
#ifdef DEBUG
printf("ERROR vec_mod unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_u_result[i], i, vec_u_expected[i]);
#else
abort();
#endif
}
/* Signed double word modulo */
d_arg1 = (vector long long){ 24, 68};
d_arg2 = (vector long long){ 7, 7};
vec_d_expected = (vector long long){3, 5};
vec_d_result = vec_mod (d_arg1, d_arg2);
for (i = 0; i < 2; i++)
{
if (vec_d_expected[i] != vec_d_result[i])
#ifdef DEBUG
printf("ERROR vec_mod signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_d_result[i], i, vec_d_expected[i]);
#else
abort();
#endif
}
/* Unsigned double word modulo */
ud_arg1 = (vector unsigned long long){ 24, 68};
ud_arg2 = (vector unsigned long long){ 8, 8};
vec_ud_expected = (vector unsigned long long){0, 4};
vec_ud_result = vec_mod (ud_arg1, ud_arg2);
for (i = 0; i < 2; i++)
{
if (vec_ud_expected[i] != vec_ud_result[i])
#ifdef DEBUG
printf("ERROR vecmod unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_ud_result[i], i, vec_ud_expected[i]);
#else
abort();
#endif
}
/* Signed word multiply high */
i_arg1 = (vector int){ 2147483648, 2147483648, 2147483648, 2147483648 };
i_arg2 = (vector int){ 2, 3, 4, 5};
// vec_i_expected = (vector int){-1, -2, -2, -3};
vec_i_expected = (vector int){1, -2, -2, -3};
vec_i_result = vec_mulh (i_arg1, i_arg2);
for (i = 0; i < 4; i++)
{
if (vec_i_expected[i] != vec_i_result[i])
#ifdef DEBUG
printf("ERROR vec_mulh signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_i_result[i], i, vec_i_expected[i]);
#else
abort();
#endif
}
/* Unsigned word multiply high */
u_arg1 = (vector unsigned int){ 2147483648, 2147483648,
2147483648, 2147483648 };
u_arg2 = (vector unsigned int){ 4, 5, 6, 7 };
vec_u_expected = (vector unsigned int){2, 2, 3, 3 };
vec_u_result = vec_mulh (u_arg1, u_arg2);
for (i = 0; i < 4; i++)
{
if (vec_u_expected[i] != vec_u_result[i])
#ifdef DEBUG
printf("ERROR vec_mulh unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_u_result[i], i, vec_u_expected[i]);
#else
abort();
#endif
}
/* Signed double word multiply high */
d_arg1 = (vector long long int){ 2305843009213693951,
4611686018427387903 };
d_arg2 = (vector long long int){ 12, 20 };
vec_d_expected = (vector long long int){ 1, 4 };
vec_d_result = vec_mulh (d_arg1, d_arg2);
for (i = 0; i < 2; i++)
{
if (vec_d_expected[i] != vec_d_result[i])
#ifdef DEBUG
printf("ERROR vec_mulh signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_d_result[i], i, vec_d_expected[i]);
#else
abort();
#endif
}
/* Unsigned double word multiply high */
ud_arg1 = (vector unsigned long long int){ 2305843009213693951,
4611686018427387903 };
ud_arg2 = (vector unsigned long long int){ 32, 10 };
vec_ud_expected = (vector unsigned long long int){ 3, 2 };
vec_ud_result = vec_mulh (ud_arg1, ud_arg2);
for (i = 0; i < 2; i++)
{
if (vec_ud_expected[i] != vec_ud_result[i])
#ifdef DEBUG
printf("ERROR vec_mulh unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_ud_result[i], i, vec_ud_expected[i]);
#else
abort();
#endif
}
/* Unsigned double word multiply low */
ud_arg1 = (vector unsigned long long int){ 2048, 4096 };
ud_arg2 = (vector unsigned long long int){ 2, 4 };
vec_ud_expected = (vector unsigned long long int){ 4096, 16384 };
vec_ud_result = vec_mul (ud_arg1, ud_arg2);
for (i = 0; i < 2; i++)
{
if (vec_ud_expected[i] != vec_ud_result[i])
#ifdef DEBUG
printf("ERROR vec_mul unsigned result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_ud_result[i], i, vec_ud_expected[i]);
#else
abort();
#endif
}
/* Signed double word multiply low */
d_arg1 = (vector signed long long int){ 2048, 4096 };
d_arg2 = (vector signed long long int){ 2, 4 };
vec_d_expected = (vector signed long long int){ 4096, 16384 };
vec_d_result = vec_mul (d_arg1, d_arg2);
for (i = 0; i < 2; i++)
{
if (vec_d_expected[i] != vec_d_result[i])
#ifdef DEBUG
printf("ERROR vec_mul signed result[%d] = %d != "
"expected[%d] = %d\n",
i, vec_d_result[i], i, vec_d_expected[i]);
#else
abort();
#endif
}
}