1 /*
  2  * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
  3  * Copyright (c) 2014, Red Hat Inc. All rights reserved.
  4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  5  *
  6  * This code is free software; you can redistribute it and/or modify it
  7  * under the terms of the GNU General Public License version 2 only, as
  8  * published by the Free Software Foundation.
  9  *
 10  * This code is distributed in the hope that it will be useful, but WITHOUT
 11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 13  * version 2 for more details (a copy is included in the LICENSE file that
 14  * accompanied this code).
 15  *
 16  * You should have received a copy of the GNU General Public License version
 17  * 2 along with this work; if not, write to the Free Software Foundation,
 18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 19  *
 20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 21  * or visit www.oracle.com if you need additional information or have any
 22  * questions.
 23  *
 24  */
 25 
 26 #ifndef CPU_AARCH64_STUBROUTINES_AARCH64_HPP
 27 #define CPU_AARCH64_STUBROUTINES_AARCH64_HPP
 28 
 29 // This file holds the platform specific parts of the StubRoutines
 30 // definition. See stubRoutines.hpp for a description on how to
 31 // extend it.
 32 
 33 static bool    returns_to_call_stub(address return_pc)   {
 34   return return_pc == _call_stub_return_address;
 35 }
 36 
 37 enum platform_dependent_constants {
 38   code_size1 = 19000,          // simply increase if too small (assembler will crash if too small)
 39   code_size2 = 45000           // simply increase if too small (assembler will crash if too small)
 40 };
 41 
 42 class aarch64 {
 43  friend class StubGenerator;
 44 
 45  private:
 46   static address _get_previous_sp_entry;
 47 
 48   static address _f2i_fixup;
 49   static address _f2l_fixup;
 50   static address _d2i_fixup;
 51   static address _d2l_fixup;
 52 
 53   static address _vector_iota_indices;
 54   static address _float_sign_mask;
 55   static address _float_sign_flip;
 56   static address _double_sign_mask;
 57   static address _double_sign_flip;
 58 
 59   static address _zero_blocks;
 60 
 61   static address _has_negatives;
 62   static address _has_negatives_long;
 63   static address _large_array_equals;
 64   static address _compare_long_string_LL;
 65   static address _compare_long_string_LU;
 66   static address _compare_long_string_UL;
 67   static address _compare_long_string_UU;
 68   static address _string_indexof_linear_ll;
 69   static address _string_indexof_linear_uu;
 70   static address _string_indexof_linear_ul;
 71   static address _large_byte_array_inflate;
 72 
 73   static address _method_entry_barrier;
 74 
 75   static address _check_lock_stack;
 76 
 77   static address _spin_wait;
 78 
 79   static bool _completed;
 80 
 81  public:
 82 
 83   static address get_previous_sp_entry()
 84   {
 85     return _get_previous_sp_entry;
 86   }
 87 
 88   static address f2i_fixup()
 89   {
 90     return _f2i_fixup;
 91   }
 92 
 93   static address f2l_fixup()
 94   {
 95     return _f2l_fixup;
 96   }
 97 
 98   static address d2i_fixup()
 99   {
100     return _d2i_fixup;
101   }
102 
103   static address d2l_fixup()
104   {
105     return _d2l_fixup;
106   }
107 
108   static address vector_iota_indices() {
109     return _vector_iota_indices;
110   }
111 
112   static address float_sign_mask()
113   {
114     return _float_sign_mask;
115   }
116 
117   static address float_sign_flip()
118   {
119     return _float_sign_flip;
120   }
121 
122   static address double_sign_mask()
123   {
124     return _double_sign_mask;
125   }
126 
127   static address double_sign_flip()
128   {
129     return _double_sign_flip;
130   }
131 
132   static address zero_blocks() {
133     return _zero_blocks;
134   }
135 
136   static address has_negatives() {
137     return _has_negatives;
138   }
139 
140   static address has_negatives_long() {
141       return _has_negatives_long;
142   }
143 
144   static address large_array_equals() {
145       return _large_array_equals;
146   }
147 
148   static address compare_long_string_LL() {
149       return _compare_long_string_LL;
150   }
151 
152   static address compare_long_string_LU() {
153       return _compare_long_string_LU;
154   }
155 
156   static address compare_long_string_UL() {
157       return _compare_long_string_UL;
158   }
159 
160   static address compare_long_string_UU() {
161       return _compare_long_string_UU;
162   }
163 
164   static address string_indexof_linear_ul() {
165       return _string_indexof_linear_ul;
166   }
167 
168   static address string_indexof_linear_ll() {
169       return _string_indexof_linear_ll;
170   }
171 
172   static address string_indexof_linear_uu() {
173       return _string_indexof_linear_uu;
174   }
175 
176   static address large_byte_array_inflate() {
177       return _large_byte_array_inflate;
178   }
179 
180   static address method_entry_barrier() {
181     return _method_entry_barrier;
182   }
183 
184   static address check_lock_stack() {
185     return _check_lock_stack;
186   }
187 
188   static address spin_wait() {
189     return _spin_wait;
190   }
191 
192   static bool complete() {
193     return _completed;
194   }
195 
196   static void set_completed() {
197     _completed = true;
198   }
199 
200 private:
201   static juint    _crc_table[];
202   static jubyte   _adler_table[];
203   // begin trigonometric tables block. See comments in .cpp file
204   static juint    _npio2_hw[];
205   static jdouble   _two_over_pi[];
206   static jdouble   _pio2[];
207   static jdouble   _dsin_coef[];
208   static jdouble  _dcos_coef[];
209   // end trigonometric tables block
210 };
211 
212 #endif // CPU_AARCH64_STUBROUTINES_AARCH64_HPP