diff options
| author | gibbed <rick@gibbed.us> | 2020-11-27 05:32:00 -0600 |
|---|---|---|
| committer | Rick Gibbed <rick@gibbed.us> | 2020-11-27 05:34:08 -0600 |
| commit | 326220309b8463fac86768bdc2e8976e0904af0c (patch) | |
| tree | 4ef5016f1210ba425f30aa1c5ec3de27e3f93353 | |
| parent | 6c073d3c84a7fb482ae61cb354b85bf1a6e98038 (diff) | |
[x64] Handle constant in LOG2_F32/F64/V128.
| -rw-r--r-- | src/xenia/cpu/backend/x64/x64_sequences.cc | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/xenia/cpu/backend/x64/x64_sequences.cc b/src/xenia/cpu/backend/x64/x64_sequences.cc index f6a688b09..37a05c60b 100644 --- a/src/xenia/cpu/backend/x64/x64_sequences.cc +++ b/src/xenia/cpu/backend/x64/x64_sequences.cc @@ -2460,7 +2460,11 @@ struct LOG2_F32 : Sequence<LOG2_F32, I<OPCODE_LOG2, F32Op, F32Op>> { } static void Emit(X64Emitter& e, const EmitArgType& i) { assert_always(); - e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1)); + if (i.src1.is_constant) { + e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant())); + } else { + e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1)); + } e.CallNativeSafe(reinterpret_cast<void*>(EmulateLog2)); e.vmovaps(i.dest, e.xmm0); } @@ -2474,7 +2478,11 @@ struct LOG2_F64 : Sequence<LOG2_F64, I<OPCODE_LOG2, F64Op, F64Op>> { } static void Emit(X64Emitter& e, const EmitArgType& i) { assert_always(); - e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1)); + if (i.src1.is_constant) { + e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant())); + } else { + e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1)); + } e.CallNativeSafe(reinterpret_cast<void*>(EmulateLog2)); e.vmovaps(i.dest, e.xmm0); } @@ -2489,7 +2497,11 @@ struct LOG2_V128 : Sequence<LOG2_V128, I<OPCODE_LOG2, V128Op, V128Op>> { return _mm_load_ps(values); } static void Emit(X64Emitter& e, const EmitArgType& i) { - e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1)); + if (i.src1.is_constant) { + e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant())); + } else { + e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1)); + } e.CallNativeSafe(reinterpret_cast<void*>(EmulateLog2)); e.vmovaps(i.dest, e.xmm0); } |
