A64: Implement scalar double/single precision FMULX (by element)
This commit is contained in:
parent
20fabc5083
commit
bdcea0b0dc
2 changed files with 11 additions and 2 deletions
|
@ -551,7 +551,7 @@ INST(FMUL_elt_2, "FMUL (by element)", "01011
|
||||||
//INST(SQRDMLAH_elt_1, "SQRDMLAH (by element)", "01111111zzLMmmmm1101H0nnnnnddddd")
|
//INST(SQRDMLAH_elt_1, "SQRDMLAH (by element)", "01111111zzLMmmmm1101H0nnnnnddddd")
|
||||||
//INST(SQRDMLSH_elt_1, "SQRDMLSH (by element)", "01111111zzLMmmmm1111H0nnnnnddddd")
|
//INST(SQRDMLSH_elt_1, "SQRDMLSH (by element)", "01111111zzLMmmmm1111H0nnnnnddddd")
|
||||||
//INST(FMULX_elt_1, "FMULX (by element)", "0111111100LMmmmm1001H0nnnnnddddd")
|
//INST(FMULX_elt_1, "FMULX (by element)", "0111111100LMmmmm1001H0nnnnnddddd")
|
||||||
//INST(FMULX_elt_2, "FMULX (by element)", "011111111zLMmmmm1001H0nnnnnddddd")
|
INST(FMULX_elt_2, "FMULX (by element)", "011111111zLMmmmm1001H0nnnnnddddd")
|
||||||
|
|
||||||
// Data Processing - FP and SIMD - SIMD Table Lookup
|
// Data Processing - FP and SIMD - SIMD Table Lookup
|
||||||
INST(TBL, "TBL", "0Q001110000mmmmm0LL000nnnnnddddd")
|
INST(TBL, "TBL", "0Q001110000mmmmm0LL000nnnnnddddd")
|
||||||
|
|
|
@ -12,7 +12,8 @@ namespace {
|
||||||
enum class ExtraBehavior {
|
enum class ExtraBehavior {
|
||||||
None,
|
None,
|
||||||
Accumulate,
|
Accumulate,
|
||||||
Subtract
|
Subtract,
|
||||||
|
MultiplyExtended,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool MultiplyByElement(TranslatorVisitor& v, bool sz, Imm<1> L, Imm<1> M, Imm<4> Vmlo, Imm<1> H,
|
bool MultiplyByElement(TranslatorVisitor& v, bool sz, Imm<1> L, Imm<1> M, Imm<4> Vmlo, Imm<1> H,
|
||||||
|
@ -34,6 +35,10 @@ bool MultiplyByElement(TranslatorVisitor& v, bool sz, Imm<1> L, Imm<1> M, Imm<4>
|
||||||
return v.ir.FPMul(operand1, element, true);
|
return v.ir.FPMul(operand1, element, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (extra_behavior == ExtraBehavior::MultiplyExtended) {
|
||||||
|
return v.ir.FPMulX(operand1, element);
|
||||||
|
}
|
||||||
|
|
||||||
if (extra_behavior == ExtraBehavior::Subtract) {
|
if (extra_behavior == ExtraBehavior::Subtract) {
|
||||||
operand1 = v.ir.FPNeg(operand1);
|
operand1 = v.ir.FPNeg(operand1);
|
||||||
}
|
}
|
||||||
|
@ -59,6 +64,10 @@ bool TranslatorVisitor::FMUL_elt_2(bool sz, Imm<1> L, Imm<1> M, Imm<4> Vmlo, Imm
|
||||||
return MultiplyByElement(*this, sz, L, M, Vmlo, H, Vn, Vd, ExtraBehavior::None);
|
return MultiplyByElement(*this, sz, L, M, Vmlo, H, Vn, Vd, ExtraBehavior::None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TranslatorVisitor::FMULX_elt_2(bool sz, Imm<1> L, Imm<1> M, Imm<4> Vmlo, Imm<1> H, Vec Vn, Vec Vd) {
|
||||||
|
return MultiplyByElement(*this, sz, L, M, Vmlo, H, Vn, Vd, ExtraBehavior::MultiplyExtended);
|
||||||
|
}
|
||||||
|
|
||||||
bool TranslatorVisitor::SQDMULH_elt_1(Imm<2> size, Imm<1> L, Imm<1> M, Imm<4> Vmlo, Imm<1> H, Vec Vn, Vec Vd) {
|
bool TranslatorVisitor::SQDMULH_elt_1(Imm<2> size, Imm<1> L, Imm<1> M, Imm<4> Vmlo, Imm<1> H, Vec Vn, Vec Vd) {
|
||||||
if (size == 0b00 || size == 0b11) {
|
if (size == 0b00 || size == 0b11) {
|
||||||
return UnallocatedEncoding();
|
return UnallocatedEncoding();
|
||||||
|
|
Loading…
Reference in a new issue