RFR (S): 8151002: Make Assembler methods vextract and vinsert match actual instructions
vladimir.x.ivanov at oracle.com
Wed Mar 2 07:36:04 UTC 2016
Nice cleanup, Mikael!
// Copy low 128bit into high 128bit of YMM registers.
// Load/store high 128bit of YMM registers which does not destroy
// Copy low 256bit into high 256bit of ZMM registers.
! emit_int8(imm8 & 0x01);
Maybe additionally assert valid imm8 range?
Maybe keep vinsert*h variants and move them to MacroAssembler? They look
clearer in some contextes:
- __ vextractf128h(Address(rsp, base_addr+n*16), as_XMMRegister(n));
+ __ vextractf128(Address(rsp, base_addr+n*16), as_XMMRegister(n), 1);
Otherwise, looks good.
On 3/2/16 3:25 AM, Mikael Vidstedt wrote:
> Please review the following change which updates the various vextract*
> and vinsert* methods in assembler_x86 & macroAssembler_x86 to better
> match the real HW instructions, which also has the benefit of providing
> the full functionality/flexibility of the instructions where earlier
> only some specific modes were supported. Put differently, with this
> change it's much easier to correlate the methods to the Intel manual and
> understand what they actually do.
> Specifically, the vinsert* family of instructions take three registers
> and an immediate which decide how the bits should be shuffled around,
> but without this change the method only allowed two of the registers to
> be specified, and the immediate was hard-coded to 0x01.
> Bug: https://bugs.openjdk.java.net/browse/JDK-8151002
> Special thanks to Mike Berg for helping discuss, co-develop, and test
> the change!
More information about the hotspot-compiler-dev