|
@@ -1148,62 +1148,52 @@ namespace ARMeilleure.CodeGen.X86
|
|
|
|
|
|
|
|
byte index = src2.AsByte();
|
|
byte index = src2.AsByte();
|
|
|
|
|
|
|
|
|
|
+ Debug.Assert(index < OperandType.V128.GetSizeInBytes() / dest.Type.GetSizeInBytes());
|
|
|
|
|
+
|
|
|
if (dest.Type == OperandType.I32)
|
|
if (dest.Type == OperandType.I32)
|
|
|
{
|
|
{
|
|
|
- Debug.Assert(index < 4);
|
|
|
|
|
-
|
|
|
|
|
- if (HardwareCapabilities.SupportsSse41)
|
|
|
|
|
|
|
+ if (index == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ context.Assembler.Movd(dest, src1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (HardwareCapabilities.SupportsSse41)
|
|
|
{
|
|
{
|
|
|
context.Assembler.Pextrd(dest, src1, index);
|
|
context.Assembler.Pextrd(dest, src1, index);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- if (index != 0)
|
|
|
|
|
- {
|
|
|
|
|
- int mask0 = 0b11_10_01_00;
|
|
|
|
|
- int mask1 = 0b11_10_01_00;
|
|
|
|
|
|
|
+ int mask0 = 0b11_10_01_00;
|
|
|
|
|
+ int mask1 = 0b11_10_01_00;
|
|
|
|
|
|
|
|
- mask0 = BitUtils.RotateRight(mask0, index * 2, 8);
|
|
|
|
|
- mask1 = BitUtils.RotateRight(mask1, 8 - index * 2, 8);
|
|
|
|
|
|
|
+ mask0 = BitUtils.RotateRight(mask0, index * 2, 8);
|
|
|
|
|
+ mask1 = BitUtils.RotateRight(mask1, 8 - index * 2, 8);
|
|
|
|
|
|
|
|
- context.Assembler.Pshufd(src1, src1, (byte)mask0);
|
|
|
|
|
- context.Assembler.Movd (dest, src1);
|
|
|
|
|
- context.Assembler.Pshufd(src1, src1, (byte)mask1);
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- context.Assembler.Movd(dest, src1);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ context.Assembler.Pshufd(src1, src1, (byte)mask0);
|
|
|
|
|
+ context.Assembler.Movd (dest, src1);
|
|
|
|
|
+ context.Assembler.Pshufd(src1, src1, (byte)mask1);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
else if (dest.Type == OperandType.I64)
|
|
else if (dest.Type == OperandType.I64)
|
|
|
{
|
|
{
|
|
|
- Debug.Assert(index < 2);
|
|
|
|
|
-
|
|
|
|
|
- if (HardwareCapabilities.SupportsSse41)
|
|
|
|
|
|
|
+ if (index == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ context.Assembler.Movq(dest, src1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (HardwareCapabilities.SupportsSse41)
|
|
|
{
|
|
{
|
|
|
context.Assembler.Pextrq(dest, src1, index);
|
|
context.Assembler.Pextrq(dest, src1, index);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- if (index != 0)
|
|
|
|
|
- {
|
|
|
|
|
- const byte mask = 0b01_00_11_10;
|
|
|
|
|
|
|
+ const byte mask = 0b01_00_11_10;
|
|
|
|
|
|
|
|
- context.Assembler.Pshufd(src1, src1, mask);
|
|
|
|
|
- context.Assembler.Movq (dest, src1);
|
|
|
|
|
- context.Assembler.Pshufd(src1, src1, mask);
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- context.Assembler.Movq(dest, src1);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ context.Assembler.Pshufd(src1, src1, mask);
|
|
|
|
|
+ context.Assembler.Movq (dest, src1);
|
|
|
|
|
+ context.Assembler.Pshufd(src1, src1, mask);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- Debug.Assert(index < (dest.Type == OperandType.FP32 ? 4 : 2));
|
|
|
|
|
-
|
|
|
|
|
// Floating-point types.
|
|
// Floating-point types.
|
|
|
if ((index >= 2 && dest.Type == OperandType.FP32) ||
|
|
if ((index >= 2 && dest.Type == OperandType.FP32) ||
|
|
|
(index == 1 && dest.Type == OperandType.FP64))
|
|
(index == 1 && dest.Type == OperandType.FP64))
|