1 /*
2  * Copyright (c) 2003, 2011, 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_VM_STUBROUTINES_AARCH64_HPP
27 #define CPU_AARCH64_VM_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 // n.b. if we are notifying entry/exit to the simulator then the call
34 // stub does a notify at normal return placing
35 // call_stub_return_address one instruction beyond the notify. the
36 // latter address is sued by the stack unwind code when doign an
37 // exception return.
returns_to_call_stub(address return_pc)38 static bool    returns_to_call_stub(address return_pc)   {
39   return return_pc == _call_stub_return_address + (NotifySimulator ? -4 : 0);
40 }
41 
42 enum platform_dependent_constants {
43   code_size1 = 19000,          // simply increase if too small (assembler will crash if too small)
44   code_size2 = 28000           // simply increase if too small (assembler will crash if too small)
45 };
46 
47 class aarch64 {
48  friend class StubGenerator;
49 
50  private:
51   static address _get_previous_fp_entry;
52   static address _get_previous_sp_entry;
53 
54   static address _f2i_fixup;
55   static address _f2l_fixup;
56   static address _d2i_fixup;
57   static address _d2l_fixup;
58 
59   static address _float_sign_mask;
60   static address _float_sign_flip;
61   static address _double_sign_mask;
62   static address _double_sign_flip;
63 
64   static address _zero_blocks;
65 
66   static address _has_negatives;
67   static address _has_negatives_long;
68   static address _large_array_equals;
69   static address _compare_long_string_LL;
70   static address _compare_long_string_LU;
71   static address _compare_long_string_UL;
72   static address _compare_long_string_UU;
73   static address _string_indexof_linear_ll;
74   static address _string_indexof_linear_uu;
75   static address _string_indexof_linear_ul;
76   static address _large_byte_array_inflate;
77   static bool _completed;
78 
79  public:
80 
get_previous_fp_entry()81   static address get_previous_fp_entry()
82   {
83     return _get_previous_fp_entry;
84   }
85 
get_previous_sp_entry()86   static address get_previous_sp_entry()
87   {
88     return _get_previous_sp_entry;
89   }
90 
f2i_fixup()91   static address f2i_fixup()
92   {
93     return _f2i_fixup;
94   }
95 
f2l_fixup()96   static address f2l_fixup()
97   {
98     return _f2l_fixup;
99   }
100 
d2i_fixup()101   static address d2i_fixup()
102   {
103     return _d2i_fixup;
104   }
105 
d2l_fixup()106   static address d2l_fixup()
107   {
108     return _d2l_fixup;
109   }
110 
float_sign_mask()111   static address float_sign_mask()
112   {
113     return _float_sign_mask;
114   }
115 
float_sign_flip()116   static address float_sign_flip()
117   {
118     return _float_sign_flip;
119   }
120 
double_sign_mask()121   static address double_sign_mask()
122   {
123     return _double_sign_mask;
124   }
125 
double_sign_flip()126   static address double_sign_flip()
127   {
128     return _double_sign_flip;
129   }
130 
zero_blocks()131   static address zero_blocks() {
132     return _zero_blocks;
133   }
134 
has_negatives()135   static address has_negatives() {
136     return _has_negatives;
137   }
138 
has_negatives_long()139   static address has_negatives_long() {
140       return _has_negatives_long;
141   }
142 
large_array_equals()143   static address large_array_equals() {
144       return _large_array_equals;
145   }
146 
compare_long_string_LL()147   static address compare_long_string_LL() {
148       return _compare_long_string_LL;
149   }
150 
compare_long_string_LU()151   static address compare_long_string_LU() {
152       return _compare_long_string_LU;
153   }
154 
compare_long_string_UL()155   static address compare_long_string_UL() {
156       return _compare_long_string_UL;
157   }
158 
compare_long_string_UU()159   static address compare_long_string_UU() {
160       return _compare_long_string_UU;
161   }
162 
string_indexof_linear_ul()163   static address string_indexof_linear_ul() {
164       return _string_indexof_linear_ul;
165   }
166 
string_indexof_linear_ll()167   static address string_indexof_linear_ll() {
168       return _string_indexof_linear_ll;
169   }
170 
string_indexof_linear_uu()171   static address string_indexof_linear_uu() {
172       return _string_indexof_linear_uu;
173   }
174 
large_byte_array_inflate()175   static address large_byte_array_inflate() {
176       return _large_byte_array_inflate;
177   }
178 
complete()179   static bool complete() {
180     return _completed;
181   }
182 
set_completed()183   static void set_completed() {
184     _completed = true;
185   }
186 
187 private:
188   static juint    _crc_table[];
189   // begin trigonometric tables block. See comments in .cpp file
190   static juint    _npio2_hw[];
191   static jdouble   _two_over_pi[];
192   static jdouble   _pio2[];
193   static jdouble   _dsin_coef[];
194   static jdouble  _dcos_coef[];
195   // end trigonometric tables block
196 };
197 
198 #endif // CPU_AARCH64_VM_STUBROUTINES_AARCH64_HPP
199