Merge pull request #458 from lioncash/float-op

A64: Handle half-precision floating point in FABS, FNEG, and scalar FMOV
This commit is contained in:
Merry
2019-03-24 11:23:21 +00:00
committed by MerryMage
5 changed files with 56 additions and 21 deletions

View File

@@ -1773,11 +1773,17 @@ U128 IREmitter::ZeroVector() {
return Inst<U128>(Opcode::ZeroVector);
}
U32U64 IREmitter::FPAbs(const U32U64& a) {
if (a.GetType() == Type::U32) {
U16U32U64 IREmitter::FPAbs(const U16U32U64& a) {
switch (a.GetType()) {
case Type::U16:
return Inst<U16>(Opcode::FPAbs16, a);
case Type::U32:
return Inst<U32>(Opcode::FPAbs32, a);
} else {
case Type::U64:
return Inst<U64>(Opcode::FPAbs64, a);
default:
UNREACHABLE();
return U16U32U64{};
}
}
@@ -1880,11 +1886,17 @@ U32U64 IREmitter::FPMulX(const U32U64& a, const U32U64& b) {
}
}
U32U64 IREmitter::FPNeg(const U32U64& a) {
if (a.GetType() == Type::U32) {
U16U32U64 IREmitter::FPNeg(const U16U32U64& a) {
switch (a.GetType()) {
case Type::U16:
return Inst<U16>(Opcode::FPNeg16, a);
case Type::U32:
return Inst<U32>(Opcode::FPNeg32, a);
} else {
case Type::U64:
return Inst<U64>(Opcode::FPNeg64, a);
default:
UNREACHABLE();
return U16U32U64{};
}
}