From bd1958d8e99ebd5a885f848b2f688c399cfc9886 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 1 Oct 2013 14:41:52 +0000 Subject: [PATCH] [SystemZ] Extend test-under-mask support to high GR32s git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191773 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SystemZ/SystemZInstrFormats.td | 5 ++++ lib/Target/SystemZ/SystemZInstrInfo.cpp | 8 +++++++ lib/Target/SystemZ/SystemZInstrInfo.td | 16 +++++++++---- lib/Target/SystemZ/SystemZPatterns.td | 6 ++--- test/CodeGen/SystemZ/asm-18.ll | 29 +++++++++++++++++++++++ 5 files changed, 56 insertions(+), 8 deletions(-) diff --git a/lib/Target/SystemZ/SystemZInstrFormats.td b/lib/Target/SystemZ/SystemZInstrFormats.td index b35aea8dfeb..9ca1a8ad507 100644 --- a/lib/Target/SystemZ/SystemZInstrFormats.td +++ b/lib/Target/SystemZ/SystemZInstrFormats.td @@ -1386,6 +1386,11 @@ class BinaryRIPseudo + : Pseudo<(outs), (ins cls:$R1, imm:$I2), [(operator cls:$R1, imm:$I2)]>; + // Like StoreRXY, but expanded after RA depending on the choice of registers. class StoreRXYPseudo bytes, AddressingMode mode = bdxaddr20only> diff --git a/lib/Target/SystemZ/SystemZInstrInfo.cpp b/lib/Target/SystemZ/SystemZInstrInfo.cpp index f32cf9c527a..2c48c789815 100644 --- a/lib/Target/SystemZ/SystemZInstrInfo.cpp +++ b/lib/Target/SystemZ/SystemZInstrInfo.cpp @@ -910,6 +910,14 @@ SystemZInstrInfo::expandPostRAPseudo(MachineBasicBlock::iterator MI) const { expandRIPseudo(MI, SystemZ::XILF, SystemZ::XIHF, false); return true; + case SystemZ::TMLMux: + expandRIPseudo(MI, SystemZ::TMLL, SystemZ::TMHL, false); + return true; + + case SystemZ::TMHMux: + expandRIPseudo(MI, SystemZ::TMLH, SystemZ::TMHH, false); + return true; + case SystemZ::RISBMux: { bool DestIsHigh = isHighReg(MI->getOperand(0).getReg()); bool SrcIsHigh = isHighReg(MI->getOperand(2).getReg()); diff --git a/lib/Target/SystemZ/SystemZInstrInfo.td b/lib/Target/SystemZ/SystemZInstrInfo.td index 88508e33c5d..340580af626 100644 --- a/lib/Target/SystemZ/SystemZInstrInfo.td +++ b/lib/Target/SystemZ/SystemZInstrInfo.td @@ -1140,16 +1140,22 @@ let mayLoad = 1, Defs = [CC], Uses = [R0L] in // Test under mask. let Defs = [CC] in { + // TMxMux expands to TM[LH]x, depending on the choice of register. + def TMLMux : CompareRIPseudo, + Requires<[FeatureHighWord]>; + def TMHMux : CompareRIPseudo, + Requires<[FeatureHighWord]>; def TMLL : CompareRI<"tmll", 0xA71, z_tm_reg, GR32, imm32ll16>; def TMLH : CompareRI<"tmlh", 0xA70, z_tm_reg, GR32, imm32lh16>; - - def TMHL : CompareRI<"tmhl", 0xA73, z_tm_reg, GR64, imm64hl16>; - def TMHH : CompareRI<"tmhh", 0xA72, z_tm_reg, GR64, imm64hh16>; + def TMHL : CompareRI<"tmhl", 0xA73, z_tm_reg, GRH32, imm32ll16>; + def TMHH : CompareRI<"tmhh", 0xA72, z_tm_reg, GRH32, imm32lh16>; defm TM : CompareSIPair<"tm", 0x91, 0xEB51, z_tm_mem, anyextloadi8, imm32zx8>; } -def : CompareGR64RI; -def : CompareGR64RI; +def : CompareGR64RI; +def : CompareGR64RI; +def : CompareGR64RI; +def : CompareGR64RI; //===----------------------------------------------------------------------===// // Prefetch diff --git a/lib/Target/SystemZ/SystemZPatterns.td b/lib/Target/SystemZ/SystemZPatterns.td index af46919569a..f3ca60b27ad 100644 --- a/lib/Target/SystemZ/SystemZPatterns.td +++ b/lib/Target/SystemZ/SystemZPatterns.td @@ -113,11 +113,11 @@ multiclass CondStores64 + Immediate imm, SubRegIndex subreg> : Pat<(compare GR64:$R1, imm:$I2), - (insn (EXTRACT_SUBREG GR64:$R1, subreg_l32), + (insn (EXTRACT_SUBREG GR64:$R1, subreg), (imm.OperandTransform imm:$I2))>; // Try to use MVC instruction INSN for a load of type LOAD followed by a store diff --git a/test/CodeGen/SystemZ/asm-18.ll b/test/CodeGen/SystemZ/asm-18.ll index b393b6e29e5..9eed60a8cf4 100644 --- a/test/CodeGen/SystemZ/asm-18.ll +++ b/test/CodeGen/SystemZ/asm-18.ll @@ -525,3 +525,32 @@ define i32 @f24(i32 %old) { "=r,h,h,0"(i32 %res1, i32 %and3, i32 %and4) ret i32 %res2 } + +; Test TMxx involving mixtures of high and low registers. +define i32 @f25(i32 %old) { +; CHECK-LABEL: f25: +; CHECK-DAG: tmll %r2, 1 +; CHECK-DAG: tmlh %r2, 1 +; CHECK: stepa [[REG1:%r[0-5]]], +; CHECK-DAG: tmhl [[REG1]], 1 +; CHECK-DAG: tmhh [[REG1]], 1 +; CHECK: stepb %r2, +; CHECK: br %r14 + %and1 = and i32 %old, 1 + %and2 = and i32 %old, 65536 + %cmp1 = icmp eq i32 %and1, 0 + %cmp2 = icmp eq i32 %and2, 0 + %sel1 = select i1 %cmp1, i32 100, i32 200 + %sel2 = select i1 %cmp2, i32 100, i32 200 + %res1 = call i32 asm "stepa $0, $1, $2", + "=h,r,r"(i32 %sel1, i32 %sel2) + %and3 = and i32 %res1, 1 + %and4 = and i32 %res1, 65536 + %cmp3 = icmp eq i32 %and3, 0 + %cmp4 = icmp eq i32 %and4, 0 + %sel3 = select i1 %cmp3, i32 100, i32 200 + %sel4 = select i1 %cmp4, i32 100, i32 200 + %res2 = call i32 asm "stepb $0, $1, $2", + "=r,h,h"(i32 %sel3, i32 %sel4) + ret i32 %res2 +}