From af4637aff659381ce914da5f7368c4424d12764b Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Fri, 25 Oct 2019 11:18:26 -0700 Subject: [PATCH] Add x86 SIMD legalizations for icmp less-than --- .../codegen/meta/src/isa/x86/legalize.rs | 30 +++++++++----- .../isa/x86/simd-comparison-run.clif | 40 +++++++++++++++++++ 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/cranelift/codegen/meta/src/isa/x86/legalize.rs b/cranelift/codegen/meta/src/isa/x86/legalize.rs index e30ea592a9..f45edd513b 100644 --- a/cranelift/codegen/meta/src/isa/x86/legalize.rs +++ b/cranelift/codegen/meta/src/isa/x86/legalize.rs @@ -509,34 +509,42 @@ pub(crate) fn define(shared: &mut SharedDefinitions, x86_instructions: &Instruct ); } - // SIMD icmp ugt + // SIMD icmp greater-/less-than + let sgt = Literal::enumerator_for(&imm.intcc, "sgt"); let ugt = Literal::enumerator_for(&imm.intcc, "ugt"); + let sge = Literal::enumerator_for(&imm.intcc, "sge"); + let uge = Literal::enumerator_for(&imm.intcc, "uge"); + let slt = Literal::enumerator_for(&imm.intcc, "slt"); + let ult = Literal::enumerator_for(&imm.intcc, "ult"); + let sle = Literal::enumerator_for(&imm.intcc, "sle"); + let ule = Literal::enumerator_for(&imm.intcc, "ule"); for ty in &[I8, I16, I32] { + // greater-than let icmp_ = icmp.bind(vector(*ty, sse_vector_size)); narrow.legalize( def!(c = icmp_(ugt, a, b)), vec![def!(x = x86_pmaxu(a, b)), def!(c = icmp(eq, a, x))], ); - } - - // SIMD icmp sge - let sge = Literal::enumerator_for(&imm.intcc, "sge"); - for ty in &[I8, I16, I32] { let icmp_ = icmp.bind(vector(*ty, sse_vector_size)); narrow.legalize( def!(c = icmp_(sge, a, b)), vec![def!(x = x86_pmins(a, b)), def!(c = icmp(eq, x, b))], ); - } - - // SIMD icmp uge - let uge = Literal::enumerator_for(&imm.intcc, "uge"); - for ty in &[I8, I16, I32] { let icmp_ = icmp.bind(vector(*ty, sse_vector_size)); narrow.legalize( def!(c = icmp_(uge, a, b)), vec![def!(x = x86_pminu(a, b)), def!(c = icmp(eq, x, b))], ); + + // less-than + let icmp_ = icmp.bind(vector(*ty, sse_vector_size)); + narrow.legalize(def!(c = icmp_(slt, a, b)), vec![def!(c = icmp(sgt, b, a))]); + let icmp_ = icmp.bind(vector(*ty, sse_vector_size)); + narrow.legalize(def!(c = icmp_(ult, a, b)), vec![def!(c = icmp(ugt, b, a))]); + let icmp_ = icmp.bind(vector(*ty, sse_vector_size)); + narrow.legalize(def!(c = icmp_(sle, a, b)), vec![def!(c = icmp(sge, b, a))]); + let icmp_ = icmp.bind(vector(*ty, sse_vector_size)); + narrow.legalize(def!(c = icmp_(ule, a, b)), vec![def!(c = icmp(uge, b, a))]); } narrow.custom_legalize(shuffle, "convert_shuffle"); diff --git a/cranelift/filetests/filetests/isa/x86/simd-comparison-run.clif b/cranelift/filetests/filetests/isa/x86/simd-comparison-run.clif index 0cffbc6708..5d96585be0 100644 --- a/cranelift/filetests/filetests/isa/x86/simd-comparison-run.clif +++ b/cranelift/filetests/filetests/isa/x86/simd-comparison-run.clif @@ -137,3 +137,43 @@ ebb0: return v8 } ; run + +function %icmp_slt_i32x4() -> b1 { +ebb0: + v0 = vconst.i32x4 [-1 1 1 1] + v1 = vconst.i32x4 [1 2 3 4] + v2 = icmp slt v0, v1 + v8 = vall_true v2 + return v8 +} +; run + +function %icmp_ult_i32x4() -> b1 { +ebb0: + v0 = vconst.i32x4 [1 1 1 1] + v1 = vconst.i32x4 [-1 2 3 4] ; -1 = 0xffff... will be greater than 1 when unsigned + v2 = icmp ult v0, v1 + v8 = vall_true v2 + return v8 +} +; run + +function %icmp_sle_i16x8() -> b1 { +ebb0: + v0 = vconst.i16x8 [-1 -1 0 0 0 0 0 0] + v1 = vconst.i16x8 [-1 0 0 0 0 0 0 0] + v2 = icmp sle v0, v1 + v8 = vall_true v2 + return v8 +} +; run + +function %icmp_ule_i16x8() -> b1 { +ebb0: + v0 = vconst.i16x8 [-1 0 0 0 0 0 0 0] + v1 = vconst.i16x8 [-1 -1 0 0 0 0 0 0] + v2 = icmp ule v0, v1 + v8 = vall_true v2 + return v8 +} +; run