aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Decoders/OpCodeSimdImm.cs
diff options
context:
space:
mode:
authorLDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com>2019-12-07 13:45:32 +0100
committerAc_K <Acoustik666@gmail.com>2019-12-07 13:45:32 +0100
commit8c85bdf2edf5ebd7965fbbd08106f2e8d877d73e (patch)
tree1f112a5d4a6dc0b4c8882b8151623e006172bb6c /ARMeilleure/Decoders/OpCodeSimdImm.cs
parentd562ba37a0bc603e9719bb36dc9e7e9bf4406687 (diff)
Implemented fast paths for: (#841)
* cpu-misc_opt * B = ~b * ;
Diffstat (limited to 'ARMeilleure/Decoders/OpCodeSimdImm.cs')
-rw-r--r--ARMeilleure/Decoders/OpCodeSimdImm.cs17
1 files changed, 12 insertions, 5 deletions
diff --git a/ARMeilleure/Decoders/OpCodeSimdImm.cs b/ARMeilleure/Decoders/OpCodeSimdImm.cs
index ecad906d..a88e360e 100644
--- a/ARMeilleure/Decoders/OpCodeSimdImm.cs
+++ b/ARMeilleure/Decoders/OpCodeSimdImm.cs
@@ -23,19 +23,19 @@ namespace ARMeilleure.Decoders
if (modeHigh == 0b111)
{
- Size = modeLow != 0 ? op : 3;
-
switch (op | (modeLow << 1))
{
case 0:
// 64-bits Immediate.
// Transform abcd efgh into abcd efgh abcd efgh ...
+ Size = 3;
imm = (long)((ulong)imm * 0x0101010101010101);
break;
case 1:
// 64-bits Immediate.
// Transform abcd efgh into aaaa aaaa bbbb bbbb ...
+ Size = 3;
imm = (imm & 0xf0) >> 4 | (imm & 0x0f) << 4;
imm = (imm & 0xcc) >> 2 | (imm & 0x33) << 2;
imm = (imm & 0xaa) >> 1 | (imm & 0x55) << 1;
@@ -49,9 +49,16 @@ namespace ARMeilleure.Decoders
break;
case 2:
+ // 2 x 32-bits floating point Immediate.
+ Size = 0;
+ imm = (long)DecoderHelper.Imm8ToFP32Table[(int)imm];
+ imm |= imm << 32;
+ break;
+
case 3:
- // Floating point Immediate.
- imm = DecoderHelper.DecodeImm8Float(imm, Size);
+ // 64-bits floating point Immediate.
+ Size = 1;
+ imm = (long)DecoderHelper.Imm8ToFP64Table[(int)imm];
break;
}
}
@@ -72,7 +79,7 @@ namespace ARMeilleure.Decoders
}
else
{
- // 8 bits without shift.
+ // 8-bits without shift.
Size = 0;
}