128 lines
2.9 KiB
C
128 lines
2.9 KiB
C
/*
|
|
* Copyright (C) 2015 Anshuman Khandual, IBM Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#define VEC_MAX 128
|
|
#define VSX_MAX 32
|
|
#define VMX_MAX 32
|
|
|
|
/*
|
|
* unsigned long vsx[32]
|
|
* unsigned long load[128]
|
|
*/
|
|
int validate_vsx(unsigned long *vsx, unsigned long *load)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < VSX_MAX; i++) {
|
|
if (vsx[i] != load[2 * i + 1]) {
|
|
printf("vsx[%d]: %lx load[%d] %lx\n",
|
|
i, vsx[i], 2 * i + 1, load[2 * i + 1]);
|
|
return TEST_FAIL;
|
|
}
|
|
}
|
|
return TEST_PASS;
|
|
}
|
|
|
|
/*
|
|
* unsigned long vmx[32][2]
|
|
* unsigned long load[128]
|
|
*/
|
|
int validate_vmx(unsigned long vmx[][2], unsigned long *load)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < VMX_MAX; i++) {
|
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
if ((vmx[i][0] != load[64 + 2 * i]) ||
|
|
(vmx[i][1] != load[65 + 2 * i])) {
|
|
printf("vmx[%d][0]: %lx load[%d] %lx\n",
|
|
i, vmx[i][0], 64 + 2 * i,
|
|
load[64 + 2 * i]);
|
|
printf("vmx[%d][1]: %lx load[%d] %lx\n",
|
|
i, vmx[i][1], 65 + 2 * i,
|
|
load[65 + 2 * i]);
|
|
return TEST_FAIL;
|
|
}
|
|
#else /*
|
|
* In LE each value pair is stored in an
|
|
* alternate manner.
|
|
*/
|
|
if ((vmx[i][0] != load[65 + 2 * i]) ||
|
|
(vmx[i][1] != load[64 + 2 * i])) {
|
|
printf("vmx[%d][0]: %lx load[%d] %lx\n",
|
|
i, vmx[i][0], 65 + 2 * i,
|
|
load[65 + 2 * i]);
|
|
printf("vmx[%d][1]: %lx load[%d] %lx\n",
|
|
i, vmx[i][1], 64 + 2 * i,
|
|
load[64 + 2 * i]);
|
|
return TEST_FAIL;
|
|
}
|
|
#endif
|
|
}
|
|
return TEST_PASS;
|
|
}
|
|
|
|
/*
|
|
* unsigned long store[128]
|
|
* unsigned long load[128]
|
|
*/
|
|
int compare_vsx_vmx(unsigned long *store, unsigned long *load)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < VSX_MAX; i++) {
|
|
if (store[1 + 2 * i] != load[1 + 2 * i]) {
|
|
printf("store[%d]: %lx load[%d] %lx\n",
|
|
1 + 2 * i, store[i],
|
|
1 + 2 * i, load[i]);
|
|
return TEST_FAIL;
|
|
}
|
|
}
|
|
|
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
for (i = 64; i < VEC_MAX; i++) {
|
|
if (store[i] != load[i]) {
|
|
printf("store[%d]: %lx load[%d] %lx\n",
|
|
i, store[i], i, load[i]);
|
|
return TEST_FAIL;
|
|
}
|
|
}
|
|
#else /* In LE each value pair is stored in an alternate manner */
|
|
for (i = 64; i < VEC_MAX; i++) {
|
|
if (!(i % 2) && (store[i] != load[i+1])) {
|
|
printf("store[%d]: %lx load[%d] %lx\n",
|
|
i, store[i], i+1, load[i+1]);
|
|
return TEST_FAIL;
|
|
}
|
|
if ((i % 2) && (store[i] != load[i-1])) {
|
|
printf("here store[%d]: %lx load[%d] %lx\n",
|
|
i, store[i], i-1, load[i-1]);
|
|
return TEST_FAIL;
|
|
}
|
|
}
|
|
#endif
|
|
return TEST_PASS;
|
|
}
|
|
|
|
void load_vsx_vmx(unsigned long *load, unsigned long *vsx,
|
|
unsigned long vmx[][2])
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < VSX_MAX; i++)
|
|
vsx[i] = load[1 + 2 * i];
|
|
|
|
for (i = 0; i < VMX_MAX; i++) {
|
|
vmx[i][0] = load[64 + 2 * i];
|
|
vmx[i][1] = load[65 + 2 * i];
|
|
}
|
|
}
|
|
|
|
void loadvsx(void *p, int tmp);
|
|
void storevsx(void *p, int tmp);
|