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