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 _spin_wait;
 76 
 77   static bool _completed;
 78 
 79  public:
 80 
 81   static address get_previous_sp_entry()
 82   {
 83     return _get_previous_sp_entry;
 84   }
 85 
 86   static address f2i_fixup()
 87   {
 88     return _f2i_fixup;
 89   }
 90 
 91   static address f2l_fixup()
 92   {
 93     return _f2l_fixup;
 94   }
 95 
 96   static address d2i_fixup()
 97   {
 98     return _d2i_fixup;
 99   }
100 
101   static address d2l_fixup()
102   {
103     return _d2l_fixup;
104   }
105 
106   static address vector_iota_indices() {
107     return _vector_iota_indices;
108   }
109 
110   static address float_sign_mask()
111   {
112     return _float_sign_mask;
113   }
114 
115   static address float_sign_flip()
116   {
117     return _float_sign_flip;
118   }
119 
120   static address double_sign_mask()
121   {
122     return _double_sign_mask;
123   }
124 
125   static address double_sign_flip()
126   {
127     return _double_sign_flip;
128   }
129 
130   static address zero_blocks() {
131     return _zero_blocks;
132   }
133 
134   static address has_negatives() {
135     return _has_negatives;
136   }
137 
138   static address has_negatives_long() {
139       return _has_negatives_long;
140   }
141 
142   static address large_array_equals() {
143       return _large_array_equals;
144   }
145 
146   static address compare_long_string_LL() {
147       return _compare_long_string_LL;
148   }
149 
150   static address compare_long_string_LU() {
151       return _compare_long_string_LU;
152   }
153 
154   static address compare_long_string_UL() {
155       return _compare_long_string_UL;
156   }
157 
158   static address compare_long_string_UU() {
159       return _compare_long_string_UU;
160   }
161 
162   static address string_indexof_linear_ul() {
163       return _string_indexof_linear_ul;
164   }
165 
166   static address string_indexof_linear_ll() {
167       return _string_indexof_linear_ll;
168   }
169 
170   static address string_indexof_linear_uu() {
171       return _string_indexof_linear_uu;
172   }
173 
174   static address large_byte_array_inflate() {
175       return _large_byte_array_inflate;
176   }
177 
178   static address method_entry_barrier() {
179     return _method_entry_barrier;
180   }
181 
182   static address spin_wait() {
183     return _spin_wait;
184   }
185 
186   static bool complete() {
187     return _completed;
188   }
189 
190   static void set_completed() {
191     _completed = true;
192   }
193 
194 private:
195   static juint    _crc_table[];
196   static jubyte   _adler_table[];
197   // begin trigonometric tables block. See comments in .cpp file
198   static juint    _npio2_hw[];
199   static jdouble   _two_over_pi[];
200   static jdouble   _pio2[];
201   static jdouble   _dsin_coef[];
202   static jdouble  _dcos_coef[];
203   // end trigonometric tables block
204 };
205 
206 #endif // CPU_AARCH64_STUBROUTINES_AARCH64_HPP