Skip to content

Commit 583cb75

Browse files
committedAug 14, 2023
8313406: nep_invoker_blob can be simplified more
Reviewed-by: jvernee, vlivanov
1 parent 0074b48 commit 583cb75

File tree

3 files changed

+30
-37
lines changed

3 files changed

+30
-37
lines changed
 

‎src/hotspot/cpu/x86/downcallLinker_x86_64.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,9 @@ void DowncallStubGenerator::generate() {
201201
__ enter();
202202

203203
// return address and rbp are already in place
204-
__ subptr(rsp, allocated_frame_size); // prolog
204+
if (allocated_frame_size > 0) {
205+
__ subptr(rsp, allocated_frame_size); // prolog
206+
}
205207

206208
_frame_complete = __ pc() - start;
207209

‎src/java.base/share/classes/jdk/internal/foreign/abi/x64/sysv/CallArranger.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public static Bindings getBindings(MethodType mt, FunctionDescriptor cDesc, bool
116116
csb.addArgumentBindings(carrier, layout, argCalc.getBindings(carrier, layout));
117117
}
118118

119-
if (!forUpcall) {
119+
if (!forUpcall && options.isVariadicFunction()) {
120120
//add extra binding for number of used vector registers (used for variadic calls)
121121
csb.addArgumentBindings(long.class, C_LONG,
122122
List.of(vmStore(rax, long.class)));
@@ -129,7 +129,9 @@ public static MethodHandle arrangeDowncall(MethodType mt, FunctionDescriptor cDe
129129
Bindings bindings = getBindings(mt, cDesc, false, options);
130130

131131
MethodHandle handle = new DowncallLinker(CSysV, bindings.callingSequence).getBoundMethodHandle();
132-
handle = MethodHandles.insertArguments(handle, handle.type().parameterCount() - 1, bindings.nVectorArgs);
132+
if (options.isVariadicFunction()) {
133+
handle = MethodHandles.insertArguments(handle, handle.type().parameterCount() - 1, bindings.nVectorArgs);
134+
}
133135

134136
if (bindings.isInMemoryReturn) {
135137
handle = SharedUtils.adaptDowncallForIMR(handle, cDesc, bindings.callingSequence);

‎test/jdk/java/foreign/callarranger/TestSysVCallArranger.java

+23-34
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,11 @@ public void testEmpty() {
7171

7272
assertFalse(bindings.isInMemoryReturn());
7373
CallingSequence callingSequence = bindings.callingSequence();
74-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
75-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
74+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
75+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
7676

7777
checkArgumentBindings(callingSequence, new Binding[][]{
7878
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
79-
{ vmStore(rax, long.class) }
8079
});
8180

8281
checkReturnBindings(callingSequence, new Binding[]{});
@@ -99,14 +98,13 @@ public void testNestedStructs() {
9998

10099
assertFalse(bindings.isInMemoryReturn());
101100
CallingSequence callingSequence = bindings.callingSequence();
102-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
103-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
101+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
102+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
104103

105104
checkArgumentBindings(callingSequence, new Binding[][]{
106105
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
107106
{ dup(), bufferLoad(0, long.class), vmStore(rdi, long.class),
108107
bufferLoad(8, int.class), vmStore(rsi, int.class)},
109-
{ vmStore(rax, long.class) },
110108
});
111109

112110
checkReturnBindings(callingSequence, new Binding[]{});
@@ -130,14 +128,13 @@ public void testNestedUnion() {
130128

131129
assertFalse(bindings.isInMemoryReturn());
132130
CallingSequence callingSequence = bindings.callingSequence();
133-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
134-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
131+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
132+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
135133

136134
checkArgumentBindings(callingSequence, new Binding[][]{
137135
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
138136
{ dup(), bufferLoad(0, long.class), vmStore(rdi, long.class),
139137
bufferLoad(8, long.class), vmStore(rsi, long.class)},
140-
{ vmStore(rax, long.class) },
141138
});
142139

143140
checkReturnBindings(callingSequence, new Binding[]{});
@@ -155,8 +152,8 @@ public void testIntegerRegs() {
155152

156153
assertFalse(bindings.isInMemoryReturn());
157154
CallingSequence callingSequence = bindings.callingSequence();
158-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
159-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
155+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
156+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
160157

161158
checkArgumentBindings(callingSequence, new Binding[][]{
162159
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
@@ -166,7 +163,6 @@ public void testIntegerRegs() {
166163
{ vmStore(rcx, int.class) },
167164
{ vmStore(r8, int.class) },
168165
{ vmStore(r9, int.class) },
169-
{ vmStore(rax, long.class) },
170166
});
171167

172168
checkReturnBindings(callingSequence, new Binding[]{});
@@ -186,8 +182,8 @@ public void testDoubleRegs() {
186182

187183
assertFalse(bindings.isInMemoryReturn());
188184
CallingSequence callingSequence = bindings.callingSequence();
189-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
190-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
185+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
186+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
191187

192188
checkArgumentBindings(callingSequence, new Binding[][]{
193189
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
@@ -199,7 +195,6 @@ public void testDoubleRegs() {
199195
{ vmStore(xmm5, double.class) },
200196
{ vmStore(xmm6, double.class) },
201197
{ vmStore(xmm7, double.class) },
202-
{ vmStore(rax, long.class) },
203198
});
204199

205200
checkReturnBindings(callingSequence, new Binding[]{});
@@ -221,8 +216,8 @@ public void testMixed() {
221216

222217
assertFalse(bindings.isInMemoryReturn());
223218
CallingSequence callingSequence = bindings.callingSequence();
224-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
225-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
219+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
220+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
226221

227222
checkArgumentBindings(callingSequence, new Binding[][]{
228223
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
@@ -244,7 +239,6 @@ public void testMixed() {
244239
{ vmStore(xmm7, float.class) },
245240
{ vmStore(stackStorage(STACK_SLOT_SIZE, 16), float.class) },
246241
{ vmStore(stackStorage(STACK_SLOT_SIZE, 24), float.class) },
247-
{ vmStore(rax, long.class) },
248242
});
249243

250244
checkReturnBindings(callingSequence, new Binding[]{});
@@ -278,8 +272,8 @@ public void testAbiExample() {
278272

279273
assertFalse(bindings.isInMemoryReturn());
280274
CallingSequence callingSequence = bindings.callingSequence();
281-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
282-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
275+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
276+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
283277

284278
checkArgumentBindings(callingSequence, new Binding[][]{
285279
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
@@ -297,7 +291,6 @@ public void testAbiExample() {
297291
{ vmStore(r9, int.class) },
298292
{ vmStore(stackStorage(STACK_SLOT_SIZE, 0), int.class) },
299293
{ vmStore(stackStorage(STACK_SLOT_SIZE, 8), int.class) },
300-
{ vmStore(rax, long.class) },
301294
});
302295

303296
checkReturnBindings(callingSequence, new Binding[]{});
@@ -321,13 +314,12 @@ public void testMemoryAddress() {
321314

322315
assertFalse(bindings.isInMemoryReturn());
323316
CallingSequence callingSequence = bindings.callingSequence();
324-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
325-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
317+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
318+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
326319

327320
checkArgumentBindings(callingSequence, new Binding[][]{
328321
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
329322
{ unboxAddress(), vmStore(rdi, long.class) },
330-
{ vmStore(rax, long.class) },
331323
});
332324

333325
checkReturnBindings(callingSequence, new Binding[]{});
@@ -343,13 +335,12 @@ public void testStruct(MemoryLayout struct, Binding[] expectedBindings) {
343335

344336
assertFalse(bindings.isInMemoryReturn());
345337
CallingSequence callingSequence = bindings.callingSequence();
346-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class));
347-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS));
338+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class));
339+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS));
348340

349341
checkArgumentBindings(callingSequence, new Binding[][]{
350342
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
351343
expectedBindings,
352-
{ vmStore(rax, long.class) },
353344
});
354345

355346
checkReturnBindings(callingSequence, new Binding[]{});
@@ -402,13 +393,12 @@ public void testReturnRegisterStruct() {
402393

403394
assertFalse(bindings.isInMemoryReturn());
404395
CallingSequence callingSequence = bindings.callingSequence();
405-
assertEquals(callingSequence.callerMethodType(), mt.appendParameterTypes(long.class).insertParameterTypes(0, MemorySegment.class, MemorySegment.class));
406-
assertEquals(callingSequence.functionDesc(), fd.appendArgumentLayouts(C_LONG).insertArgumentLayouts(0, ADDRESS, ADDRESS));
396+
assertEquals(callingSequence.callerMethodType(), mt.insertParameterTypes(0, MemorySegment.class, MemorySegment.class));
397+
assertEquals(callingSequence.functionDesc(), fd.insertArgumentLayouts(0, ADDRESS, ADDRESS));
407398

408399
checkArgumentBindings(callingSequence, new Binding[][]{
409400
{ unboxAddress(), vmStore(RETURN_BUFFER_STORAGE, long.class) },
410401
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
411-
{ vmStore(rax, long.class) }
412402
});
413403

414404
checkReturnBindings(callingSequence, new Binding[] {
@@ -434,13 +424,12 @@ public void testIMR() {
434424

435425
assertTrue(bindings.isInMemoryReturn());
436426
CallingSequence callingSequence = bindings.callingSequence();
437-
assertEquals(callingSequence.callerMethodType(), MethodType.methodType(void.class, MemorySegment.class, MemorySegment.class, long.class));
438-
assertEquals(callingSequence.functionDesc(), FunctionDescriptor.ofVoid(ADDRESS, C_POINTER, C_LONG));
427+
assertEquals(callingSequence.callerMethodType(), MethodType.methodType(void.class, MemorySegment.class, MemorySegment.class));
428+
assertEquals(callingSequence.functionDesc(), FunctionDescriptor.ofVoid(ADDRESS, C_POINTER));
439429

440430
checkArgumentBindings(callingSequence, new Binding[][]{
441431
{ unboxAddress(), vmStore(TARGET_ADDRESS_STORAGE, long.class) },
442-
{ unboxAddress(), vmStore(rdi, long.class) },
443-
{ vmStore(rax, long.class) }
432+
{ unboxAddress(), vmStore(rdi, long.class) }
444433
});
445434

446435
checkReturnBindings(callingSequence, new Binding[] {});

0 commit comments

Comments
 (0)
Please sign in to comment.