From 3b946c90ef12f1ab0507d338ec6a55bf994b972e Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Wed, 10 Aug 2016 17:56:24 +0000 Subject: [PATCH] [Hexagon] Add extra patterns for single-precision min/max instructions llvm-svn: 278252 --- llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td | 36 +++++++------- llvm/test/CodeGen/Hexagon/sf-min-max.ll | 67 +++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 llvm/test/CodeGen/Hexagon/sf-min-max.ll diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td b/llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td index 3d96864..3c0baa5 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td @@ -134,13 +134,13 @@ let isCommutable = 1 in { def F2_sfsub : T_MInstFloat < "sfsub", 0b000, 0b001>; -def: Pat<(f32 (fadd F32:$src1, F32:$src2)), +def: Pat<(fadd F32:$src1, F32:$src2), (F2_sfadd F32:$src1, F32:$src2)>; -def: Pat<(f32 (fsub F32:$src1, F32:$src2)), +def: Pat<(fsub F32:$src1, F32:$src2), (F2_sfsub F32:$src1, F32:$src2)>; -def: Pat<(f32 (fmul F32:$src1, F32:$src2)), +def: Pat<(fmul F32:$src1, F32:$src2), (F2_sfmpy F32:$src1, F32:$src2)>; let Itinerary = M_tc_3x_SLOT23 in { @@ -149,21 +149,21 @@ let Itinerary = M_tc_3x_SLOT23 in { } let AddedComplexity = 100, Predicates = [HasV5T] in { - def: Pat<(f32 (select (i1 (setolt F32:$src1, F32:$src2)), - F32:$src1, F32:$src2)), - (F2_sfmin F32:$src1, F32:$src2)>; - - def: Pat<(f32 (select (i1 (setogt F32:$src1, F32:$src2)), - F32:$src2, F32:$src1)), - (F2_sfmin F32:$src1, F32:$src2)>; - - def: Pat<(f32 (select (i1 (setogt F32:$src1, F32:$src2)), - F32:$src1, F32:$src2)), - (F2_sfmax F32:$src1, F32:$src2)>; - - def: Pat<(f32 (select (i1 (setolt F32:$src1, F32:$src2)), - F32:$src2, F32:$src1)), - (F2_sfmax F32:$src1, F32:$src2)>; + class SfSel12 + : Pat<(select (i1 (Cmp F32:$Rs, F32:$Rt)), F32:$Rs, F32:$Rt), + (MI F32:$Rs, F32:$Rt)>; + class SfSel21 + : Pat<(select (i1 (Cmp F32:$Rs, F32:$Rt)), F32:$Rt, F32:$Rs), + (MI F32:$Rs, F32:$Rt)>; + + def: SfSel12; + def: SfSel12; + def: SfSel12; + def: SfSel12; + def: SfSel21; + def: SfSel21; + def: SfSel21; + def: SfSel21; } def F2_sffixupn : T_MInstFloat < "sffixupn", 0b110, 0b000>; diff --git a/llvm/test/CodeGen/Hexagon/sf-min-max.ll b/llvm/test/CodeGen/Hexagon/sf-min-max.ll new file mode 100644 index 0000000..e795cb4 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/sf-min-max.ll @@ -0,0 +1,67 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +; CHECK-LABEL: sf_min_olt: +; CHECK: sfmin +define float @sf_min_olt(float %x, float %y) #0 { + %t = fcmp olt float %x, %y + %u = select i1 %t, float %x, float %y + ret float %u +} + +; CHECK-LABEL: sf_min_ole: +; CHECK: sfmin +define float @sf_min_ole(float %x, float %y) #0 { + %t = fcmp ole float %x, %y + %u = select i1 %t, float %x, float %y + ret float %u +} + +; CHECK-LABEL: sf_max_ogt: +; CHECK: sfmax +define float @sf_max_ogt(float %x, float %y) #0 { + %t = fcmp ogt float %x, %y + %u = select i1 %t, float %x, float %y + ret float %u +} + +; CHECK-LABEL: sf_max_oge: +; CHECK: sfmax +define float @sf_max_oge(float %x, float %y) #0 { + %t = fcmp oge float %x, %y + %u = select i1 %t, float %x, float %y + ret float %u +} + +; CHECK-LABEL: sf_max_olt: +; CHECK: sfmax +define float @sf_max_olt(float %x, float %y) #0 { + %t = fcmp olt float %x, %y + %u = select i1 %t, float %y, float %x + ret float %u +} + +; CHECK-LABEL: sf_max_ole: +; CHECK: sfmax +define float @sf_max_ole(float %x, float %y) #0 { + %t = fcmp ole float %x, %y + %u = select i1 %t, float %y, float %x + ret float %u +} + +; CHECK-LABEL: sf_min_ogt: +; CHECK: sfmin +define float @sf_min_ogt(float %x, float %y) #0 { + %t = fcmp ogt float %x, %y + %u = select i1 %t, float %y, float %x + ret float %u +} + +; CHECK-LABEL: sf_min_oge: +; CHECK: sfmin +define float @sf_min_oge(float %x, float %y) #0 { + %t = fcmp oge float %x, %y + %u = select i1 %t, float %y, float %x + ret float %u +} + +attributes #0 = { nounwind "target-cpu"="hexagonv5" } -- 2.7.4