diff options
Diffstat (limited to 'lib/Target/Hexagon/HexagonBitTracker.cpp')
-rw-r--r-- | lib/Target/Hexagon/HexagonBitTracker.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/Target/Hexagon/HexagonBitTracker.cpp b/lib/Target/Hexagon/HexagonBitTracker.cpp index 436f88dcd450a..90ccecb6629ac 100644 --- a/lib/Target/Hexagon/HexagonBitTracker.cpp +++ b/lib/Target/Hexagon/HexagonBitTracker.cpp @@ -74,7 +74,7 @@ HexagonEvaluator::HexagonEvaluator(const HexagonRegisterInfo &tri, // Module::AnyPointerSize. if (Width == 0 || Width > 64) break; - AttributeSet Attrs = F.getAttributes(); + AttributeList Attrs = F.getAttributes(); if (Attrs.hasAttribute(AttrIdx, Attribute::ByVal)) continue; InPhysReg = getNextPhysReg(InPhysReg, Width); @@ -272,6 +272,9 @@ bool HexagonEvaluator::evaluate(const MachineInstr &MI, // cases below. uint16_t W0 = (Reg[0].Reg != 0) ? getRegBitWidth(Reg[0]) : 0; + // Register id of the 0th operand. It can be 0. + unsigned Reg0 = Reg[0].Reg; + switch (Opc) { // Transfer immediate: @@ -792,6 +795,17 @@ bool HexagonEvaluator::evaluate(const MachineInstr &MI, case A2_zxth: return rr0(eZXT(rc(1), 16), Outputs); + // Saturations + + case A2_satb: + return rr0(eSXT(RegisterCell::self(0, W0).regify(Reg0), 8), Outputs); + case A2_sath: + return rr0(eSXT(RegisterCell::self(0, W0).regify(Reg0), 16), Outputs); + case A2_satub: + return rr0(eZXT(RegisterCell::self(0, W0).regify(Reg0), 8), Outputs); + case A2_satuh: + return rr0(eZXT(RegisterCell::self(0, W0).regify(Reg0), 16), Outputs); + // Bit count: case S2_cl0: |