A64 emitter: Support for 64bit FMOV
This commit is contained in:
parent
1bd416aefb
commit
b92195f2ae
@ -1140,7 +1140,7 @@ void ARM64XEmitter::MRS(ARM64Reg Rt, PStateField field) {
|
|||||||
EncodeSystemInst(o0 | 4, op1, CRn, CRm, op2, DecodeReg(Rt));
|
EncodeSystemInst(o0 | 4, op1, CRn, CRm, op2, DecodeReg(Rt));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARM64XEmitter::CNTVCT(Arm64Gen::ARM64Reg Rt) {
|
void ARM64XEmitter::CNTVCT(ARM64Reg Rt) {
|
||||||
ASSERT_MSG(Is64Bit(Rt), "CNTVCT: Rt must be 64-bit");
|
ASSERT_MSG(Is64Bit(Rt), "CNTVCT: Rt must be 64-bit");
|
||||||
|
|
||||||
// MRS <Xt>, CNTVCT_EL0 ; Read CNTVCT_EL0 into Xt
|
// MRS <Xt>, CNTVCT_EL0 ; Read CNTVCT_EL0 into Xt
|
||||||
@ -2677,19 +2677,29 @@ void ARM64FloatEmitter::FMOV(ARM64Reg Rd, ARM64Reg Rn, bool top) {
|
|||||||
ASSERT_MSG(!IsQuad(Rd) && !IsQuad(Rn), "FMOV can't move to/from quads");
|
ASSERT_MSG(!IsQuad(Rd) && !IsQuad(Rn), "FMOV can't move to/from quads");
|
||||||
int rmode = 0;
|
int rmode = 0;
|
||||||
int opcode = 6;
|
int opcode = 6;
|
||||||
|
int encoded_size = 0;
|
||||||
int sf = 0;
|
int sf = 0;
|
||||||
if (IsSingle(Rd) && !Is64Bit(Rn) && !top) {
|
if (IsSingle(Rd) && !Is64Bit(Rn) && !top) {
|
||||||
// GPR to scalar single
|
// GPR to scalar single
|
||||||
opcode |= 1;
|
opcode |= 1;
|
||||||
} else if (!Is64Bit(Rd) && IsSingle(Rn) && !top) {
|
} else if (!Is64Bit(Rd) && IsSingle(Rn) && !top) {
|
||||||
// Scalar single to GPR - defaults are correct
|
// Scalar single to GPR - defaults are correct
|
||||||
|
} else if (Is64Bit(Rd) && IsDouble(Rn) && !top) {
|
||||||
|
// Scalar double to GPR
|
||||||
|
sf = 1;
|
||||||
|
encoded_size = 1;
|
||||||
|
} else if (IsDouble(Rd) && Is64Bit(Rn) && !top) {
|
||||||
|
// GPR to Scalar double
|
||||||
|
sf = 1;
|
||||||
|
encoded_size = 1;
|
||||||
|
opcode |= 1;
|
||||||
} else {
|
} else {
|
||||||
// TODO
|
// TODO
|
||||||
ASSERT_MSG(0, "FMOV: Unhandled case");
|
ASSERT_MSG(0, "FMOV: Unhandled case");
|
||||||
}
|
}
|
||||||
Rd = DecodeReg(Rd);
|
Rd = DecodeReg(Rd);
|
||||||
Rn = DecodeReg(Rn);
|
Rn = DecodeReg(Rn);
|
||||||
Write32((sf << 31) | (0x1e2 << 20) | (rmode << 19) | (opcode << 16) | (Rn << 5) | Rd);
|
Write32((sf << 31) | (encoded_size << 22) | (0x1e2 << 20) | (rmode << 19) | (opcode << 16) | (Rn << 5) | Rd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user