34 import java.util.concurrent.*;
35
36 import static jdk.test.lib.Asserts.*;
37
38 import jdk.experimental.bytecode.MacroCodeBuilder;
39 import jdk.experimental.bytecode.MacroCodeBuilder.CondKind;
40 import jdk.experimental.bytecode.TypeTag;
41 import jdk.test.lib.Utils;
42
43 import jdk.experimental.value.MethodHandleBuilder;
44
45 import javax.tools.*;
46
47 /**
48 * @test ValueTypesTest
49 * @summary Test data movement with value types
50 * @modules java.base/jdk.experimental.bytecode
51 * java.base/jdk.experimental.value
52 * @library /test/lib
53 * @compile -XDenableValueTypes TestValue1.java TestValue2.java TestValue3.java TestValue4.java ValueTypesTest.java
54 * @run main/othervm -Xint -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
55 * -XX:+ExplicitGCInvokesConcurrent
56 * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
57 * -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=false
58 * runtime.valhalla.valuetypes.ValueTypesTest
59 * @run main/othervm -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
60 * -XX:+ExplicitGCInvokesConcurrent
61 * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
62 * -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true
63 * runtime.valhalla.valuetypes.ValueTypesTest
64 */
65 public class ValueTypesTest {
66
67 public static void main(String[] args) {
68 Class<?> valueClass = runtime.valhalla.valuetypes.TestValue1.class;
69 Class<?> testClasses[] = {
70 runtime.valhalla.valuetypes.TestValue1.class,
71 runtime.valhalla.valuetypes.TestValue2.class,
72 runtime.valhalla.valuetypes.TestValue3.class,
73 runtime.valhalla.valuetypes.TestValue4.class
74 };
77 runtime.valhalla.valuetypes.ContainerValue2.class,
78 runtime.valhalla.valuetypes.ContainerValue3.class,
79 runtime.valhalla.valuetypes.ContainerValue4.class
80 };
81
82 for (int i = 0; i < testClasses.length; i++) {
83 try {
84 testExecutionStackToLocalVariable(testClasses[i]);
85 testExecutionStackToFields(testClasses[i], containerClasses[i]);
86 testExecutionStackToValueArray(testClasses[i], containerClasses[i]);
87 } catch (Throwable t) {
88 t.printStackTrace();
89 throw new RuntimeException(t);
90 }
91 }
92 }
93
94 static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
95
96 static void testExecutionStackToLocalVariable(Class<?> valueClass) throws Throwable {
97 String sig = "()Q" + valueClass.getName() + ";";
98 final String signature = sig.replace('.', '/');
99 System.out.println(signature);
100 MethodHandle fromExecStackToLocalVar = MethodHandleBuilder.loadCode(
101 LOOKUP,
102 "execStackToLocalVar",
103 MethodType.methodType(boolean.class),
104 CODE -> {
105 CODE.invokestatic(System.class, "gc", "()V", false);
106 int n = -1;
107 while (n < 1024) {
108 n++;
109 CODE
110 .invokestatic(valueClass, "getInstance", signature, false)
111 .vstore(n);
112 n++;
113 CODE
114 .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
115 .vstore(n);
116 }
117 CODE.invokestatic(System.class, "gc", "()V", false);
118 while (n > 0) {
119 CODE
120 .vload(n)
121 .invokevirtual(valueClass, "verify", "()Z", false)
122 .iconst_1()
123 .ifcmp(TypeTag.I, CondKind.NE, "end");
124 n--;
125 }
126 CODE
127 .iconst_1()
128 .return_(TypeTag.Z)
129 .label("end")
130 .iconst_0()
131 .return_(TypeTag.Z);
132 });
133 boolean result = (boolean) fromExecStackToLocalVar.invokeExact();
134 System.out.println(result);
135 assertTrue(result, "Invariant");
136 }
137
138 static void testExecutionStackToFields(Class<?> valueClass, Class<?> containerClass) throws Throwable {
139 final int ITERATIONS = 512;
140 String sig = "()Q" + valueClass.getName() + ";";
141 final String methodSignature = sig.replace('.', '/');
142 final String fieldSignature = "Q" + valueClass.getName().replace('.', '/') + ";";
143 System.out.println(methodSignature);
144 MethodHandle fromExecStackToFields = MethodHandleBuilder.loadCode(
145 LOOKUP,
146 "execStackToFields",
147 MethodType.methodType(boolean.class),
148 CODE -> {
149 CODE
150 .invokestatic(System.class, "gc", "()V", false)
151 .new_(containerClass)
152 .dup()
153 .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
154 .astore_1()
155 .iconst_m1()
156 .istore_2()
157 .label("loop")
158 .iload_2()
159 .ldc(ITERATIONS)
160 .ifcmp(TypeTag.I, CondKind.EQ, "end")
161 .aload_1()
162 .invokestatic(valueClass, "getInstance", methodSignature, false)
189 .getstatic(containerClass, "staticValueField", fieldSignature)
190 .invokevirtual(valueClass, "verify", "()Z", false)
191 .iconst_1()
192 .ifcmp(TypeTag.I, CondKind.NE, "failed")
193 .iinc(2, 1)
194 .goto_("loop")
195 .label("end")
196 .iconst_1()
197 .return_(TypeTag.Z)
198 .label("failed")
199 .iconst_0()
200 .return_(TypeTag.Z);
201 });
202 boolean result = (boolean) fromExecStackToFields.invokeExact();
203 System.out.println(result);
204 assertTrue(result, "Invariant");
205 }
206
207 static void testExecutionStackToValueArray(Class<?> valueClass, Class<?> containerClass) throws Throwable {
208 final int ITERATIONS = 100;
209 String sig = "()Q" + valueClass.getName() + ";";
210 final String signature = sig.replace('.', '/');
211 final String arraySignature = "[Q" + valueClass.getName().replace('.', '/') + ";";
212 System.out.println(arraySignature);
213 MethodHandle fromExecStackToValueArray = MethodHandleBuilder.loadCode(
214 LOOKUP,
215 "execStackToValueArray",
216 MethodType.methodType(boolean.class),
217 CODE -> {
218 CODE
219 .invokestatic(System.class, "gc", "()V", false)
220 .new_(containerClass)
221 .dup()
222 .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
223 .astore_1()
224 .ldc(ITERATIONS * 3)
225 .anewarray(valueClass)
226 .astore_2()
227 .aload_2()
228 .aload_1()
229 .swap()
230 .putfield(containerClass, "valueArray", arraySignature)
231 .iconst_0()
232 .istore_3()
233 .label("loop1")
234 .iload_3()
235 .ldc(ITERATIONS)
236 .ifcmp(TypeTag.I, CondKind.GE, "end1")
237 .aload_2()
238 .iload_3()
239 .invokestatic(valueClass, "getInstance", signature, false)
240 .vastore()
241 .iinc(3, 1)
242 .aload_2()
243 .iload_3()
244 .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
245 .vastore()
246 .iinc(3, 1)
247 .aload_2()
248 .iload_3()
249 .vdefault(valueClass)
250 .vastore()
251 .iinc(3, 1)
252 .goto_("loop1")
253 .label("end1")
254 .invokestatic(System.class, "gc", "()V", false)
255 .iconst_0()
256 .istore_3()
257 .label("loop2")
258 .iload_3()
259 .ldc(ITERATIONS * 3)
260 .ifcmp(TypeTag.I, CondKind.GE, "end2")
261 .aload_2()
262 .iload_3()
263 .vaload()
264 .invokevirtual(valueClass, "verify", "()Z", false)
265 .iconst_1()
266 .ifcmp(TypeTag.I, CondKind.NE, "failed")
267 .iinc(3, 1)
268 .goto_("loop2")
269 .label("end2")
270 .iconst_1()
271 .return_(TypeTag.Z)
272 .label("failed")
273 .iconst_0()
274 .return_(TypeTag.Z);
275 });
276 boolean result = (boolean) fromExecStackToValueArray.invokeExact();
277 System.out.println(result);
278 assertTrue(result, "Invariant");
279 }
280
281
282 }
|
34 import java.util.concurrent.*;
35
36 import static jdk.test.lib.Asserts.*;
37
38 import jdk.experimental.bytecode.MacroCodeBuilder;
39 import jdk.experimental.bytecode.MacroCodeBuilder.CondKind;
40 import jdk.experimental.bytecode.TypeTag;
41 import jdk.test.lib.Utils;
42
43 import jdk.experimental.value.MethodHandleBuilder;
44
45 import javax.tools.*;
46
47 /**
48 * @test ValueTypesTest
49 * @summary Test data movement with value types
50 * @modules java.base/jdk.experimental.bytecode
51 * java.base/jdk.experimental.value
52 * @library /test/lib
53 * @compile -XDenableValueTypes TestValue1.java TestValue2.java TestValue3.java TestValue4.java ValueTypesTest.java
54 * @run main/othervm -noverify -Xint -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
55 * -XX:+ExplicitGCInvokesConcurrent
56 * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
57 * -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=false
58 * runtime.valhalla.valuetypes.ValueTypesTest
59 * @run main/othervm -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
60 * -XX:+ExplicitGCInvokesConcurrent
61 * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
62 * -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true
63 * runtime.valhalla.valuetypes.ValueTypesTest
64 */
65 public class ValueTypesTest {
66
67 public static void main(String[] args) {
68 Class<?> valueClass = runtime.valhalla.valuetypes.TestValue1.class;
69 Class<?> testClasses[] = {
70 runtime.valhalla.valuetypes.TestValue1.class,
71 runtime.valhalla.valuetypes.TestValue2.class,
72 runtime.valhalla.valuetypes.TestValue3.class,
73 runtime.valhalla.valuetypes.TestValue4.class
74 };
77 runtime.valhalla.valuetypes.ContainerValue2.class,
78 runtime.valhalla.valuetypes.ContainerValue3.class,
79 runtime.valhalla.valuetypes.ContainerValue4.class
80 };
81
82 for (int i = 0; i < testClasses.length; i++) {
83 try {
84 testExecutionStackToLocalVariable(testClasses[i]);
85 testExecutionStackToFields(testClasses[i], containerClasses[i]);
86 testExecutionStackToValueArray(testClasses[i], containerClasses[i]);
87 } catch (Throwable t) {
88 t.printStackTrace();
89 throw new RuntimeException(t);
90 }
91 }
92 }
93
94 static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
95
96 static void testExecutionStackToLocalVariable(Class<?> valueClass) throws Throwable {
97 String sig = "()L" + valueClass.getName() + ";";
98 final String signature = sig.replace('.', '/');
99 System.out.println(signature);
100 MethodHandle fromExecStackToLocalVar = MethodHandleBuilder.loadCode(
101 LOOKUP,
102 "execStackToLocalVar",
103 MethodType.methodType(boolean.class),
104 CODE -> {
105 CODE.invokestatic(System.class, "gc", "()V", false);
106 int n = -1;
107 while (n < 1024) {
108 n++;
109 CODE
110 .invokestatic(valueClass, "getInstance", signature, false)
111 .astore(n);
112 n++;
113 CODE
114 .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
115 .astore(n);
116 }
117 CODE.invokestatic(System.class, "gc", "()V", false);
118 while (n > 0) {
119 CODE
120 .aload(n)
121 .invokevirtual(valueClass, "verify", "()Z", false)
122 .iconst_1()
123 .ifcmp(TypeTag.I, CondKind.NE, "end");
124 n--;
125 }
126 CODE
127 .iconst_1()
128 .return_(TypeTag.Z)
129 .label("end")
130 .iconst_0()
131 .return_(TypeTag.Z);
132 });
133 boolean result = (boolean) fromExecStackToLocalVar.invokeExact();
134 System.out.println(result);
135 assertTrue(result, "Invariant");
136 }
137
138 static void testExecutionStackToFields(Class<?> valueClass, Class<?> containerClass) throws Throwable {
139 final int ITERATIONS = 512;
140 String sig = "()L" + valueClass.getName() + ";";
141 final String methodSignature = sig.replace('.', '/');
142 final String fieldSignature = "L" + valueClass.getName().replace('.', '/') + ";";
143 System.out.println(methodSignature);
144 MethodHandle fromExecStackToFields = MethodHandleBuilder.loadCode(
145 LOOKUP,
146 "execStackToFields",
147 MethodType.methodType(boolean.class),
148 CODE -> {
149 CODE
150 .invokestatic(System.class, "gc", "()V", false)
151 .new_(containerClass)
152 .dup()
153 .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
154 .astore_1()
155 .iconst_m1()
156 .istore_2()
157 .label("loop")
158 .iload_2()
159 .ldc(ITERATIONS)
160 .ifcmp(TypeTag.I, CondKind.EQ, "end")
161 .aload_1()
162 .invokestatic(valueClass, "getInstance", methodSignature, false)
189 .getstatic(containerClass, "staticValueField", fieldSignature)
190 .invokevirtual(valueClass, "verify", "()Z", false)
191 .iconst_1()
192 .ifcmp(TypeTag.I, CondKind.NE, "failed")
193 .iinc(2, 1)
194 .goto_("loop")
195 .label("end")
196 .iconst_1()
197 .return_(TypeTag.Z)
198 .label("failed")
199 .iconst_0()
200 .return_(TypeTag.Z);
201 });
202 boolean result = (boolean) fromExecStackToFields.invokeExact();
203 System.out.println(result);
204 assertTrue(result, "Invariant");
205 }
206
207 static void testExecutionStackToValueArray(Class<?> valueClass, Class<?> containerClass) throws Throwable {
208 final int ITERATIONS = 100;
209 String sig = "()L" + valueClass.getName() + ";";
210 final String signature = sig.replace('.', '/');
211 final String arraySignature = "[L" + valueClass.getName().replace('.', '/') + ";";
212 System.out.println(arraySignature);
213 MethodHandle fromExecStackToValueArray = MethodHandleBuilder.loadCode(
214 LOOKUP,
215 "execStackToValueArray",
216 MethodType.methodType(boolean.class),
217 CODE -> {
218 CODE
219 .invokestatic(System.class, "gc", "()V", false)
220 .new_(containerClass)
221 .dup()
222 .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
223 .astore_1()
224 .ldc(ITERATIONS * 3)
225 .anewarray(valueClass)
226 .astore_2()
227 .aload_2()
228 .aload_1()
229 .swap()
230 .putfield(containerClass, "valueArray", arraySignature)
231 .iconst_0()
232 .istore_3()
233 .label("loop1")
234 .iload_3()
235 .ldc(ITERATIONS)
236 .ifcmp(TypeTag.I, CondKind.GE, "end1")
237 .aload_2()
238 .iload_3()
239 .invokestatic(valueClass, "getInstance", signature, false)
240 .aastore()
241 .iinc(3, 1)
242 .aload_2()
243 .iload_3()
244 .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
245 .aastore()
246 .iinc(3, 1)
247 .aload_2()
248 .iload_3()
249 .vdefault(valueClass)
250 .aastore()
251 .iinc(3, 1)
252 .goto_("loop1")
253 .label("end1")
254 .invokestatic(System.class, "gc", "()V", false)
255 .iconst_0()
256 .istore_3()
257 .label("loop2")
258 .iload_3()
259 .ldc(ITERATIONS * 3)
260 .ifcmp(TypeTag.I, CondKind.GE, "end2")
261 .aload_2()
262 .iload_3()
263 .aaload()
264 .invokevirtual(valueClass, "verify", "()Z", false)
265 .iconst_1()
266 .ifcmp(TypeTag.I, CondKind.NE, "failed")
267 .iinc(3, 1)
268 .goto_("loop2")
269 .label("end2")
270 .iconst_1()
271 .return_(TypeTag.Z)
272 .label("failed")
273 .iconst_0()
274 .return_(TypeTag.Z);
275 });
276 boolean result = (boolean) fromExecStackToValueArray.invokeExact();
277 System.out.println(result);
278 assertTrue(result, "Invariant");
279 }
280
281
282 }
|