1 /*
2  * Copyright (c) 2008, 2015, 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_VM_REGISTER_ARM_HPP
26 #define CPU_ARM_VM_REGISTER_ARM_HPP
27 
28 #include "asm/register.hpp"
29 #include "vm_version_arm.hpp"
30 
31 class VMRegImpl;
32 typedef VMRegImpl* VMReg;
33 
34 // These are declared ucontext.h
35 #undef R0
36 #undef R1
37 #undef R2
38 #undef R3
39 #undef R4
40 #undef R5
41 #undef R6
42 #undef R7
43 #undef R8
44 #undef R9
45 #undef R10
46 #undef R11
47 #undef R12
48 #undef R13
49 #undef R14
50 #undef R15
51 
52 #define R(r)   ((Register)(r))
53 
54 /////////////////////////////////
55 // Support for different ARM ABIs
56 // Note: default ABI is for linux
57 
58 
59 // R9_IS_SCRATCHED
60 //
61 // The ARM ABI does not guarantee that R9 is callee saved.
62 // Set R9_IS_SCRATCHED to 1 to ensure it is properly saved/restored by
63 // the caller.
64 #ifndef R9_IS_SCRATCHED
65 // Default: R9 is callee saved
66 #define R9_IS_SCRATCHED 0
67 #endif
68 
69 // FP_REG_NUM
70 //
71 // The ARM ABI does not state which register is used for the frame pointer.
72 // Note: for the ABIs we are currently aware of, FP is currently
73 // either R7 or R11. Code may have to be extended if a third register
74 // register must be supported (see altFP_7_11).
75 #ifndef FP_REG_NUM
76 // Default: FP is R11
77 #define FP_REG_NUM 11
78 #endif
79 
80 // ALIGN_WIDE_ARGUMENTS
81 //
82 // The ARM ABI requires 64-bits arguments to be aligned on 4 words
83 // or on even registers. Set ALIGN_WIDE_ARGUMENTS to 1 for that behavior.
84 //
85 // Unfortunately, some platforms do not endorse that part of the ABI.
86 //
87 // We are aware of one which expects 64-bit arguments to only be 4
88 // bytes aligned and can for instance use R3 + a stack slot for such
89 // an argument.
90 //
91 // This is the behavor implemented if (ALIGN_WIDE_ARGUMENTS == 0)
92 #ifndef  ALIGN_WIDE_ARGUMENTS
93 // Default: align on 8 bytes and avoid using <r3+stack>
94 #define ALIGN_WIDE_ARGUMENTS 1
95 #endif
96 
97 #define R0     ((Register)0)
98 #define R1     ((Register)1)
99 #define R2     ((Register)2)
100 #define R3     ((Register)3)
101 #define R4     ((Register)4)
102 #define R5     ((Register)5)
103 #define R6     ((Register)6)
104 #define R7     ((Register)7)
105 #define R8     ((Register)8)
106 #define R9     ((Register)9)
107 #define R10    ((Register)10)
108 #define R11    ((Register)11)
109 #define R12    ((Register)12)
110 #define R13    ((Register)13)
111 #define R14    ((Register)14)
112 #define R15    ((Register)15)
113 
114 
115 #define FP     ((Register)FP_REG_NUM)
116 
117 // Safe use of registers which may be FP on some platforms.
118 //
119 // altFP_7_11: R7 if not equal to FP, else R11 (the default FP)
120 //
121 // Note: add additional altFP_#_11 for each register potentially used
122 // as FP on supported ABIs (and replace R# by altFP_#_11). altFP_#_11
123 // must be #define to R11 if and only if # is FP_REG_NUM.
124 #if (FP_REG_NUM == 7)
125 #define altFP_7_11     ((Register)11)
126 #else
127 #define altFP_7_11     ((Register)7)
128 #endif
129 #define SP     R13
130 #define LR     R14
131 #define PC     R15
132 
133 
134 
135 class RegisterImpl;
136 typedef RegisterImpl* Register;
137 
as_Register(int encoding)138 inline Register as_Register(int encoding) {
139   return (Register)(intptr_t)encoding;
140 }
141 
142 class RegisterImpl : public AbstractRegisterImpl {
143  public:
144   enum {
145     number_of_registers = 16
146   };
147 
successor() const148   Register successor() const      { return as_Register(encoding() + 1); }
149 
150   inline friend Register as_Register(int encoding);
151 
152   VMReg as_VMReg();
153 
154   // accessors
encoding() const155   int   encoding() const          { assert(is_valid(), "invalid register"); return value(); }
156   const char* name() const;
157 
158 
159   // testers
is_valid() const160   bool is_valid() const           { return 0 <= value() && value() < number_of_registers; }
161 
162 };
163 
164 CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1));
165 
166 
167 // Use FloatRegister as shortcut
168 class FloatRegisterImpl;
169 typedef FloatRegisterImpl* FloatRegister;
170 
as_FloatRegister(int encoding)171 inline FloatRegister as_FloatRegister(int encoding) {
172   return (FloatRegister)(intptr_t)encoding;
173 }
174 
175 class FloatRegisterImpl : public AbstractRegisterImpl {
176  public:
177   enum {
178     number_of_registers = NOT_COMPILER2(32) COMPILER2_PRESENT(64)
179   };
180 
181   inline friend FloatRegister as_FloatRegister(int encoding);
182 
183   VMReg as_VMReg();
184 
encoding() const185   int   encoding() const          { assert(is_valid(), "invalid register"); return value(); }
is_valid() const186   bool  is_valid() const          { return 0 <= (intx)this && (intx)this < number_of_registers; }
successor() const187   FloatRegister successor() const { return as_FloatRegister(encoding() + 1); }
188 
189   const char* name() const;
190 
hi_bits() const191   int hi_bits() const {
192     return (encoding() >> 1) & 0xf;
193   }
194 
lo_bit() const195   int lo_bit() const {
196     return encoding() & 1;
197   }
198 
hi_bit() const199   int hi_bit() const {
200     return encoding() >> 5;
201   }
202 };
203 
204 CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg, (-1));
205 
206 
207 /*
208  * S1-S6 are named with "_reg" suffix to avoid conflict with
209  * constants defined in sharedRuntimeTrig.cpp
210  */
211 CONSTANT_REGISTER_DECLARATION(FloatRegister, S0,     ( 0));
212 CONSTANT_REGISTER_DECLARATION(FloatRegister, S1_reg, ( 1));
213 CONSTANT_REGISTER_DECLARATION(FloatRegister, S2_reg, ( 2));
214 CONSTANT_REGISTER_DECLARATION(FloatRegister, S3_reg, ( 3));
215 CONSTANT_REGISTER_DECLARATION(FloatRegister, S4_reg, ( 4));
216 CONSTANT_REGISTER_DECLARATION(FloatRegister, S5_reg, ( 5));
217 CONSTANT_REGISTER_DECLARATION(FloatRegister, S6_reg, ( 6));
218 CONSTANT_REGISTER_DECLARATION(FloatRegister, S7,     ( 7));
219 CONSTANT_REGISTER_DECLARATION(FloatRegister, S8,     ( 8));
220 CONSTANT_REGISTER_DECLARATION(FloatRegister, S9,     ( 9));
221 CONSTANT_REGISTER_DECLARATION(FloatRegister, S10,    (10));
222 CONSTANT_REGISTER_DECLARATION(FloatRegister, S11,    (11));
223 CONSTANT_REGISTER_DECLARATION(FloatRegister, S12,    (12));
224 CONSTANT_REGISTER_DECLARATION(FloatRegister, S13,    (13));
225 CONSTANT_REGISTER_DECLARATION(FloatRegister, S14,    (14));
226 CONSTANT_REGISTER_DECLARATION(FloatRegister, S15,    (15));
227 CONSTANT_REGISTER_DECLARATION(FloatRegister, S16,    (16));
228 CONSTANT_REGISTER_DECLARATION(FloatRegister, S17,    (17));
229 CONSTANT_REGISTER_DECLARATION(FloatRegister, S18,    (18));
230 CONSTANT_REGISTER_DECLARATION(FloatRegister, S19,    (19));
231 CONSTANT_REGISTER_DECLARATION(FloatRegister, S20,    (20));
232 CONSTANT_REGISTER_DECLARATION(FloatRegister, S21,    (21));
233 CONSTANT_REGISTER_DECLARATION(FloatRegister, S22,    (22));
234 CONSTANT_REGISTER_DECLARATION(FloatRegister, S23,    (23));
235 CONSTANT_REGISTER_DECLARATION(FloatRegister, S24,    (24));
236 CONSTANT_REGISTER_DECLARATION(FloatRegister, S25,    (25));
237 CONSTANT_REGISTER_DECLARATION(FloatRegister, S26,    (26));
238 CONSTANT_REGISTER_DECLARATION(FloatRegister, S27,    (27));
239 CONSTANT_REGISTER_DECLARATION(FloatRegister, S28,    (28));
240 CONSTANT_REGISTER_DECLARATION(FloatRegister, S29,    (29));
241 CONSTANT_REGISTER_DECLARATION(FloatRegister, S30,    (30));
242 CONSTANT_REGISTER_DECLARATION(FloatRegister, S31,    (31));
243 CONSTANT_REGISTER_DECLARATION(FloatRegister, Stemp,  (30));
244 
245 CONSTANT_REGISTER_DECLARATION(FloatRegister, D0,     ( 0));
246 CONSTANT_REGISTER_DECLARATION(FloatRegister, D1,     ( 2));
247 CONSTANT_REGISTER_DECLARATION(FloatRegister, D2,     ( 4));
248 CONSTANT_REGISTER_DECLARATION(FloatRegister, D3,     ( 6));
249 CONSTANT_REGISTER_DECLARATION(FloatRegister, D4,     ( 8));
250 CONSTANT_REGISTER_DECLARATION(FloatRegister, D5,     ( 10));
251 CONSTANT_REGISTER_DECLARATION(FloatRegister, D6,     ( 12));
252 CONSTANT_REGISTER_DECLARATION(FloatRegister, D7,     ( 14));
253 CONSTANT_REGISTER_DECLARATION(FloatRegister, D8,     ( 16));
254 CONSTANT_REGISTER_DECLARATION(FloatRegister, D9,     ( 18));
255 CONSTANT_REGISTER_DECLARATION(FloatRegister, D10,    ( 20));
256 CONSTANT_REGISTER_DECLARATION(FloatRegister, D11,    ( 22));
257 CONSTANT_REGISTER_DECLARATION(FloatRegister, D12,    ( 24));
258 CONSTANT_REGISTER_DECLARATION(FloatRegister, D13,    ( 26));
259 CONSTANT_REGISTER_DECLARATION(FloatRegister, D14,    ( 28));
260 CONSTANT_REGISTER_DECLARATION(FloatRegister, D15,    (30));
261 CONSTANT_REGISTER_DECLARATION(FloatRegister, D16,    (32));
262 CONSTANT_REGISTER_DECLARATION(FloatRegister, D17,    (34));
263 CONSTANT_REGISTER_DECLARATION(FloatRegister, D18,    (36));
264 CONSTANT_REGISTER_DECLARATION(FloatRegister, D19,    (38));
265 CONSTANT_REGISTER_DECLARATION(FloatRegister, D20,    (40));
266 CONSTANT_REGISTER_DECLARATION(FloatRegister, D21,    (42));
267 CONSTANT_REGISTER_DECLARATION(FloatRegister, D22,    (44));
268 CONSTANT_REGISTER_DECLARATION(FloatRegister, D23,    (46));
269 CONSTANT_REGISTER_DECLARATION(FloatRegister, D24,    (48));
270 CONSTANT_REGISTER_DECLARATION(FloatRegister, D25,    (50));
271 CONSTANT_REGISTER_DECLARATION(FloatRegister, D26,    (52));
272 CONSTANT_REGISTER_DECLARATION(FloatRegister, D27,    (54));
273 CONSTANT_REGISTER_DECLARATION(FloatRegister, D28,    (56));
274 CONSTANT_REGISTER_DECLARATION(FloatRegister, D29,    (58));
275 CONSTANT_REGISTER_DECLARATION(FloatRegister, D30,    (60));
276 CONSTANT_REGISTER_DECLARATION(FloatRegister, D31,    (62));
277 
278 
279 class ConcreteRegisterImpl : public AbstractRegisterImpl {
280  public:
281   enum {
282     log_vmregs_per_word = LogBytesPerWord - LogBytesPerInt, // VMRegs are of 4-byte size
283 #ifdef COMPILER2
284     log_bytes_per_fpr  = 2, // quad vectors
285 #else
286     log_bytes_per_fpr  = 2, // double vectors
287 #endif
288     log_words_per_fpr  = log_bytes_per_fpr - LogBytesPerWord,
289     words_per_fpr      = 1 << log_words_per_fpr,
290     log_vmregs_per_fpr = log_bytes_per_fpr - LogBytesPerInt,
291     log_vmregs_per_gpr = log_vmregs_per_word,
292     vmregs_per_gpr = 1 << log_vmregs_per_gpr,
293     vmregs_per_fpr = 1 << log_vmregs_per_fpr,
294 
295     num_gpr  = RegisterImpl::number_of_registers << log_vmregs_per_gpr,
296     max_gpr0 = num_gpr,
297     num_fpr  = FloatRegisterImpl::number_of_registers << log_vmregs_per_fpr,
298     max_fpr0 = max_gpr0 + num_fpr,
299     number_of_registers = num_gpr + num_fpr + 1+1 // APSR and FPSCR so that c2's REG_COUNT <= ConcreteRegisterImpl::number_of_registers
300   };
301 
302   static const int max_gpr;
303   static const int max_fpr;
304 };
305 
306 class VFPSystemRegisterImpl;
307 typedef VFPSystemRegisterImpl* VFPSystemRegister;
308 class VFPSystemRegisterImpl : public AbstractRegisterImpl {
309  public:
encoding() const310   int   encoding() const          { return value(); }
311 };
312 
313 #define FPSID     ((VFPSystemRegister)0)
314 #define FPSCR     ((VFPSystemRegister)1)
315 #define MVFR0     ((VFPSystemRegister)0x6)
316 #define MVFR1     ((VFPSystemRegister)0x7)
317 
318 /*
319  * Register definitions shared across interpreter and compiler
320  */
321 #define Rexception_obj   R4
322 #define Rexception_pc    R5
323 
324 /*
325  * Interpreter register definitions common to C++ and template interpreters.
326  */
327 #define Rlocals          R8
328 #define Rmethod          R9
329 #define Rthread          R10
330 #define Rtemp            R12
331 
332 // Interpreter calling conventions
333 
334 #define Rparams          SP
335 #define Rsender_sp       R4
336 
337 // JSR292
338 //  Note: R5_mh is needed only during the call setup, including adapters
339 //  This does not seem to conflict with Rexception_pc
340 //  In case of issues, R3 might be OK but adapters calling the runtime would have to save it
341 #define R5_mh            R5 // MethodHandle register, used during the call setup
342 #define Rmh_SP_save      FP // for C1
343 
344 /*
345  * C++ Interpreter Register Defines
346  */
347 #define Rsave0   R4
348 #define Rsave1   R5
349 #define Rsave2   R6
350 #define Rstate   altFP_7_11 // R7 or R11
351 #define Ricklass R8
352 
353 /*
354  * TemplateTable Interpreter Register Usage
355  */
356 
357 // Temporary registers
358 #define R0_tmp                 R0
359 #define R1_tmp                 R1
360 #define R2_tmp                 R2
361 #define R3_tmp                 R3
362 #define R4_tmp                 R4
363 #define R5_tmp                 R5
364 #define R12_tmp                R12
365 #define LR_tmp                 LR
366 
367 #define S0_tmp                 S0
368 #define S1_tmp                 S1_reg
369 
370 #define D0_tmp                 D0
371 #define D1_tmp                 D1
372 
373 // Temporary registers saved across VM calls (according to C calling conventions)
374 #define Rtmp_save0             R4
375 #define Rtmp_save1             R5
376 
377 // Cached TOS value
378 #define R0_tos                 R0
379 
380 #define R0_tos_lo              R0
381 #define R1_tos_hi              R1
382 
383 #define S0_tos                 S0
384 #define D0_tos                 D0
385 
386 // Dispatch table
387 #define RdispatchTable         R6
388 
389 // Bytecode pointer
390 #define Rbcp                   altFP_7_11
391 
392 // Pre-loaded next bytecode for the dispatch
393 #define R3_bytecode            R3
394 
395 // Conventions between bytecode templates and stubs
396 #define R2_ClassCastException_obj        R2
397 #define R4_ArrayIndexOutOfBounds_index   R4
398 
399 // Interpreter expression stack top
400 #define Rstack_top             SP
401 
402 /*
403  * Linux 32-bit ARM C ABI Register calling conventions
404  *
405  *   REG         use                     callee/caller saved
406  *
407  *   R0         First argument reg            caller
408  *              result register
409  *   R1         Second argument reg           caller
410  *              result register
411  *   R2         Third argument reg            caller
412  *   R3         Fourth argument reg           caller
413  *
414  *   R4 - R8    Local variable registers      callee
415  *   R9
416  *   R10, R11   Local variable registers      callee
417  *
418  *   R12 (IP)   Scratch register used in inter-procedural calling
419  *   R13 (SP)   Stack Pointer                 callee
420  *   R14 (LR)   Link register
421  *   R15 (PC)   Program Counter
422  */
423 #define c_rarg0  R0
424 #define c_rarg1  R1
425 #define c_rarg2  R2
426 #define c_rarg3  R3
427 
428 
429 #define GPR_PARAMS    4
430 
431 
432 // Java ABI
433 // XXX Is this correct?
434 #define j_rarg0  c_rarg0
435 #define j_rarg1  c_rarg1
436 #define j_rarg2  c_rarg2
437 #define j_rarg3  c_rarg3
438 
439 
440 #endif // CPU_ARM_VM_REGISTER_ARM_HPP
441