121 public static enum CPUFeature {
122 SSE,
123 SSE2,
124 SSE3,
125 SSE4a,
126 SSE4_1,
127 SSE4_2,
128 SSSE3,
129 POPCNT,
130 LZCNT,
131 AVX,
132 AVX2,
133 ERMS,
134 AMD_3DNOW_PREFETCH,
135 AES,
136 BMI1
137 }
138
139 private final EnumSet<CPUFeature> features;
140
141 public AMD64(EnumSet<CPUFeature> features) {
142 super("AMD64", 8, ByteOrder.LITTLE_ENDIAN, true, allRegisters, LOAD_STORE | STORE_STORE, 1, cpuRegisters.length + (xmmRegisters.length << XMM_REFERENCE_MAP_SHIFT), 8);
143 this.features = features;
144 assert features.contains(CPUFeature.SSE2) : "minimum config for x64";
145 }
146
147 public EnumSet<CPUFeature> getFeatures() {
148 return features;
149 }
150
151 @Override
152 public boolean canStoreValue(RegisterCategory category, PlatformKind platformKind) {
153 if (!(platformKind instanceof Kind)) {
154 return false;
155 }
156
157 Kind kind = (Kind) platformKind;
158 if (category.equals(CPU)) {
159 switch (kind) {
160 case Boolean:
161 case Byte:
162 case Char:
163 case Short:
164 case Int:
165 case Long:
166 case Object:
167 return true;
168 }
169 } else if (category.equals(XMM)) {
170 switch (kind) {
|
121 public static enum CPUFeature {
122 SSE,
123 SSE2,
124 SSE3,
125 SSE4a,
126 SSE4_1,
127 SSE4_2,
128 SSSE3,
129 POPCNT,
130 LZCNT,
131 AVX,
132 AVX2,
133 ERMS,
134 AMD_3DNOW_PREFETCH,
135 AES,
136 BMI1
137 }
138
139 private final EnumSet<CPUFeature> features;
140
141 /**
142 * Set of flags to control code emission.
143 */
144 public static enum Flag {
145 UseCountLeadingZerosInstruction,
146 UseCountTrailingZerosInstruction
147 }
148
149 private final EnumSet<Flag> flags;
150
151 public AMD64(EnumSet<CPUFeature> features, EnumSet<Flag> flags) {
152 super("AMD64", 8, ByteOrder.LITTLE_ENDIAN, true, allRegisters, LOAD_STORE | STORE_STORE, 1, cpuRegisters.length + (xmmRegisters.length << XMM_REFERENCE_MAP_SHIFT), 8);
153 this.features = features;
154 this.flags = flags;
155 assert features.contains(CPUFeature.SSE2) : "minimum config for x64";
156 }
157
158 public EnumSet<CPUFeature> getFeatures() {
159 return features;
160 }
161
162 public EnumSet<Flag> getFlags() {
163 return flags;
164 }
165
166 @Override
167 public boolean canStoreValue(RegisterCategory category, PlatformKind platformKind) {
168 if (!(platformKind instanceof Kind)) {
169 return false;
170 }
171
172 Kind kind = (Kind) platformKind;
173 if (category.equals(CPU)) {
174 switch (kind) {
175 case Boolean:
176 case Byte:
177 case Char:
178 case Short:
179 case Int:
180 case Long:
181 case Object:
182 return true;
183 }
184 } else if (category.equals(XMM)) {
185 switch (kind) {
|