diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-08-10 17:56:24 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-08-10 17:56:24 +0000 |
| commit | 3b946c90ef12f1ab0507d338ec6a55bf994b972e (patch) | |
| tree | e7f95fb07816deb757fb5afa034c16fd0e13d3fc /llvm | |
| parent | 64afe23528483a49eaa561d12c6440b1352531bd (diff) | |
| download | bcm5719-llvm-3b946c90ef12f1ab0507d338ec6a55bf994b972e.tar.gz bcm5719-llvm-3b946c90ef12f1ab0507d338ec6a55bf994b972e.zip | |
[Hexagon] Add extra patterns for single-precision min/max instructions
llvm-svn: 278252
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td | 36 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Hexagon/sf-min-max.ll | 67 |
2 files changed, 85 insertions, 18 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td b/llvm/lib/Target/Hexagon/HexagonInstrInfoV5.td index 3d96864a659..3c0baa53edc 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<PatFrag Cmp, InstHexagon MI> + : Pat<(select (i1 (Cmp F32:$Rs, F32:$Rt)), F32:$Rs, F32:$Rt), + (MI F32:$Rs, F32:$Rt)>; + class SfSel21<PatFrag Cmp, InstHexagon MI> + : Pat<(select (i1 (Cmp F32:$Rs, F32:$Rt)), F32:$Rt, F32:$Rs), + (MI F32:$Rs, F32:$Rt)>; + + def: SfSel12<setolt, F2_sfmin>; + def: SfSel12<setole, F2_sfmin>; + def: SfSel12<setogt, F2_sfmax>; + def: SfSel12<setoge, F2_sfmax>; + def: SfSel21<setolt, F2_sfmax>; + def: SfSel21<setole, F2_sfmax>; + def: SfSel21<setogt, F2_sfmin>; + def: SfSel21<setoge, F2_sfmin>; } 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 00000000000..e795cb42d6a --- /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" } |

