39
40 public class TestFloatConversionsVector {
41 private static final int ARRLEN = 1024;
42 private static final int ITERS = 11000;
43 private static float [] finp;
44 private static short [] sout;
45 private static short [] sinp;
46 private static float [] fout;
47
48 public static void main(String args[]) {
49 TestFramework framework = new TestFramework(TestFloatConversionsVector.class);
50 framework.addFlags("-XX:-TieredCompilation", "-XX:CompileThresholdScaling=0.3");
51 framework.addCrossProductScenarios(Set.of("-XX:-UseCompactObjectHeaders", "-XX:+UseCompactObjectHeaders"),
52 Set.of("-XX:-AlignVector", "-XX:+AlignVector"));
53 framework.start();
54 System.out.println("PASSED");
55 }
56
57 @Test
58 @IR(counts = {IRNode.VECTOR_CAST_F2HF, IRNode.VECTOR_SIZE + "min(max_float, max_short)", "> 0"},
59 applyIfOr = {"UseCompactObjectHeaders", "false", "AlignVector", "false"},
60 applyIfPlatformOr = {"x64", "true", "aarch64", "true", "riscv64", "true"},
61 applyIfCPUFeatureOr = {"f16c", "true", "avx512f", "true", "zvfh", "true", "asimd", "true", "sve", "true"})
62 public void test_float_float16(short[] sout, float[] finp) {
63 for (int i = 0; i < finp.length; i++) {
64 sout[i] = Float.floatToFloat16(finp[i]);
65 // With AlignVector, we need 8-byte alignment of vector loads/stores.
66 // UseCompactObjectHeaders=false UseCompactObjectHeaders=true
67 // F_adr = base + 16 + 4*i -> i % 2 = 0 F_adr = base + 12 + 4*i -> i % 2 = 1
68 // S_adr = base + 16 + 2*i -> i % 4 = 0 S_adr = base + 12 + 2*i -> i % 4 = 2
69 // -> vectorize -> no vectorization
70 }
71 }
72
73 @Test
74 public void test_float_float16_strided(short[] sout, float[] finp) {
75 for (int i = 0; i < finp.length/2; i++) {
76 sout[i*2] = Float.floatToFloat16(finp[i*2]);
77 }
78 }
79
80 @Test
81 @IR(counts = {IRNode.VECTOR_CAST_F2HF, IRNode.VECTOR_SIZE_2, "> 0"},
82 applyIfOr = {"UseCompactObjectHeaders", "false", "AlignVector", "false"},
83 applyIfCPUFeature = {"asimd", "true"})
84 public void test_float_float16_short_vector(short[] sout, float[] finp) {
85 for (int i = 0; i < finp.length; i += 4) {
86 sout[i] = Float.floatToFloat16(finp[i]);
87 sout[i + 1] = Float.floatToFloat16(finp[i + 1]);
88 }
89 }
112 }
113
114 // Verifying the result
115 for (int i = 0; i < ARRLEN/2; i++) {
116 Asserts.assertEquals(Float.floatToFloat16(finp[i*2]), sout[i*2]);
117 }
118
119 for (int i = 0; i < ITERS; i++) {
120 test_float_float16_short_vector(sout, finp);
121 }
122
123 // Verifying the result
124 for (int i = 0; i < ARRLEN; i += 4) {
125 Asserts.assertEquals(Float.floatToFloat16(finp[i]), sout[i]);
126 Asserts.assertEquals(Float.floatToFloat16(finp[i + 1]), sout[i + 1]);
127 }
128 }
129
130 @Test
131 @IR(counts = {IRNode.VECTOR_CAST_HF2F, IRNode.VECTOR_SIZE + "min(max_float, max_short)", "> 0"},
132 applyIfOr = {"UseCompactObjectHeaders", "false", "AlignVector", "false"},
133 applyIfPlatformOr = {"x64", "true", "aarch64", "true", "riscv64", "true"},
134 applyIfCPUFeatureOr = {"f16c", "true", "avx512f", "true", "zvfh", "true", "asimd", "true", "sve", "true"})
135 public void test_float16_float(float[] fout, short[] sinp) {
136 for (int i = 0; i < sinp.length; i++) {
137 fout[i] = Float.float16ToFloat(sinp[i]);
138 // With AlignVector, we need 8-byte alignment of vector loads/stores.
139 // UseCompactObjectHeaders=false UseCompactObjectHeaders=true
140 // F_adr = base + 16 + 4*i -> i % 2 = 0 F_adr = base + 12 + 4*i -> i % 2 = 1
141 // S_adr = base + 16 + 2*i -> i % 4 = 0 S_adr = base + 12 + 2*i -> i % 4 = 2
142 // -> vectorize -> no vectorization
143 }
144 }
145
146 @Test
147 public void test_float16_float_strided(float[] fout, short[] sinp) {
148 for (int i = 0; i < sinp.length/2; i++) {
149 fout[i*2] = Float.float16ToFloat(sinp[i*2]);
150 }
151 }
152
153 @Test
154 @IR(counts = {IRNode.VECTOR_CAST_HF2F, IRNode.VECTOR_SIZE_2, "> 0"},
155 applyIfOr = {"UseCompactObjectHeaders", "false", "AlignVector", "false"},
156 applyIfCPUFeature = {"asimd", "true"})
157 public void test_float16_float_short_vector(float[] fout, short[] sinp) {
158 for (int i = 0; i < sinp.length; i += 4) {
159 fout[i] = Float.float16ToFloat(sinp[i]);
160 fout[i + 1] = Float.float16ToFloat(sinp[i + 1]);
161 }
162 }
|
39
40 public class TestFloatConversionsVector {
41 private static final int ARRLEN = 1024;
42 private static final int ITERS = 11000;
43 private static float [] finp;
44 private static short [] sout;
45 private static short [] sinp;
46 private static float [] fout;
47
48 public static void main(String args[]) {
49 TestFramework framework = new TestFramework(TestFloatConversionsVector.class);
50 framework.addFlags("-XX:-TieredCompilation", "-XX:CompileThresholdScaling=0.3");
51 framework.addCrossProductScenarios(Set.of("-XX:-UseCompactObjectHeaders", "-XX:+UseCompactObjectHeaders"),
52 Set.of("-XX:-AlignVector", "-XX:+AlignVector"));
53 framework.start();
54 System.out.println("PASSED");
55 }
56
57 @Test
58 @IR(counts = {IRNode.VECTOR_CAST_F2HF, IRNode.VECTOR_SIZE + "min(max_float, max_short)", "> 0"},
59 applyIfPlatformOr = {"x64", "true", "aarch64", "true", "riscv64", "true"},
60 applyIfCPUFeatureOr = {"f16c", "true", "avx512f", "true", "zvfh", "true", "asimd", "true", "sve", "true"})
61 public void test_float_float16(short[] sout, float[] finp) {
62 for (int i = 0; i < finp.length; i++) {
63 sout[i] = Float.floatToFloat16(finp[i]);
64 }
65 }
66
67 @Test
68 public void test_float_float16_strided(short[] sout, float[] finp) {
69 for (int i = 0; i < finp.length/2; i++) {
70 sout[i*2] = Float.floatToFloat16(finp[i*2]);
71 }
72 }
73
74 @Test
75 @IR(counts = {IRNode.VECTOR_CAST_F2HF, IRNode.VECTOR_SIZE_2, "> 0"},
76 applyIfOr = {"UseCompactObjectHeaders", "false", "AlignVector", "false"},
77 applyIfCPUFeature = {"asimd", "true"})
78 public void test_float_float16_short_vector(short[] sout, float[] finp) {
79 for (int i = 0; i < finp.length; i += 4) {
80 sout[i] = Float.floatToFloat16(finp[i]);
81 sout[i + 1] = Float.floatToFloat16(finp[i + 1]);
82 }
83 }
106 }
107
108 // Verifying the result
109 for (int i = 0; i < ARRLEN/2; i++) {
110 Asserts.assertEquals(Float.floatToFloat16(finp[i*2]), sout[i*2]);
111 }
112
113 for (int i = 0; i < ITERS; i++) {
114 test_float_float16_short_vector(sout, finp);
115 }
116
117 // Verifying the result
118 for (int i = 0; i < ARRLEN; i += 4) {
119 Asserts.assertEquals(Float.floatToFloat16(finp[i]), sout[i]);
120 Asserts.assertEquals(Float.floatToFloat16(finp[i + 1]), sout[i + 1]);
121 }
122 }
123
124 @Test
125 @IR(counts = {IRNode.VECTOR_CAST_HF2F, IRNode.VECTOR_SIZE + "min(max_float, max_short)", "> 0"},
126 applyIfPlatformOr = {"x64", "true", "aarch64", "true", "riscv64", "true"},
127 applyIfCPUFeatureOr = {"f16c", "true", "avx512f", "true", "zvfh", "true", "asimd", "true", "sve", "true"})
128 public void test_float16_float(float[] fout, short[] sinp) {
129 for (int i = 0; i < sinp.length; i++) {
130 fout[i] = Float.float16ToFloat(sinp[i]);
131 }
132 }
133
134 @Test
135 public void test_float16_float_strided(float[] fout, short[] sinp) {
136 for (int i = 0; i < sinp.length/2; i++) {
137 fout[i*2] = Float.float16ToFloat(sinp[i*2]);
138 }
139 }
140
141 @Test
142 @IR(counts = {IRNode.VECTOR_CAST_HF2F, IRNode.VECTOR_SIZE_2, "> 0"},
143 applyIfOr = {"UseCompactObjectHeaders", "false", "AlignVector", "false"},
144 applyIfCPUFeature = {"asimd", "true"})
145 public void test_float16_float_short_vector(float[] fout, short[] sinp) {
146 for (int i = 0; i < sinp.length; i += 4) {
147 fout[i] = Float.float16ToFloat(sinp[i]);
148 fout[i + 1] = Float.float16ToFloat(sinp[i + 1]);
149 }
150 }
|