11/*
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.
33 * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
4+ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
45 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
56 *
67 * This code is free software; you can redistribute it and/or modify it
@@ -57,9 +58,14 @@ FloatRegister InterpreterRuntime::SignatureHandlerGenerator::next_fpr() {
5758 return fnoreg;
5859}
5960
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));
6167 int ret = _stack_offset;
62- _stack_offset += wordSize;
68+ _stack_offset += NOT_MACOS ( wordSize) MACOS_ONLY (elem_size) ;
6369 return ret;
6470}
6571
@@ -71,6 +77,30 @@ InterpreterRuntime::SignatureHandlerGenerator::SignatureHandlerGenerator(
7177 _stack_offset = 0 ;
7278}
7379
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+
74104void InterpreterRuntime::SignatureHandlerGenerator::pass_int () {
75105 const Address src (from (), Interpreter::local_offset_in_bytes (offset ()));
76106
@@ -79,7 +109,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_int() {
79109 __ ldr (reg, src);
80110 } else {
81111 __ ldrw (r0, src);
82- __ strw (r0, Address (to (), next_stack_offset ()));
112+ __ strw (r0, Address (to (), next_stack_offset (sizeof (jint) )));
83113 }
84114}
85115
@@ -91,7 +121,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
91121 __ ldr (reg, src);
92122 } else {
93123 __ ldr (r0, src);
94- __ str (r0, Address (to (), next_stack_offset ()));
124+ __ str (r0, Address (to (), next_stack_offset (sizeof (jlong) )));
95125 }
96126}
97127
@@ -103,7 +133,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
103133 __ ldrs (reg, src);
104134 } else {
105135 __ ldrw (r0, src);
106- __ strw (r0, Address (to (), next_stack_offset ()));
136+ __ strw (r0, Address (to (), next_stack_offset (sizeof (jfloat) )));
107137 }
108138}
109139
@@ -115,7 +145,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_double() {
115145 __ ldrd (reg, src);
116146 } else {
117147 __ ldr (r0, src);
118- __ str (r0, Address (to (), next_stack_offset ()));
148+ __ str (r0, Address (to (), next_stack_offset (sizeof (jdouble) )));
119149 }
120150}
121151
@@ -139,7 +169,8 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
139169 __ cbnz (temp (), L);
140170 __ mov (r0, zr);
141171 __ 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))));
143174 }
144175}
145176
@@ -164,7 +195,7 @@ class SlowSignatureHandler
164195 : public NativeSignatureIterator {
165196 private:
166197 address _from;
167- intptr_t * _to;
198+ char * _to;
168199 intptr_t * _int_args;
169200 intptr_t * _fp_args;
170201 intptr_t * _fp_identifiers;
@@ -199,36 +230,53 @@ class SlowSignatureHandler
199230 return -1 ;
200231 }
201232
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+ }
204252 }
205253
206254 virtual void pass_int () {
207255 jint value = *(jint*)single_slot_addr ();
208256 if (pass_gpr (value) < 0 ) {
209- pass_stack (value);
257+ pass_stack<> (value);
210258 }
211259 }
212260
213261 virtual void pass_long () {
214262 intptr_t value = *double_slot_addr ();
215263 if (pass_gpr (value) < 0 ) {
216- pass_stack (value);
264+ pass_stack<> (value);
217265 }
218266 }
219267
220268 virtual void pass_object () {
221269 intptr_t * addr = single_slot_addr ();
222270 intptr_t value = *addr == 0 ? NULL : (intptr_t )addr;
223271 if (pass_gpr (value) < 0 ) {
224- pass_stack (value);
272+ pass_stack<> (value);
225273 }
226274 }
227275
228276 virtual void pass_float () {
229277 jint value = *(jint*)single_slot_addr ();
230278 if (pass_fpr (value) < 0 ) {
231- pass_stack (value);
279+ pass_stack<> (value);
232280 }
233281 }
234282
@@ -238,7 +286,7 @@ class SlowSignatureHandler
238286 if (0 <= arg) {
239287 *_fp_identifiers |= (1ull << arg); // mark as double
240288 } else {
241- pass_stack (value);
289+ pass_stack<> (value);
242290 }
243291 }
244292
@@ -247,7 +295,7 @@ class SlowSignatureHandler
247295 : NativeSignatureIterator(method)
248296 {
249297 _from = from;
250- _to = to;
298+ _to = ( char *) to;
251299
252300 _int_args = to - (method->is_static () ? 16 : 17 );
253301 _fp_args = to - 8 ;
0 commit comments