aboutsummaryrefslogtreecommitdiff
path: root/src/ARMeilleure/CodeGen/X86/Assembler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMeilleure/CodeGen/X86/Assembler.cs')
-rw-r--r--src/ARMeilleure/CodeGen/X86/Assembler.cs67
1 files changed, 44 insertions, 23 deletions
diff --git a/src/ARMeilleure/CodeGen/X86/Assembler.cs b/src/ARMeilleure/CodeGen/X86/Assembler.cs
index 67736a31..55bf0724 100644
--- a/src/ARMeilleure/CodeGen/X86/Assembler.cs
+++ b/src/ARMeilleure/CodeGen/X86/Assembler.cs
@@ -15,7 +15,7 @@ namespace ARMeilleure.CodeGen.X86
private const int OpModRMBits = 24;
- private const byte RexPrefix = 0x40;
+ private const byte RexPrefix = 0x40;
private const byte RexWPrefix = 0x48;
private const byte LockPrefix = 0xf0;
@@ -799,7 +799,7 @@ namespace ARMeilleure.CodeGen.X86
{
JumpIndex = _jumps.Count - 1,
Position = (int)_stream.Position,
- Symbol = source.Symbol
+ Symbol = source.Symbol,
});
}
@@ -959,7 +959,7 @@ namespace ARMeilleure.CodeGen.X86
}
}
- bool needsSibByte = false;
+ bool needsSibByte = false;
bool needsDisplacement = false;
int sib = 0;
@@ -971,7 +971,7 @@ namespace ARMeilleure.CodeGen.X86
X86Register baseRegLow = (X86Register)(baseReg.Index & 0b111);
- needsSibByte = memOp.Index != default || baseRegLow == X86Register.Rsp;
+ needsSibByte = memOp.Index != default || baseRegLow == X86Register.Rsp;
needsDisplacement = memOp.Displacement != 0 || baseRegLow == X86Register.Rbp;
if (needsDisplacement)
@@ -1049,7 +1049,7 @@ namespace ARMeilleure.CodeGen.X86
InstructionFlags.Prefix66 => 1,
InstructionFlags.PrefixF3 => 2,
InstructionFlags.PrefixF2 => 3,
- _ => 0
+ _ => 0,
};
if (src1 != default)
@@ -1081,11 +1081,19 @@ namespace ARMeilleure.CodeGen.X86
switch (opCodeHigh)
{
- case 0xf: vexByte1 |= 1; break;
- case 0xf38: vexByte1 |= 2; break;
- case 0xf3a: vexByte1 |= 3; break;
+ case 0xf:
+ vexByte1 |= 1;
+ break;
+ case 0xf38:
+ vexByte1 |= 2;
+ break;
+ case 0xf3a:
+ vexByte1 |= 3;
+ break;
- default: Debug.Assert(false, $"Failed to VEX encode opcode 0x{opCode:X}."); break;
+ default:
+ Debug.Assert(false, $"Failed to VEX encode opcode 0x{opCode:X}.");
+ break;
}
vexByte2 |= (rexPrefix & 8) << 4;
@@ -1191,11 +1199,19 @@ namespace ARMeilleure.CodeGen.X86
switch ((ushort)(opCode >> 8))
{
- case 0xf00: mm = 0b01; break;
- case 0xf38: mm = 0b10; break;
- case 0xf3a: mm = 0b11; break;
+ case 0xf00:
+ mm = 0b01;
+ break;
+ case 0xf38:
+ mm = 0b10;
+ break;
+ case 0xf3a:
+ mm = 0b11;
+ break;
- default: Debug.Fail($"Failed to EVEX encode opcode 0x{opCode:X}."); break;
+ default:
+ Debug.Fail($"Failed to EVEX encode opcode 0x{opCode:X}.");
+ break;
}
WriteByte(
@@ -1217,7 +1233,7 @@ namespace ARMeilleure.CodeGen.X86
InstructionFlags.Prefix66 => 0b01,
InstructionFlags.PrefixF3 => 0b10,
InstructionFlags.PrefixF2 => 0b11,
- _ => 0
+ _ => 0,
};
WriteByte(
(byte)(
@@ -1233,11 +1249,19 @@ namespace ARMeilleure.CodeGen.X86
byte ll = 0b00;
switch (registerWidth)
{
- case 128: ll = 0b00; break;
- case 256: ll = 0b01; break;
- case 512: ll = 0b10; break;
+ case 128:
+ ll = 0b00;
+ break;
+ case 256:
+ ll = 0b01;
+ break;
+ case 512:
+ ll = 0b10;
+ break;
- default: Debug.Fail($"Invalid EVEX vector register width {registerWidth}."); break;
+ default:
+ Debug.Fail($"Invalid EVEX vector register width {registerWidth}.");
+ break;
}
// Embedded broadcast in the case of a memory operand
bool bcast = broadcast;
@@ -1315,10 +1339,7 @@ namespace ARMeilleure.CodeGen.X86
ref Jump jump = ref jumps[i];
// If jump target not resolved yet, resolve it.
- if (jump.JumpTarget == null)
- {
- jump.JumpTarget = _labels[jump.JumpLabel];
- }
+ jump.JumpTarget ??= _labels[jump.JumpLabel];
long jumpTarget = jump.JumpTarget.Value;
long offset = jumpTarget - jump.JumpPosition;
@@ -1556,4 +1577,4 @@ namespace ARMeilleure.CodeGen.X86
_stream.WriteByte((byte)(value >> 56));
}
}
-} \ No newline at end of file
+}