Andreas Arnez 0a1d523a87 s390x: Vector integer and string insn support -- tests
This adds test cases and some internal stuff to the z/Architecture vector
integer and string instruction support.

Contributed by Vadim Barkov <vbrkov@gmail.com>.
2018-09-26 19:31:02 +02:00

274 lines
8.9 KiB
C

#include "vector.h"
s390_test_generate(vl_vst, "vl %%v5, %[v_arg1]")
s390_test_generate(vlr, "vlr %%v5, %%v1")
s390_test_generate(vlrep, "vlrepg %%v1, %[m_arg1]\n" \
"vlrepf %%v2, %[m_arg2]\n" \
"vlreph %%v3, %[m_arg3]\n" \
"vlrepb %%v5, %[m_arg1]")
s390_test_generate(vle, "vleb %%v5, %[m_arg1], 14\n" \
"vleh %%v5, %[m_arg2], 6\n" \
"vlef %%v5, %[m_arg3], 2\n" \
"vleg %%v5, %[m_arg1], 0")
s390_test_generate(vlei_pos, "vleib %%v5, 0x091a, 14\n" \
"vleih %%v5, 0x1bbb, 6\n" \
"vleif %%v5, 0x1ccc, 2\n" \
"vleig %%v5, 0x1ddd, 0")
s390_test_generate(vlei_neg, "vleib %%v5, -0x091a, 14\n" \
"vleih %%v5, -0x1bbb, 6\n" \
"vleif %%v5, -0x1ccc, 2\n" \
"vleig %%v5, -0x1ddd, 0")
s390_test_generate(vlvg, "vlvgb %[r_arg1], %%v1, 12(0)\n" \
"vlvgh %[r_arg2], %%v2, 6(0)\n" \
"vlvgf %[r_arg3], %%v3, 2(0)\n" \
"vlvgg %[r_arg1], %%v5, 1(0)")
s390_test_generate(vgbm, "vgbm %%v1, 0xf00f \n" \
"vzero %%v2 \n" \
"vone %%v5")
s390_test_generate(vgm, "vgmb %%v1, 4, 6 \n" \
"vgmh %%v2, 2, 14 \n" \
"vgmf %%v3, 3, 23 \n"
"vgmg %%v3, 1, 55")
s390_test_generate(vllez, "vllezb %%v1, %[m_arg1]\n" \
"vllezh %%v2, %[m_arg2]\n" \
"vllezf %%v3, %[m_arg3]\n"
"vllezg %%v5, %[m_arg1]")
s390_test_generate(vgef, "vzero %%v1\n" \
"vgef %%v5, 16(%%v1, %[r_memory_pool]), 2 \n")
s390_test_generate(vgeg, "vzero %%v1\n" \
"vgeg %%v5, 32(%%v1, %[r_memory_pool]), 1 \n")
s390_test_generate(vlm_vstm, "vlm %%v1, %%v3, %[m_memory_pool]\n" \
"vstm %%v1, %%v3, %[m_memory_pool]\n")
s390_test_generate(vlvgp, "vlvgp %%v1, %[r_arg1], %[r_arg2]")
s390_test_generate(vlgv, "vlgvb %[r_arg1], %%v1, 12(0)\n" \
"vlgvh %[r_arg2], %%v2, 6(0)\n" \
"vlgvf %[r_arg3], %%v3, 2(0)\n"
"vlgvg %[r_arg1], %%v5, 1(0)")
s390_test_generate(vmrhb, "vmrhb %%v5, %%v1, %%v2")
s390_test_generate(vmrhh, "vmrhh %%v5, %%v1, %%v2")
s390_test_generate(vmrhf, "vmrhf %%v5, %%v1, %%v2")
s390_test_generate(vmrhg, "vmrhg %%v5, %%v1, %%v2")
s390_test_generate(vmrlb, "vmrlb %%v5, %%v1, %%v2")
s390_test_generate(vmrlh, "vmrlh %%v5, %%v1, %%v2")
s390_test_generate(vmrlf, "vmrlf %%v5, %%v1, %%v2")
s390_test_generate(vmrlg, "vmrlg %%v5, %%v1, %%v2")
s390_test_generate(vpkh, "vpkh %%v5, %%v1, %%v2")
s390_test_generate(vpkf, "vpkf %%v5, %%v1, %%v2")
s390_test_generate(vpkg, "vpkg %%v5, %%v1, %%v2")
s390_test_generate(vpksh, "vpksh %%v5, %%v1, %%v2")
s390_test_generate(vpksf, "vpksf %%v5, %%v1, %%v2")
s390_test_generate(vpksg, "vpksg %%v5, %%v1, %%v2")
s390_test_generate(vpklsh, "vpklsh %%v5, %%v1, %%v2")
s390_test_generate(vpklsf, "vpklsf %%v5, %%v1, %%v2")
s390_test_generate(vpklsg, "vpklsg %%v5, %%v1, %%v2")
s390_test_generate(vpkshs, "vpkshs %%v5, %%v1, %%v2\n" \
"ipm %[r_result]\n" \
"srl %[r_result], 28")
s390_test_generate(vpksfs, "vpksfs %%v5, %%v1, %%v2\n" \
"ipm %[r_result]\n" \
"srl %[r_result], 28")
s390_test_generate(vpksgs, "vpksgs %%v5, %%v1, %%v2\n" \
"ipm %[r_result]\n" \
"srl %[r_result], 28")
s390_test_generate(vpklshs, "vpklshs %%v5, %%v1, %%v2\n" \
"ipm %[r_result]\n" \
"srl %[r_result], 28")
s390_test_generate(vpklsfs, "vpklsfs %%v5, %%v1, %%v2\n" \
"ipm %[r_result]\n" \
"srl %[r_result], 28")
s390_test_generate(vpklsgs, "vpklsgs %%v5, %%v1, %%v2\n" \
"ipm %[r_result]\n" \
"srl %[r_result], 28")
s390_test_generate(vperm, "vperm %%v5, %%v1, %%v2, %%v3")
s390_test_generate(vpdi0, "vpdi %%v5, %%v1, %%v2, 0")
s390_test_generate(vpdi1, "vpdi %%v5, %%v1, %%v2, 1")
s390_test_generate(vpdi4, "vpdi %%v5, %%v1, %%v2, 4")
s390_test_generate(vpdi5, "vpdi %%v5, %%v1, %%v2, 5")
s390_test_generate(vscef, "vzero %%v1\n" \
"vscef %%v5, 0(%%v1, %[r_memory_pool]), 1")
s390_test_generate(vsceg, "vzero %%v1\n" \
"vsceg %%v5, 16(%%v1, %[r_memory_pool]), 1")
s390_test_generate(vsegb, "vsegb %%v5, %%v1")
s390_test_generate(vsegh, "vsegh %%v5, %%v1")
s390_test_generate(vsegf, "vsegf %%v5, %%v1")
s390_test_generate(vste, "vsteb %%v1, %[m_arg1], 4\n" \
"vsteh %%v1, %[m_arg2], 3\n" \
"vstef %%v1, %[m_arg3], 2\n" \
"vsteg %%v1, %[m_arg1], 1\n")
s390_test_generate(vuph, "vuphb %%v2, %%v1\n" \
"vuphh %%v3, %%v1\n" \
"vuphf %%v5, %%v1")
s390_test_generate(vuplh, "vuplhb %%v2, %%v1\n" \
"vuplhh %%v3, %%v1\n" \
"vuplhf %%v5, %%v1")
s390_test_generate(vupl, "vuplb %%v2, %%v1\n" \
"vuplhw %%v3, %%v1\n" \
"vuplf %%v5, %%v1")
s390_test_generate(vupll, "vupllb %%v2, %%v1\n" \
"vupllh %%v3, %%v1\n" \
"vupllf %%v5, %%v1")
s390_test_generate(vrepb, "vrepb %%v5, %%v1, 1")
s390_test_generate(vreph, "vreph %%v5, %%v1, 1")
s390_test_generate(vrepf, "vrepf %%v5, %%v1, 1")
s390_test_generate(vrepg, "vrepg %%v5, %%v1, 1")
s390_test_generate(vrepib, "vrepib %%v5, -0x0fee")
s390_test_generate(vrepih, "vrepih %%v5, -0x0fee")
s390_test_generate(vrepif, "vrepif %%v5, -0x0fee")
s390_test_generate(vrepig, "vrepig %%v5, -0x0fee")
s390_test_generate(vsel, "vsel %%v5, %%v1, %%v2, %%v3")
s390_test_generate(vll_vstl, "vll %%v5, %[r_arg1], %[v_arg1]\n" \
"vstl %%v5, %[r_arg1], %[v_arg2]\n" \
"vl %%v2, %[v_arg2]")
s390_test_generate(vlbb, "vlbb %%v5, 60(%[r_memory_pool]), 0")
/* Test the correctness of work with VR's > 16.
VSEL is choosed just because it have four arguments.
The algorithm (the tested VR's are %%v21 - %%v24):
- save tested VR's to temporary location
- copy compile-time known values to tested VR's
- perform VSEL on tested VR's
- copy tested VR's to printed results
- restore saved VR's from temporary location
*/
s390_test_generate(test_upper16_registers, \
"vstm %%v21, %%v24, %[m_memory_pool]\n" \
\
"vlr %%v21, %%v1\n" \
"vlr %%v22, %%v2\n" \
"vlr %%v23, %%v3\n" \
"vlr %%v24, %%v5\n" \
\
"vsel %%v24, %%v21, %%v22, %%v23\n" \
\
"vlr %%v1, %%v21\n" \
"vlr %%v2, %%v22\n" \
"vlr %%v3, %%v23\n" \
"vlr %%v5, %%v24\n" \
\
"vlm %%v21, %%v24, %[m_memory_pool]\n")
int main() {
size_t iteration = 0;
randomize_memory_pool();
/* Some of insn depend only on immediate arguments, which are known at compile time.
There is no need to run them more than once. We use test_once() for them.
*/
/* Theese insn are used in every test. Test them first */
test(vl_vst);
test_once(vgbm);
test(vlr);
test(vlrep);
test(vle);
test(vlei_pos);
test(vlei_neg);
test(vlgv);
test(vgm);
test(vllez);
test(vlvgp);
test(vlvg);
test(vmrhb);
test(vmrhh);
test(vmrhf);
test(vmrhg);
test(vmrlb);
test(vmrlh);
test(vmrlf);
test(vmrlg);
test(vpkh);
test(vpkf);
test(vpkg);
test(vperm);
test(vpdi0);
test(vpdi1);
test(vpdi4);
test(vpdi5);
test(vsegb);
test(vsegh);
test(vsegf);
test(vste);
test(vuph);
test(vuplh);
test(vupl);
test(vupll);
test(vrepb);
test(vreph);
test(vrepf);
test(vrepg);
test_once(vrepib);
test_once(vrepih);
test_once(vrepif);
test_once(vrepig);
test(vpksh);
test(vpkshs);
test(vpksf);
test(vpksfs);
test(vpksg);
test(vpksgs);
test(vpklsh);
test(vpklshs);
test(vpklsf);
test(vpklsfs);
test(vpklsg);
test(vpklsgs);
test(vsel);
test(vll_vstl);
test(vlbb, (randomize_memory_pool()));
test(vlm_vstm, (randomize_memory_pool()));
test(vgef, (randomize_memory_pool()));
test(vgeg, (randomize_memory_pool()));
test(vscef, (randomize_memory_pool()));
test(vsceg, (randomize_memory_pool()));
test_once(test_upper16_registers);
return 0;
}