199 int disp() { return _disp; } |
201 int disp() { return _disp; } |
200 // creation |
202 // creation |
201 Address() |
203 Address() |
202 : _base(noreg), |
204 : _base(noreg), |
203 _index(noreg), |
205 _index(noreg), |
|
206 _xmmindex(xnoreg), |
204 _scale(no_scale), |
207 _scale(no_scale), |
205 _disp(0) { |
208 _disp(0), |
|
209 _isxmmindex(false){ |
206 } |
210 } |
207 |
211 |
208 // No default displacement otherwise Register can be implicitly |
212 // No default displacement otherwise Register can be implicitly |
209 // converted to 0(Register) which is quite a different animal. |
213 // converted to 0(Register) which is quite a different animal. |
210 |
214 |
211 Address(Register base, int disp) |
215 Address(Register base, int disp) |
212 : _base(base), |
216 : _base(base), |
213 _index(noreg), |
217 _index(noreg), |
|
218 _xmmindex(xnoreg), |
214 _scale(no_scale), |
219 _scale(no_scale), |
215 _disp(disp) { |
220 _disp(disp), |
|
221 _isxmmindex(false){ |
216 } |
222 } |
217 |
223 |
218 Address(Register base, Register index, ScaleFactor scale, int disp = 0) |
224 Address(Register base, Register index, ScaleFactor scale, int disp = 0) |
219 : _base (base), |
225 : _base (base), |
220 _index(index), |
226 _index(index), |
|
227 _xmmindex(xnoreg), |
221 _scale(scale), |
228 _scale(scale), |
222 _disp (disp) { |
229 _disp (disp), |
|
230 _isxmmindex(false) { |
223 assert(!index->is_valid() == (scale == Address::no_scale), |
231 assert(!index->is_valid() == (scale == Address::no_scale), |
224 "inconsistent address"); |
232 "inconsistent address"); |
225 } |
233 } |
226 |
234 |
227 Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0) |
235 Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0) |
228 : _base (base), |
236 : _base (base), |
229 _index(index.register_or_noreg()), |
237 _index(index.register_or_noreg()), |
|
238 _xmmindex(xnoreg), |
230 _scale(scale), |
239 _scale(scale), |
231 _disp (disp + (index.constant_or_zero() * scale_size(scale))) { |
240 _disp (disp + (index.constant_or_zero() * scale_size(scale))), |
|
241 _isxmmindex(false){ |
232 if (!index.is_register()) scale = Address::no_scale; |
242 if (!index.is_register()) scale = Address::no_scale; |
233 assert(!_index->is_valid() == (scale == Address::no_scale), |
243 assert(!_index->is_valid() == (scale == Address::no_scale), |
234 "inconsistent address"); |
244 "inconsistent address"); |
|
245 } |
|
246 |
|
247 Address(Register base, XMMRegister index, ScaleFactor scale, int disp = 0) |
|
248 : _base (base), |
|
249 _index(noreg), |
|
250 _xmmindex(index), |
|
251 _scale(scale), |
|
252 _disp(disp), |
|
253 _isxmmindex(true) { |
|
254 assert(!index->is_valid() == (scale == Address::no_scale), |
|
255 "inconsistent address"); |
235 } |
256 } |
236 |
257 |
237 Address plus_disp(int disp) const { |
258 Address plus_disp(int disp) const { |
238 Address a = (*this); |
259 Address a = (*this); |
239 a._disp += disp; |
260 a._disp += disp; |
267 |
288 |
268 #ifdef ASSERT |
289 #ifdef ASSERT |
269 Address(Register base, ByteSize disp) |
290 Address(Register base, ByteSize disp) |
270 : _base(base), |
291 : _base(base), |
271 _index(noreg), |
292 _index(noreg), |
|
293 _xmmindex(xnoreg), |
272 _scale(no_scale), |
294 _scale(no_scale), |
273 _disp(in_bytes(disp)) { |
295 _disp(in_bytes(disp)), |
|
296 _isxmmindex(false){ |
274 } |
297 } |
275 |
298 |
276 Address(Register base, Register index, ScaleFactor scale, ByteSize disp) |
299 Address(Register base, Register index, ScaleFactor scale, ByteSize disp) |
277 : _base(base), |
300 : _base(base), |
278 _index(index), |
301 _index(index), |
|
302 _xmmindex(xnoreg), |
279 _scale(scale), |
303 _scale(scale), |
280 _disp(in_bytes(disp)) { |
304 _disp(in_bytes(disp)), |
|
305 _isxmmindex(false){ |
281 assert(!index->is_valid() == (scale == Address::no_scale), |
306 assert(!index->is_valid() == (scale == Address::no_scale), |
282 "inconsistent address"); |
307 "inconsistent address"); |
283 } |
308 } |
284 |
|
285 Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp) |
309 Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp) |
286 : _base (base), |
310 : _base (base), |
287 _index(index.register_or_noreg()), |
311 _index(index.register_or_noreg()), |
|
312 _xmmindex(xnoreg), |
288 _scale(scale), |
313 _scale(scale), |
289 _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))) { |
314 _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))), |
|
315 _isxmmindex(false) { |
290 if (!index.is_register()) scale = Address::no_scale; |
316 if (!index.is_register()) scale = Address::no_scale; |
291 assert(!_index->is_valid() == (scale == Address::no_scale), |
317 assert(!_index->is_valid() == (scale == Address::no_scale), |
292 "inconsistent address"); |
318 "inconsistent address"); |
293 } |
319 } |
294 |
320 |
296 |
322 |
297 // accessors |
323 // accessors |
298 bool uses(Register reg) const { return _base == reg || _index == reg; } |
324 bool uses(Register reg) const { return _base == reg || _index == reg; } |
299 Register base() const { return _base; } |
325 Register base() const { return _base; } |
300 Register index() const { return _index; } |
326 Register index() const { return _index; } |
|
327 XMMRegister xmmindex() const { return _xmmindex; } |
301 ScaleFactor scale() const { return _scale; } |
328 ScaleFactor scale() const { return _scale; } |
302 int disp() const { return _disp; } |
329 int disp() const { return _disp; } |
|
330 bool isxmmindex() const { return _isxmmindex; } |
303 |
331 |
304 // Convert the raw encoding form into the form expected by the constructor for |
332 // Convert the raw encoding form into the form expected by the constructor for |
305 // Address. An index of 4 (rsp) corresponds to having no index, so convert |
333 // Address. An index of 4 (rsp) corresponds to having no index, so convert |
306 // that to noreg for the Address constructor. |
334 // that to noreg for the Address constructor. |
307 static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc); |
335 static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc); |
313 return _base != noreg && _base->encoding() >= 8; |
341 return _base != noreg && _base->encoding() >= 8; |
314 } |
342 } |
315 |
343 |
316 bool index_needs_rex() const { |
344 bool index_needs_rex() const { |
317 return _index != noreg &&_index->encoding() >= 8; |
345 return _index != noreg &&_index->encoding() >= 8; |
|
346 } |
|
347 |
|
348 bool xmmindex_needs_rex() const { |
|
349 return _xmmindex != xnoreg && _xmmindex->encoding() >= 8; |
318 } |
350 } |
319 |
351 |
320 relocInfo::relocType reloc() const { return _rspec.type(); } |
352 relocInfo::relocType reloc() const { return _rspec.type(); } |
321 |
353 |
322 friend class Assembler; |
354 friend class Assembler; |
680 void emit_operand(Register reg, |
712 void emit_operand(Register reg, |
681 Register base, Register index, Address::ScaleFactor scale, |
713 Register base, Register index, Address::ScaleFactor scale, |
682 int disp, |
714 int disp, |
683 RelocationHolder const& rspec, |
715 RelocationHolder const& rspec, |
684 int rip_relative_correction = 0); |
716 int rip_relative_correction = 0); |
|
717 |
|
718 void emit_operand(XMMRegister reg, Register base, XMMRegister index, |
|
719 Address::ScaleFactor scale, |
|
720 int disp, RelocationHolder const& rspec); |
685 |
721 |
686 void emit_operand(Register reg, Address adr, int rip_relative_correction = 0); |
722 void emit_operand(Register reg, Address adr, int rip_relative_correction = 0); |
687 |
723 |
688 // operands that only take the original 32bit registers |
724 // operands that only take the original 32bit registers |
689 void emit_operand32(Register reg, Address adr); |
725 void emit_operand32(Register reg, Address adr); |
1552 // Pemutation of 64bit words |
1588 // Pemutation of 64bit words |
1553 void vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len); |
1589 void vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len); |
1554 void vpermq(XMMRegister dst, XMMRegister src, int imm8); |
1590 void vpermq(XMMRegister dst, XMMRegister src, int imm8); |
1555 void vperm2i128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8); |
1591 void vperm2i128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8); |
1556 void vperm2f128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8); |
1592 void vperm2f128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8); |
|
1593 void evpermi2q(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
1557 |
1594 |
1558 void pause(); |
1595 void pause(); |
1559 |
1596 |
1560 // Undefined Instruction |
1597 // Undefined Instruction |
1561 void ud2(); |
1598 void ud2(); |
1618 // SSE4.1 packed move |
1655 // SSE4.1 packed move |
1619 void pmovzxbw(XMMRegister dst, XMMRegister src); |
1656 void pmovzxbw(XMMRegister dst, XMMRegister src); |
1620 void pmovzxbw(XMMRegister dst, Address src); |
1657 void pmovzxbw(XMMRegister dst, Address src); |
1621 |
1658 |
1622 void vpmovzxbw( XMMRegister dst, Address src, int vector_len); |
1659 void vpmovzxbw( XMMRegister dst, Address src, int vector_len); |
|
1660 void vpmovzxbw(XMMRegister dst, XMMRegister src, int vector_len); |
1623 void evpmovzxbw(XMMRegister dst, KRegister mask, Address src, int vector_len); |
1661 void evpmovzxbw(XMMRegister dst, KRegister mask, Address src, int vector_len); |
1624 |
1662 |
1625 void evpmovwb(Address dst, XMMRegister src, int vector_len); |
1663 void evpmovwb(Address dst, XMMRegister src, int vector_len); |
1626 void evpmovwb(Address dst, KRegister mask, XMMRegister src, int vector_len); |
1664 void evpmovwb(Address dst, KRegister mask, XMMRegister src, int vector_len); |
|
1665 |
|
1666 void vpmovzxwd(XMMRegister dst, XMMRegister src, int vector_len); |
|
1667 |
|
1668 void evpmovdb(Address dst, XMMRegister src, int vector_len); |
1627 |
1669 |
1628 #ifndef _LP64 // no 32bit push/pop on amd64 |
1670 #ifndef _LP64 // no 32bit push/pop on amd64 |
1629 void popl(Address dst); |
1671 void popl(Address dst); |
1630 #endif |
1672 #endif |
1631 |
1673 |
2024 void vpsrld(XMMRegister dst, XMMRegister src, int shift, int vector_len); |
2066 void vpsrld(XMMRegister dst, XMMRegister src, int shift, int vector_len); |
2025 void vpsrlq(XMMRegister dst, XMMRegister src, int shift, int vector_len); |
2067 void vpsrlq(XMMRegister dst, XMMRegister src, int shift, int vector_len); |
2026 void vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len); |
2068 void vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len); |
2027 void vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len); |
2069 void vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len); |
2028 void vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len); |
2070 void vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len); |
|
2071 void evpsrlvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
|
2072 void evpsllvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2029 |
2073 |
2030 // Arithmetic shift right packed integers (only shorts and ints, no instructions for longs) |
2074 // Arithmetic shift right packed integers (only shorts and ints, no instructions for longs) |
2031 void psraw(XMMRegister dst, int shift); |
2075 void psraw(XMMRegister dst, int shift); |
2032 void psrad(XMMRegister dst, int shift); |
2076 void psrad(XMMRegister dst, int shift); |
2033 void psraw(XMMRegister dst, XMMRegister shift); |
2077 void psraw(XMMRegister dst, XMMRegister shift); |
2039 |
2083 |
2040 // And packed integers |
2084 // And packed integers |
2041 void pand(XMMRegister dst, XMMRegister src); |
2085 void pand(XMMRegister dst, XMMRegister src); |
2042 void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2086 void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2043 void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len); |
2087 void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len); |
|
2088 void vpandq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2044 |
2089 |
2045 // Andn packed integers |
2090 // Andn packed integers |
2046 void pandn(XMMRegister dst, XMMRegister src); |
2091 void pandn(XMMRegister dst, XMMRegister src); |
2047 |
2092 |
2048 // Or packed integers |
2093 // Or packed integers |
2049 void por(XMMRegister dst, XMMRegister src); |
2094 void por(XMMRegister dst, XMMRegister src); |
2050 void vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2095 void vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2051 void vpor(XMMRegister dst, XMMRegister nds, Address src, int vector_len); |
2096 void vpor(XMMRegister dst, XMMRegister nds, Address src, int vector_len); |
|
2097 void vporq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2052 |
2098 |
2053 // Xor packed integers |
2099 // Xor packed integers |
2054 void pxor(XMMRegister dst, XMMRegister src); |
2100 void pxor(XMMRegister dst, XMMRegister src); |
2055 void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2101 void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len); |
2056 void vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len); |
2102 void vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len); |
2116 // gpr sourced byte/word/dword/qword replicate |
2162 // gpr sourced byte/word/dword/qword replicate |
2117 void evpbroadcastb(XMMRegister dst, Register src, int vector_len); |
2163 void evpbroadcastb(XMMRegister dst, Register src, int vector_len); |
2118 void evpbroadcastw(XMMRegister dst, Register src, int vector_len); |
2164 void evpbroadcastw(XMMRegister dst, Register src, int vector_len); |
2119 void evpbroadcastd(XMMRegister dst, Register src, int vector_len); |
2165 void evpbroadcastd(XMMRegister dst, Register src, int vector_len); |
2120 void evpbroadcastq(XMMRegister dst, Register src, int vector_len); |
2166 void evpbroadcastq(XMMRegister dst, Register src, int vector_len); |
|
2167 |
|
2168 void evpgatherdd(XMMRegister dst, KRegister k1, Address src, int vector_len); |
2121 |
2169 |
2122 // Carry-Less Multiplication Quadword |
2170 // Carry-Less Multiplication Quadword |
2123 void pclmulqdq(XMMRegister dst, XMMRegister src, int mask); |
2171 void pclmulqdq(XMMRegister dst, XMMRegister src, int mask); |
2124 void vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask); |
2172 void vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask); |
2125 void evpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask, int vector_len); |
2173 void evpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask, int vector_len); |