diff options
Diffstat (limited to 'llvm/lib/Target/SystemZ/SystemZOperands.td')
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZOperands.td | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZOperands.td b/llvm/lib/Target/SystemZ/SystemZOperands.td index 8171eae6460..da682cb4e5a 100644 --- a/llvm/lib/Target/SystemZ/SystemZOperands.td +++ b/llvm/lib/Target/SystemZ/SystemZOperands.td @@ -219,6 +219,12 @@ def SIMM16 : SDNodeXForm<imm, [{ MVT::i64); }]>; +// Negate and then truncate an immediate to a 16-bit signed quantity. +def NEGSIMM16 : SDNodeXForm<imm, [{ + return CurDAG->getTargetConstant(int16_t(-N->getZExtValue()), SDLoc(N), + MVT::i64); +}]>; + // Truncate an immediate to a 16-bit unsigned quantity. def UIMM16 : SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(uint16_t(N->getZExtValue()), SDLoc(N), @@ -231,24 +237,30 @@ def SIMM32 : SDNodeXForm<imm, [{ MVT::i64); }]>; +// Negate and then truncate an immediate to a 32-bit unsigned quantity. +def NEGSIMM32 : SDNodeXForm<imm, [{ + return CurDAG->getTargetConstant(int32_t(-N->getZExtValue()), SDLoc(N), + MVT::i64); +}]>; + // Truncate an immediate to a 32-bit unsigned quantity. def UIMM32 : SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(uint32_t(N->getZExtValue()), SDLoc(N), MVT::i64); }]>; +// Negate and then truncate an immediate to a 32-bit unsigned quantity. +def NEGUIMM32 : SDNodeXForm<imm, [{ + return CurDAG->getTargetConstant(uint32_t(-N->getZExtValue()), SDLoc(N), + MVT::i64); +}]>; + // Truncate an immediate to a 48-bit unsigned quantity. def UIMM48 : SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(uint64_t(N->getZExtValue()) & 0xffffffffffff, SDLoc(N), MVT::i64); }]>; -// Negate and then truncate an immediate to a 32-bit unsigned quantity. -def NEGIMM32 : SDNodeXForm<imm, [{ - return CurDAG->getTargetConstant(uint32_t(-N->getZExtValue()), SDLoc(N), - MVT::i64); -}]>; - //===----------------------------------------------------------------------===// // Immediate asm operands. //===----------------------------------------------------------------------===// @@ -336,6 +348,10 @@ def imm32sx16 : Immediate<i32, [{ return isInt<16>(N->getSExtValue()); }], SIMM16, "S16Imm">; +def imm32sx16n : Immediate<i32, [{ + return isInt<16>(-N->getSExtValue()); +}], NEGSIMM16, "S16Imm">; + def imm32zx16 : Immediate<i32, [{ return isUInt<16>(N->getZExtValue()); }], UIMM16, "U16Imm">; @@ -348,6 +364,10 @@ def imm32sx16trunc : Immediate<i32, [{}], SIMM16, "S16Imm">; def simm32 : Immediate<i32, [{}], SIMM32, "S32Imm">; def uimm32 : Immediate<i32, [{}], UIMM32, "U32Imm">; +def simm32n : Immediate<i32, [{ + return isInt<32>(-N->getSExtValue()); +}], NEGSIMM32, "S32Imm">; + def imm32 : ImmLeaf<i32, [{}]>; //===----------------------------------------------------------------------===// @@ -423,6 +443,10 @@ def imm64sx16 : Immediate<i64, [{ return isInt<16>(N->getSExtValue()); }], SIMM16, "S16Imm">; +def imm64sx16n : Immediate<i64, [{ + return isInt<16>(-N->getSExtValue()); +}], NEGSIMM16, "S16Imm">; + def imm64zx16 : Immediate<i64, [{ return isUInt<16>(N->getZExtValue()); }], UIMM16, "U16Imm">; @@ -431,13 +455,17 @@ def imm64sx32 : Immediate<i64, [{ return isInt<32>(N->getSExtValue()); }], SIMM32, "S32Imm">; +def imm64sx32n : Immediate<i64, [{ + return isInt<32>(-N->getSExtValue()); +}], NEGSIMM32, "S32Imm">; + def imm64zx32 : Immediate<i64, [{ return isUInt<32>(N->getZExtValue()); }], UIMM32, "U32Imm">; def imm64zx32n : Immediate<i64, [{ return isUInt<32>(-N->getSExtValue()); -}], NEGIMM32, "U32Imm">; +}], NEGUIMM32, "U32Imm">; def imm64zx48 : Immediate<i64, [{ return isUInt<64>(N->getZExtValue()); |