1 /*
2  * Copyright (c) 2009, 2016, 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 package jdk.vm.ci.code;
24 
25 import static jdk.vm.ci.meta.MetaUtil.identityHashCodeString;
26 
27 import jdk.vm.ci.meta.JavaKind;
28 
29 /**
30  * Represents the target machine for a compiler, including the CPU architecture, the size of
31  * pointers and references, alignment of stacks, caches, etc.
32  */
33 public class TargetDescription {
34 
35     public final Architecture arch;
36 
37     /**
38      * Specifies if this is a multi-processor system.
39      */
40     public final boolean isMP;
41 
42     /**
43      * Specifies if this target supports encoding objects inline in the machine code.
44      */
45     public final boolean inlineObjects;
46 
47     /**
48      * The machine word size on this target.
49      */
50     public final int wordSize;
51 
52     /**
53      * The {@link JavaKind} to be used for representing raw pointers and CPU registers in Java code.
54      */
55     public final JavaKind wordJavaKind;
56 
57     /**
58      * The stack alignment requirement of the platform. For example, from Appendix D of
59      * <a href="http://www.intel.com/Assets/PDF/manual/248966.pdf">Intel 64 and IA-32 Architectures
60      * Optimization Reference Manual</a>:
61      *
62      * <pre>
63      *     "It is important to ensure that the stack frame is aligned to a
64      *      16-byte boundary upon function entry to keep local __m128 data,
65      *      parameters, and XMM register spill locations aligned throughout
66      *      a function invocation."
67      * </pre>
68      */
69     public final int stackAlignment;
70 
71     /**
72      * Maximum constant displacement at which a memory access can no longer be an implicit null
73      * check.
74      */
75     public final int implicitNullCheckLimit;
76 
TargetDescription(Architecture arch, boolean isMP, int stackAlignment, int implicitNullCheckLimit, boolean inlineObjects)77     public TargetDescription(Architecture arch, boolean isMP, int stackAlignment, int implicitNullCheckLimit, boolean inlineObjects) {
78         this.arch = arch;
79         this.isMP = isMP;
80         this.wordSize = arch.getWordSize();
81         this.wordJavaKind = JavaKind.fromWordSize(wordSize);
82         this.stackAlignment = stackAlignment;
83         this.implicitNullCheckLimit = implicitNullCheckLimit;
84         this.inlineObjects = inlineObjects;
85 
86         assert arch.getPlatformKind(wordJavaKind).equals(arch.getWordKind());
87     }
88 
89     @Override
hashCode()90     public final int hashCode() {
91         throw new UnsupportedOperationException();
92     }
93 
94     @Override
equals(Object obj)95     public final boolean equals(Object obj) {
96         if (this == obj) {
97             return true;
98         }
99         if (obj instanceof TargetDescription) {
100             TargetDescription that = (TargetDescription) obj;
101             // @formatter:off
102             if (this.implicitNullCheckLimit == that.implicitNullCheckLimit &&
103                 this.inlineObjects == that.inlineObjects &&
104                 this.isMP == that.isMP &&
105                 this.stackAlignment == that.stackAlignment &&
106                 this.wordJavaKind.equals(that.wordJavaKind) &&
107                 this.wordSize == that.wordSize &&
108                 this.arch.equals(that.arch)) {
109                 return true;
110             }
111             // @formatter:on
112         }
113         return false;
114     }
115 
116     @Override
toString()117     public String toString() {
118         return identityHashCodeString(this);
119     }
120 }
121