| /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| /* |
| * Copyright (C) 2015 Anshuman Khandual, IBM Corporation. |
| */ |
| #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); |