1
1
/*
2
- * Copyright (c) 2003, 2020 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2003, 2021 , Oracle and/or its affiliates. All rights reserved.
3
3
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
4
+ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
4
5
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5
6
*
6
7
* This code is free software; you can redistribute it and/or modify it
@@ -57,9 +58,14 @@ FloatRegister InterpreterRuntime::SignatureHandlerGenerator::next_fpr() {
57
58
return fnoreg;
58
59
}
59
60
60
- int InterpreterRuntime::SignatureHandlerGenerator::next_stack_offset () {
61
+ // On macos/aarch64 native stack is packed, int/float are using only 4 bytes
62
+ // on stack. Natural alignment for types are still in place,
63
+ // for example double/long should be 8 bytes aligned.
64
+
65
+ int InterpreterRuntime::SignatureHandlerGenerator::next_stack_offset (unsigned elem_size) {
66
+ MACOS_ONLY (_stack_offset = align_up (_stack_offset, elem_size));
61
67
int ret = _stack_offset;
62
- _stack_offset += wordSize;
68
+ _stack_offset += NOT_MACOS ( wordSize) MACOS_ONLY (elem_size) ;
63
69
return ret;
64
70
}
65
71
@@ -71,6 +77,30 @@ InterpreterRuntime::SignatureHandlerGenerator::SignatureHandlerGenerator(
71
77
_stack_offset = 0 ;
72
78
}
73
79
80
+ void InterpreterRuntime::SignatureHandlerGenerator::pass_byte () {
81
+ const Address src (from (), Interpreter::local_offset_in_bytes (offset ()));
82
+
83
+ Register reg = next_gpr ();
84
+ if (reg != noreg) {
85
+ __ ldr (reg, src);
86
+ } else {
87
+ __ ldrb (r0, src);
88
+ __ strb (r0, Address (to (), next_stack_offset (sizeof (jbyte))));
89
+ }
90
+ }
91
+
92
+ void InterpreterRuntime::SignatureHandlerGenerator::pass_short () {
93
+ const Address src (from (), Interpreter::local_offset_in_bytes (offset ()));
94
+
95
+ Register reg = next_gpr ();
96
+ if (reg != noreg) {
97
+ __ ldr (reg, src);
98
+ } else {
99
+ __ ldrh (r0, src);
100
+ __ strh (r0, Address (to (), next_stack_offset (sizeof (jshort))));
101
+ }
102
+ }
103
+
74
104
void InterpreterRuntime::SignatureHandlerGenerator::pass_int () {
75
105
const Address src (from (), Interpreter::local_offset_in_bytes (offset ()));
76
106
@@ -79,7 +109,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_int() {
79
109
__ ldr (reg, src);
80
110
} else {
81
111
__ ldrw (r0, src);
82
- __ strw (r0, Address (to (), next_stack_offset ()));
112
+ __ strw (r0, Address (to (), next_stack_offset (sizeof (jint) )));
83
113
}
84
114
}
85
115
@@ -91,7 +121,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
91
121
__ ldr (reg, src);
92
122
} else {
93
123
__ ldr (r0, src);
94
- __ str (r0, Address (to (), next_stack_offset ()));
124
+ __ str (r0, Address (to (), next_stack_offset (sizeof (jlong) )));
95
125
}
96
126
}
97
127
@@ -103,7 +133,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
103
133
__ ldrs (reg, src);
104
134
} else {
105
135
__ ldrw (r0, src);
106
- __ strw (r0, Address (to (), next_stack_offset ()));
136
+ __ strw (r0, Address (to (), next_stack_offset (sizeof (jfloat) )));
107
137
}
108
138
}
109
139
@@ -115,7 +145,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_double() {
115
145
__ ldrd (reg, src);
116
146
} else {
117
147
__ ldr (r0, src);
118
- __ str (r0, Address (to (), next_stack_offset ()));
148
+ __ str (r0, Address (to (), next_stack_offset (sizeof (jdouble) )));
119
149
}
120
150
}
121
151
@@ -139,7 +169,8 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
139
169
__ cbnz (temp (), L);
140
170
__ mov (r0, zr);
141
171
__ bind (L);
142
- __ str (r0, Address (to (), next_stack_offset ()));
172
+ static_assert (sizeof (jobject) == wordSize, " " );
173
+ __ str (r0, Address (to (), next_stack_offset (sizeof (jobject))));
143
174
}
144
175
}
145
176
@@ -164,7 +195,7 @@ class SlowSignatureHandler
164
195
: public NativeSignatureIterator {
165
196
private:
166
197
address _from;
167
- intptr_t * _to;
198
+ char * _to;
168
199
intptr_t * _int_args;
169
200
intptr_t * _fp_args;
170
201
intptr_t * _fp_identifiers;
@@ -199,36 +230,53 @@ class SlowSignatureHandler
199
230
return -1 ;
200
231
}
201
232
202
- void pass_stack (intptr_t value) {
203
- *_to++ = value;
233
+ template <typename T>
234
+ void pass_stack (T value) {
235
+ MACOS_ONLY (_to = align_up (_to, sizeof (value)));
236
+ *(T *)_to = value;
237
+ _to += NOT_MACOS (wordSize) MACOS_ONLY (sizeof (value));
238
+ }
239
+
240
+ virtual void pass_byte () {
241
+ jbyte value = *(jbyte*)single_slot_addr ();
242
+ if (pass_gpr (value) < 0 ) {
243
+ pass_stack<>(value);
244
+ }
245
+ }
246
+
247
+ virtual void pass_short () {
248
+ jshort value = *(jshort*)single_slot_addr ();
249
+ if (pass_gpr (value) < 0 ) {
250
+ pass_stack<>(value);
251
+ }
204
252
}
205
253
206
254
virtual void pass_int () {
207
255
jint value = *(jint*)single_slot_addr ();
208
256
if (pass_gpr (value) < 0 ) {
209
- pass_stack (value);
257
+ pass_stack<> (value);
210
258
}
211
259
}
212
260
213
261
virtual void pass_long () {
214
262
intptr_t value = *double_slot_addr ();
215
263
if (pass_gpr (value) < 0 ) {
216
- pass_stack (value);
264
+ pass_stack<> (value);
217
265
}
218
266
}
219
267
220
268
virtual void pass_object () {
221
269
intptr_t * addr = single_slot_addr ();
222
270
intptr_t value = *addr == 0 ? NULL : (intptr_t )addr;
223
271
if (pass_gpr (value) < 0 ) {
224
- pass_stack (value);
272
+ pass_stack<> (value);
225
273
}
226
274
}
227
275
228
276
virtual void pass_float () {
229
277
jint value = *(jint*)single_slot_addr ();
230
278
if (pass_fpr (value) < 0 ) {
231
- pass_stack (value);
279
+ pass_stack<> (value);
232
280
}
233
281
}
234
282
@@ -238,7 +286,7 @@ class SlowSignatureHandler
238
286
if (0 <= arg) {
239
287
*_fp_identifiers |= (1ull << arg); // mark as double
240
288
} else {
241
- pass_stack (value);
289
+ pass_stack<> (value);
242
290
}
243
291
}
244
292
@@ -247,7 +295,7 @@ class SlowSignatureHandler
247
295
: NativeSignatureIterator(method)
248
296
{
249
297
_from = from;
250
- _to = to;
298
+ _to = ( char *) to;
251
299
252
300
_int_args = to - (method->is_static () ? 16 : 17 );
253
301
_fp_args = to - 8 ;
0 commit comments