From ba10624fe1fc9bb0e9374b7890e52f855653136c Mon Sep 17 00:00:00 2001 From: sydhds Date: Tue, 10 Jan 2023 11:37:45 +0100 Subject: [PATCH 1/3] Remove assert in sse_round_fn and handle case where src2 is in memory --- lib/compiler-singlepass/src/emitter_x64.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/compiler-singlepass/src/emitter_x64.rs b/lib/compiler-singlepass/src/emitter_x64.rs index 38a91689f1c..32a35673414 100644 --- a/lib/compiler-singlepass/src/emitter_x64.rs +++ b/lib/compiler-singlepass/src/emitter_x64.rs @@ -909,11 +909,12 @@ macro_rules! sse_round_fn { |emitter: &mut AssemblerX64, precision: Precision, src1: XMM, src2: XMMOrMemory, dst: XMM| { match src2 { XMMOrMemory::XMM(x) => { - assert_eq!(src1, x); - move_src_to_dst(emitter, precision, src1, dst); + move_src_to_dst(emitter, precision, x, dst); dynasm!(emitter ; $ins Rx((dst as u8)), Rx((dst as u8)), $mode) } - XMMOrMemory::Memory(..) => unreachable!(), + XMMOrMemory::Memory(base, disp) => { + dynasm!(emitter ; $ins Rx((dst as u8)), [Rq((base as u8)) + disp], $mode) + }, } } } From 2d05574590a01247dcd2345ddb07032cafdda58a Mon Sep 17 00:00:00 2001 From: sydhds Date: Tue, 10 Jan 2023 14:40:30 +0100 Subject: [PATCH 2/3] Add if else --- lib/compiler-singlepass/src/emitter_x64.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/compiler-singlepass/src/emitter_x64.rs b/lib/compiler-singlepass/src/emitter_x64.rs index 32a35673414..bcf7af79b1f 100644 --- a/lib/compiler-singlepass/src/emitter_x64.rs +++ b/lib/compiler-singlepass/src/emitter_x64.rs @@ -909,7 +909,11 @@ macro_rules! sse_round_fn { |emitter: &mut AssemblerX64, precision: Precision, src1: XMM, src2: XMMOrMemory, dst: XMM| { match src2 { XMMOrMemory::XMM(x) => { - move_src_to_dst(emitter, precision, x, dst); + if src1 == x { + move_src_to_dst(emitter, precision, x, dst); + } else { + move_src_to_dst(emitter, precision, src1, dst); + } dynasm!(emitter ; $ins Rx((dst as u8)), Rx((dst as u8)), $mode) } XMMOrMemory::Memory(base, disp) => { From bfa1b678db2dc9574ef90f32a2c77fe4d7575789 Mon Sep 17 00:00:00 2001 From: sydhds Date: Tue, 10 Jan 2023 15:33:57 +0100 Subject: [PATCH 3/3] Rework fix when x != dst --- lib/compiler-singlepass/src/emitter_x64.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/compiler-singlepass/src/emitter_x64.rs b/lib/compiler-singlepass/src/emitter_x64.rs index bcf7af79b1f..8a04a45c42d 100644 --- a/lib/compiler-singlepass/src/emitter_x64.rs +++ b/lib/compiler-singlepass/src/emitter_x64.rs @@ -909,12 +909,10 @@ macro_rules! sse_round_fn { |emitter: &mut AssemblerX64, precision: Precision, src1: XMM, src2: XMMOrMemory, dst: XMM| { match src2 { XMMOrMemory::XMM(x) => { - if src1 == x { - move_src_to_dst(emitter, precision, x, dst); - } else { + if x != dst { move_src_to_dst(emitter, precision, src1, dst); } - dynasm!(emitter ; $ins Rx((dst as u8)), Rx((dst as u8)), $mode) + dynasm!(emitter ; $ins Rx((x as u8)), Rx((dst as u8)), $mode) } XMMOrMemory::Memory(base, disp) => { dynasm!(emitter ; $ins Rx((dst as u8)), [Rq((base as u8)) + disp], $mode)