diff options
| author | Triang3l <triang3l@yandex.ru> | 2020-12-10 21:29:33 +0300 |
|---|---|---|
| committer | Triang3l <triang3l@yandex.ru> | 2020-12-10 21:29:33 +0300 |
| commit | cb93ddf8730872fadbd4fa4616f761b389964691 (patch) | |
| tree | f6200ff97633ff7060a661583079bdf8a13c13d2 | |
| parent | db1d6b1fefea608fc3279bd60be64c329ff2b397 (diff) | |
[PPC] vcfsx/vcfux optimization/simplification
| -rw-r--r-- | src/xenia/cpu/ppc/ppc_emit_altivec.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/xenia/cpu/ppc/ppc_emit_altivec.cc b/src/xenia/cpu/ppc/ppc_emit_altivec.cc index 08ea1b2fa..9c53e61ce 100644 --- a/src/xenia/cpu/ppc/ppc_emit_altivec.cc +++ b/src/xenia/cpu/ppc/ppc_emit_altivec.cc @@ -519,8 +519,8 @@ int InstrEmit_vavguw(PPCHIRBuilder& f, const InstrData& i) { int InstrEmit_vcfsx_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb, uint32_t uimm) { // (VD) <- float(VB as signed) / 2^uimm - float fuimm = static_cast<float>(std::exp2(uimm)); - Value* v = f.Div(f.VectorConvertI2F(f.LoadVR(vb)), + float fuimm = std::ldexp(1.0f, -int32_t(uimm)); + Value* v = f.Mul(f.VectorConvertI2F(f.LoadVR(vb)), f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE)); f.StoreVR(vd, v); return 0; @@ -535,8 +535,8 @@ int InstrEmit_vcsxwfp128(PPCHIRBuilder& f, const InstrData& i) { int InstrEmit_vcfux_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb, uint32_t uimm) { // (VD) <- float(VB as unsigned) / 2^uimm - float fuimm = static_cast<float>(std::exp2(uimm)); - Value* v = f.Div(f.VectorConvertI2F(f.LoadVR(vb), ARITHMETIC_UNSIGNED), + float fuimm = std::ldexp(1.0f, -int32_t(uimm)); + Value* v = f.Mul(f.VectorConvertI2F(f.LoadVR(vb), ARITHMETIC_UNSIGNED), f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE)); f.StoreVR(vd, v); return 0; |
