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