1 /*
2  * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #ifndef CPU_ARM_C1_LIRASSEMBLER_ARM_HPP
26 #define CPU_ARM_C1_LIRASSEMBLER_ARM_HPP
27 
28  private:
29 
30   // Record the type of the receiver in ReceiverTypeData
31   void type_profile_helper(Register mdo, int mdo_offset_bias,
32                            ciMethodData *md, ciProfileData *data,
33                            Register recv, Register tmp1, Label* update_done);
34   // Setup pointers to MDO, MDO slot, also compute offset bias to access the slot.
35   void setup_md_access(ciMethod* method, int bci,
36                        ciMethodData*& md, ciProfileData*& data, int& mdo_offset_bias);
37 
38   void typecheck_profile_helper1(ciMethod* method, int bci,
39                                  ciMethodData*& md, ciProfileData*& data, int& mdo_offset_bias,
40                                  Register obj, Register mdo, Register data_val, Label* obj_is_null);
41 
42   void typecheck_profile_helper2(ciMethodData* md, ciProfileData* data, int mdo_offset_bias,
43                                  Register mdo, Register recv, Register value, Register tmp1,
44                                  Label* profile_cast_success, Label* profile_cast_failure,
45                                  Label* success, Label* failure);
46 
47 
48   // Saves 4 given registers in reserved argument area.
49   void save_in_reserved_area(Register r1, Register r2, Register r3, Register r4);
50 
51   // Restores 4 given registers from reserved argument area.
52   void restore_from_reserved_area(Register r1, Register r2, Register r3, Register r4);
53 
54   enum {
55     _call_stub_size = 16,
56     _call_aot_stub_size = 0,
57     _exception_handler_size = PRODUCT_ONLY(68) NOT_PRODUCT(68+60),
58     _deopt_handler_size = 16
59   };
60 
61  public:
62 
63   void verify_reserved_argument_area_size(int args_count) PRODUCT_RETURN;
64 
65   void store_parameter(jint c,      int offset_from_sp_in_words);
66   void store_parameter(Metadata* m, int offset_from_sp_in_words);
67 
68 #endif // CPU_ARM_C1_LIRASSEMBLER_ARM_HPP
69