summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgibbed <rick@gibbed.us>2020-11-27 05:32:00 -0600
committerRick Gibbed <rick@gibbed.us>2020-11-27 05:34:08 -0600
commit326220309b8463fac86768bdc2e8976e0904af0c (patch)
tree4ef5016f1210ba425f30aa1c5ec3de27e3f93353
parent6c073d3c84a7fb482ae61cb354b85bf1a6e98038 (diff)
[x64] Handle constant in LOG2_F32/F64/V128.
-rw-r--r--src/xenia/cpu/backend/x64/x64_sequences.cc18
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);
}