From reid at x10sys.com Mon Feb 26 01:44:55 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 01:44:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702260744.l1Q7itOX006226@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.45 -> 1.46 --- Log message: 1. Remove redundant calls to clearUsedBits(). 2. Fix countTrailingZeros to use a faster algorithm. 3. Simplify sext() slightly by using isNegative(). 4. Implement ashr using word-at-a-time logic instead of bit-at-a-time 5. Rename locals named isNegative so they don't clash with method name. 6. Fix fromString to compute negated value correctly. --- Diffs of the changes: (+79 -44) APInt.cpp | 123 +++++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 79 insertions(+), 44 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.45 llvm/lib/Support/APInt.cpp:1.46 --- llvm/lib/Support/APInt.cpp:1.45 Sun Feb 25 19:19:48 2007 +++ llvm/lib/Support/APInt.cpp Mon Feb 26 01:44:38 2007 @@ -403,7 +403,7 @@ APInt APInt::operator^(const APInt& RHS) const { assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); if (isSingleWord()) - return APInt(BitWidth, VAL ^ RHS.VAL).clearUnusedBits(); + return APInt(BitWidth, VAL ^ RHS.VAL); uint32_t numWords = getNumWords(); uint64_t *val = getMemory(numWords); @@ -427,7 +427,7 @@ APInt APInt::operator*(const APInt& RHS) const { assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); if (isSingleWord()) - return APInt(BitWidth, VAL * RHS.VAL).clearUnusedBits(); + return APInt(BitWidth, VAL * RHS.VAL); APInt Result(*this); Result *= RHS; return Result.clearUnusedBits(); @@ -436,7 +436,7 @@ APInt APInt::operator+(const APInt& RHS) const { assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); if (isSingleWord()) - return APInt(BitWidth, VAL + RHS.VAL).clearUnusedBits(); + return APInt(BitWidth, VAL + RHS.VAL); APInt Result(BitWidth, 0); add(Result.pVal, this->pVal, RHS.pVal, getNumWords()); return Result.clearUnusedBits(); @@ -445,7 +445,7 @@ APInt APInt::operator-(const APInt& RHS) const { assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); if (isSingleWord()) - return APInt(BitWidth, VAL - RHS.VAL).clearUnusedBits(); + return APInt(BitWidth, VAL - RHS.VAL); APInt Result(BitWidth, 0); sub(Result.pVal, this->pVal, RHS.pVal, getNumWords()); return Result.clearUnusedBits(); @@ -602,19 +602,19 @@ /// @brief Bitwise NOT operator. Performs a bitwise logical NOT operation on /// this APInt. APInt APInt::operator~() const { - APInt API(*this); - API.flip(); - return API; + APInt Result(*this); + Result.flip(); + return Result; } /// @brief Toggle every bit to its opposite value. APInt& APInt::flip() { if (isSingleWord()) { - VAL = ~VAL; + VAL ^= -1ULL; return clearUnusedBits(); } for (uint32_t i = 0; i < getNumWords(); ++i) - pVal[i] = ~pVal[i]; + pVal[i] ^= -1ULL; return clearUnusedBits(); } @@ -699,8 +699,13 @@ uint32_t APInt::countTrailingZeros() const { if (isSingleWord()) return CountTrailingZeros_64(VAL); - APInt Tmp( ~(*this) & ((*this) - APInt(BitWidth,1)) ); - return getNumWords() * APINT_BITS_PER_WORD - Tmp.countLeadingZeros(); + uint32_t Count = 0; + uint32_t i = 0; + for (; i < getNumWords() && pVal[i] == 0; ++i) + Count += APINT_BITS_PER_WORD; + if (i < getNumWords()) + Count += CountTrailingZeros_64(pVal[i]); + return Count; } uint32_t APInt::countPopulation() const { @@ -863,9 +868,8 @@ void APInt::sext(uint32_t width) { assert(width > BitWidth && "Invalid APInt SignExtend request"); assert(width <= IntegerType::MAX_INT_BITS && "Too many bits"); - bool isNegative = (*this)[BitWidth-1]; // If the sign bit isn't set, this is the same as zext. - if (!isNegative) { + if (!isNegative()) { zext(width); return; } @@ -929,35 +933,66 @@ /// Arithmetic right-shift this APInt by shiftAmt. /// @brief Arithmetic right-shift function. APInt APInt::ashr(uint32_t shiftAmt) const { + assert(shiftAmt <= BitWidth && "Invalid shift amount"); if (isSingleWord()) { if (shiftAmt == BitWidth) + return APInt(BitWidth, 0); // undefined + else { + uint32_t SignBit = APINT_BITS_PER_WORD - BitWidth; + return APInt(BitWidth, + (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt)); + } + } + + // If all the bits were shifted out, the result is 0 or -1. This avoids issues + // with shifting by the size of the integer type, which produces undefined + // results. + if (shiftAmt == BitWidth) + if (isNegative()) return APInt(BitWidth, -1ULL); else - return APInt(BitWidth, - (((int64_t(VAL) << (APINT_BITS_PER_WORD - BitWidth)) >> - (APINT_BITS_PER_WORD - BitWidth)) >> shiftAmt)).clearUnusedBits(); + return APInt(BitWidth, 0); + + // Create some space for the result. + uint64_t * val = new uint64_t[getNumWords()]; + + // If we are shifting less than a word, compute the shift with a simple carry + if (shiftAmt < APINT_BITS_PER_WORD) { + uint64_t carry = 0; + for (int i = getNumWords()-1; i >= 0; --i) { + val[i] = pVal[i] >> shiftAmt | carry; + carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt); + } + return APInt(val, BitWidth).clearUnusedBits(); } - APInt Result(*this); - if (shiftAmt >= BitWidth) { - memset(Result.pVal, Result[BitWidth-1] ? 1 : 0, - (getNumWords()-1) * APINT_WORD_SIZE); - return Result.clearUnusedBits(); - } + // Compute some values needed by the remaining shift algorithms + uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; + uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; - // FIXME: bit-at-a-time shift is really slow. - uint32_t i = 0; - for (; i < BitWidth - shiftAmt; ++i) - if (Result[i+shiftAmt]) - Result.set(i); - else - Result.clear(i); - for (; i < BitWidth; ++i) - if (Result[BitWidth-1]) - Result.set(i); - else - Result.clear(i); - return Result; + // If we are shifting whole words, just move whole words + if (wordShift == 0) { + for (uint32_t i = 0; i < getNumWords() - offset; ++i) + val[i] = pVal[i+offset]; + for (uint32_t i = getNumWords()-offset; i < getNumWords(); i++) + val[i] = (isNegative() ? -1ULL : 0); + return APInt(val,BitWidth).clearUnusedBits(); + } + + // Shift the low order words + uint32_t breakWord = getNumWords() - offset -1; + for (uint32_t i = 0; i < breakWord; ++i) + val[i] = pVal[i+offset] >> wordShift | + pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift); + // Shift the break word. + uint32_t SignBit = APINT_BITS_PER_WORD - (BitWidth % APINT_BITS_PER_WORD); + val[breakWord] = uint64_t( + (((int64_t(pVal[breakWord+offset]) << SignBit) >> SignBit) >> wordShift)); + + // Remaining words are 0 or -1 + for (uint32_t i = breakWord+1; i < getNumWords(); ++i) + val[i] = (isNegative() ? -1ULL : 0); + return APInt(val, BitWidth).clearUnusedBits(); } /// Logical right-shift this APInt by shiftAmt. @@ -1022,7 +1057,7 @@ if (isSingleWord()) { if (shiftAmt == BitWidth) return APInt(BitWidth, 0); // avoid undefined shift results - return APInt(BitWidth, VAL << shiftAmt).clearUnusedBits(); + return APInt(BitWidth, VAL << shiftAmt); } // If all the bits were shifted out, the result is 0. This avoids issues @@ -1148,7 +1183,7 @@ // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation // consists of a simple multiplication by a one-place number, combined with // a subtraction. - bool isNegative = false; + bool isNeg = false; for (uint32_t i = 0; i < n; ++i) { uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32); uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]); @@ -1166,7 +1201,7 @@ u[k]--; k++; } - isNegative |= borrow; + isNeg |= borrow; DEBUG(cerr << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " << u[j+i+1] << '\n'); } @@ -1178,7 +1213,7 @@ // true value plus b**(n+1), namely as the b's complement of // the true value, and a "borrow" to the left should be remembered. // - if (isNegative) { + if (isNeg) { bool carry = true; // true because b's complement is "complement + 1" for (uint32_t i = 0; i <= m+n; ++i) { u[i] = ~u[i] + carry; // b's complement @@ -1192,7 +1227,7 @@ // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was // negative, go to step D6; otherwise go on to step D7. q[j] = qp; - if (isNegative) { + if (isNeg) { // D6. [Add back]. The probability that this step is necessary is very // small, on the order of only 2/b. Make sure that test data accounts for // this possibility. Decrease q[j] by 1 @@ -1501,8 +1536,8 @@ assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && "Radix should be 2, 8, 10, or 16!"); assert(str && "String is null?"); - bool isNegative = str[0] == '-'; - if (isNegative) + bool isNeg = str[0] == '-'; + if (isNeg) str++, slen--; assert(slen <= numbits || radix != 2 && "Insufficient bit width"); assert(slen*3 <= numbits || radix != 8 && "Insufficient bit width"); @@ -1552,9 +1587,9 @@ *this += apdigit; } // If its negative, put it in two's complement form - if (isNegative) { + if (isNeg) { + (*this)--; this->flip(); - (*this)++; } } From reid at x10sys.com Mon Feb 26 01:45:57 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 01:45:57 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702260745.l1Q7jvUf006305@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.20 -> 1.21 --- Log message: Make isNegative() a const function since it doesn't modify the APInt. --- Diffs of the changes: (+1 -1) APInt.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.20 llvm/include/llvm/ADT/APInt.h:1.21 --- llvm/include/llvm/ADT/APInt.h:1.20 Sun Feb 25 19:20:59 2007 +++ llvm/include/llvm/ADT/APInt.h Mon Feb 26 01:45:40 2007 @@ -355,7 +355,7 @@ /// This just tests the high bit of this APInt to determine if it is negative. /// @returns true if this APInt is negative, false otherwise /// @brief Determine sign of this APInt. - bool isNegative() { + bool isNegative() const { return (*this)[BitWidth - 1]; } From sabre at nondot.org Mon Feb 26 01:50:19 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 01:50:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200702260750.l1Q7oJMA006635@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.339 -> 1.340 --- Log message: initial hack at splitting the x86-64 calling convention info out from the mechanics that process it. I'm still not happy with this, but it's a step in the right direction. --- Diffs of the changes: (+300 -272) X86ISelLowering.cpp | 572 +++++++++++++++++++++++++++------------------------- 1 files changed, 300 insertions(+), 272 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.339 llvm/lib/Target/X86/X86ISelLowering.cpp:1.340 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.339 Sun Feb 25 23:21:05 2007 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Feb 26 01:50:02 2007 @@ -833,7 +833,7 @@ // Return the new list of results. return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(), - &ArgValues[0], ArgValues.size()); + &ArgValues[0], ArgValues.size()).getValue(Op.ResNo); } SDOperand X86TargetLowering::LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG, @@ -1058,63 +1058,264 @@ // X86-64 C Calling Convention implementation //===----------------------------------------------------------------------===// -/// HowToPassX86_64CCCArgument - Returns how an formal argument of the specified -/// type should be passed. If it is through stack, returns the size of the stack -/// slot; if it is through integer or XMM register, returns the number of -/// integer or XMM registers are needed. -static void -HowToPassX86_64CCCArgument(MVT::ValueType ObjectVT, - unsigned NumIntRegs, unsigned NumXMMRegs, - unsigned &ObjSize, unsigned &ObjIntRegs, - unsigned &ObjXMMRegs) { - ObjSize = 0; - ObjIntRegs = 0; - ObjXMMRegs = 0; +class CallingConvState { + uint32_t UsedRegs[(X86::NUM_TARGET_REGS+31)/32]; + unsigned StackOffset; + const MRegisterInfo &MRI; +public: + CallingConvState(const MRegisterInfo &mri) : MRI(mri) { + // No stack is used. + StackOffset = 0; + + UsedRegs.resize(MRI.getNumRegs()); + // No registers are used. + memset(UsedRegs, 0, sizeof(UsedRegs)); + } + + unsigned getNextStackOffset() const { return StackOffset; } - switch (ObjectVT) { - default: assert(0 && "Unhandled argument type!"); - case MVT::i8: - case MVT::i16: - case MVT::i32: - case MVT::i64: - if (NumIntRegs < 6) - ObjIntRegs = 1; - else { - switch (ObjectVT) { - default: break; - case MVT::i8: ObjSize = 1; break; - case MVT::i16: ObjSize = 2; break; - case MVT::i32: ObjSize = 4; break; - case MVT::i64: ObjSize = 8; break; - } + /// isAllocated - Return true if the specified register (or an alias) is + /// allocated. + bool isAllocated(unsigned Reg) const { + return UsedRegs[Reg/32] & (1 << (Reg&31)); + } + + /// getFirstUnallocated - Return the first unallocated register in the set, or + /// NumRegs if they are all allocated. + unsigned getFirstUnallocated(const unsigned *Regs, unsigned NumRegs) const { + for (unsigned i = 0; i != NumRegs; ++i) + if (!isAllocated(Regs[i])) + return i; + return NumRegs; + } + + /// AllocateReg - Attempt to allocate one of the specified registers. If none + /// are available, return zero. Otherwise, return the first one available, + /// marking it and any aliases as allocated. + unsigned AllocateReg(const unsigned *Regs, unsigned NumRegs) { + unsigned FirstUnalloc = getFirstUnallocated(Regs, NumRegs); + if (FirstUnalloc == NumRegs) + return 0; // Didn't find the reg. + + // Mark the register and any aliases as allocated. + unsigned Reg = Regs[FirstUnalloc]; + MarkAllocated(Reg); + if (const unsigned *RegAliases = MRI.getAliasSet(Reg)) + for (; *RegAliases; ++RegAliases) + MarkAllocated(*RegAliases); + return Reg; + } + + /// AllocateStack - Allocate a chunk of stack space with the specified size + /// and alignment. + unsigned AllocateStack(unsigned Size, unsigned Align) { + assert(Align && ((Align-1) & Align) == 0); // Align is power of 2. + StackOffset = ((StackOffset + Align-1) & ~(Align-1)); + unsigned Result = StackOffset; + StackOffset += Size; + return Result; + } +private: + void MarkAllocated(unsigned Reg) { + UsedRegs[Reg/32] |= 1 << (Reg&31); + } +}; + +/// X86_64_CCC_AssignArgument - Implement the X86-64 C Calling Convention. +template +static void X86_64_CCC_AssignArgument(Client &C, CallingConvState &State, + MVT::ValueType ArgVT, unsigned ArgFlags, + DataTy Data) { + MVT::ValueType LocVT = ArgVT; + unsigned ExtendType = ISD::ANY_EXTEND; + + // Promote the integer to 32 bits. If the input type is signed use a + // sign extend, otherwise use a zero extend. + if (ArgVT == MVT::i8 || ArgVT == MVT::i16) { + LocVT = MVT::i32; + ExtendType = (ArgFlags & 1) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; + } + + // If this is a 32-bit value, assign to a 32-bit register if any are + // available. + if (LocVT == MVT::i32) { + static const unsigned GPR32ArgRegs[] = { + X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D + }; + if (unsigned Reg = State.AllocateReg(GPR32ArgRegs, 6)) { + C.AssignToReg(Data, Reg, ArgVT, LocVT, ExtendType); + return; } - break; - case MVT::f32: - case MVT::f64: - case MVT::v16i8: - case MVT::v8i16: - case MVT::v4i32: - case MVT::v2i64: - case MVT::v4f32: - case MVT::v2f64: - if (NumXMMRegs < 8) - ObjXMMRegs = 1; + } + + // If this is a 64-bit value, assign to a 64-bit register if any are + // available. + if (LocVT == MVT::i64) { + static const unsigned GPR64ArgRegs[] = { + X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9 + }; + if (unsigned Reg = State.AllocateReg(GPR64ArgRegs, 6)) { + C.AssignToReg(Data, Reg, ArgVT, LocVT, ExtendType); + return; + } + } + + // If this is a FP or vector type, assign to an XMM reg if any are + // available. + if (MVT::isVector(LocVT) || MVT::isFloatingPoint(LocVT)) { + static const unsigned XMMArgRegs[] = { + X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3, + X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 + }; + if (unsigned Reg = State.AllocateReg(XMMArgRegs, 8)) { + C.AssignToReg(Data, Reg, ArgVT, LocVT, ExtendType); + return; + } + } + + // Integer/FP values get stored in stack slots that are 8 bytes in size and + // 8-byte aligned if there are no more registers to hold them. + if (LocVT == MVT::i32 || LocVT == MVT::i64 || + LocVT == MVT::f32 || LocVT == MVT::f64) { + unsigned Offset = State.AllocateStack(8, 8); + C.AssignToStack(Data, Offset, ArgVT, LocVT, ExtendType); + return; + } + + // Vectors get 16-byte stack slots that are 16-byte aligned. + if (MVT::isVector(LocVT)) { + unsigned Offset = State.AllocateStack(16, 16); + C.AssignToStack(Data, Offset, ArgVT, LocVT, ExtendType); + return; + } + assert(0 && "Unknown argument type!"); +} + +class LowerArgumentsClient { + SelectionDAG &DAG; + X86TargetLowering &TLI; + SmallVector &ArgValues; + SDOperand Chain; +public: + LowerArgumentsClient(SelectionDAG &dag, X86TargetLowering &tli, + SmallVector &argvalues, + SDOperand chain) + : DAG(dag), TLI(tli), ArgValues(argvalues), Chain(chain) { + + } + + void AssignToReg(SDOperand Arg, unsigned RegNo, + MVT::ValueType ArgVT, MVT::ValueType RegVT, + unsigned ExtendType) { + TargetRegisterClass *RC = NULL; + if (RegVT == MVT::i32) + RC = X86::GR32RegisterClass; + else if (RegVT == MVT::i64) + RC = X86::GR64RegisterClass; + else if (RegVT == MVT::f32) + RC = X86::FR32RegisterClass; + else if (RegVT == MVT::f64) + RC = X86::FR64RegisterClass; else { - switch (ObjectVT) { - default: break; - case MVT::f32: ObjSize = 4; break; - case MVT::f64: ObjSize = 8; break; - case MVT::v16i8: - case MVT::v8i16: - case MVT::v4i32: - case MVT::v2i64: - case MVT::v4f32: - case MVT::v2f64: ObjSize = 16; break; + RC = X86::VR128RegisterClass; } - break; + + SDOperand ArgValue = DAG.getCopyFromReg(Chain, RegNo, RegVT); + AddLiveIn(DAG.getMachineFunction(), RegNo, RC); + + // If this is an 8 or 16-bit value, it is really passed promoted to 32 + // bits. Insert an assert[sz]ext to capture this, then truncate to the + // right size. + if (ArgVT < RegVT) { + if (ExtendType == ISD::SIGN_EXTEND) { + ArgValue = DAG.getNode(ISD::AssertSext, RegVT, ArgValue, + DAG.getValueType(ArgVT)); + } else if (ExtendType == ISD::ZERO_EXTEND) { + ArgValue = DAG.getNode(ISD::AssertZext, RegVT, ArgValue, + DAG.getValueType(ArgVT)); + } + ArgValue = DAG.getNode(ISD::TRUNCATE, ArgVT, ArgValue); + } + + ArgValues.push_back(ArgValue); } + + void AssignToStack(SDOperand Arg, unsigned Offset, + MVT::ValueType ArgVT, MVT::ValueType DestVT, + unsigned ExtendType) { + // Create the SelectionDAG nodes corresponding to a load from this + // parameter. + MachineFunction &MF = DAG.getMachineFunction(); + MachineFrameInfo *MFI = MF.getFrameInfo(); + int FI = MFI->CreateFixedObject(MVT::getSizeInBits(ArgVT)/8, Offset); + SDOperand FIN = DAG.getFrameIndex(FI, TLI.getPointerTy()); + ArgValues.push_back(DAG.getLoad(ArgVT, Chain, FIN, NULL, 0)); + } +}; + +class LowerCallArgumentsClient { + SelectionDAG &DAG; + X86TargetLowering &TLI; + SmallVector, 8> &RegsToPass; + SmallVector &MemOpChains; + SDOperand Chain; + SDOperand StackPtr; +public: + LowerCallArgumentsClient(SelectionDAG &dag, X86TargetLowering &tli, + SmallVector, 8> &rtp, + SmallVector &moc, + SDOperand chain) + : DAG(dag), TLI(tli), RegsToPass(rtp), MemOpChains(moc), Chain(chain) { + } -} + + void AssignToReg(SDOperand Arg, unsigned RegNo, + MVT::ValueType ArgVT, MVT::ValueType RegVT, + unsigned ExtendType) { + // If the argument has to be extended somehow before being passed, do so. + if (ArgVT < RegVT) + Arg = DAG.getNode(ExtendType, RegVT, Arg); + + RegsToPass.push_back(std::make_pair(RegNo, Arg)); + } + + void AssignToStack(SDOperand Arg, unsigned Offset, + MVT::ValueType ArgVT, MVT::ValueType DestVT, + unsigned ExtendType) { + // If the argument has to be extended somehow before being stored, do so. + if (ArgVT < DestVT) + Arg = DAG.getNode(ExtendType, DestVT, Arg); + + SDOperand SP = getSP(); + SDOperand PtrOff = DAG.getConstant(Offset, SP.getValueType()); + PtrOff = DAG.getNode(ISD::ADD, SP.getValueType(), SP, PtrOff); + MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0)); + } +private: + SDOperand getSP() { + if (StackPtr.Val == 0) { + MVT::ValueType PtrTy = TLI.getPointerTy(); + StackPtr = DAG.getRegister(TLI.getStackPtrReg(), PtrTy); + } + return StackPtr; + } +}; + +class EmptyArgumentsClient { +public: + EmptyArgumentsClient() {} + + void AssignToReg(SDOperand Arg, unsigned RegNo, + MVT::ValueType ArgVT, MVT::ValueType RegVT, + unsigned ExtendType) { + } + + void AssignToStack(SDOperand Arg, unsigned Offset, + MVT::ValueType ArgVT, MVT::ValueType DestVT, + unsigned ExtendType) { + } +}; + SDOperand X86TargetLowering::LowerX86_64CCCArguments(SDOperand Op, SelectionDAG &DAG) { @@ -1123,23 +1324,7 @@ MachineFrameInfo *MFI = MF.getFrameInfo(); SDOperand Root = Op.getOperand(0); bool isVarArg = cast(Op.getOperand(2))->getValue() != 0; - SmallVector ArgValues; - // Add DAG nodes to load the arguments... On entry to a function on the X86, - // the stack frame looks like this: - // - // [RSP] -- return address - // [RSP + 8] -- first nonreg argument (leftmost lexically) - // [RSP +16] -- second nonreg argument, if 1st argument is <= 8 bytes in size - // ... - // - unsigned ArgOffset = 0; // Frame mechanisms handle retaddr slot - unsigned NumIntRegs = 0; // Int regs used for parameter passing. - unsigned NumXMMRegs = 0; // XMM regs used for parameter passing. - - static const unsigned GPR32ArgRegs[] = { - X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D - }; static const unsigned GPR64ArgRegs[] = { X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9 }; @@ -1148,105 +1333,33 @@ X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 }; - for (unsigned i = 0; i < NumArgs; ++i) { - MVT::ValueType ObjectVT = Op.getValue(i).getValueType(); + SmallVector ArgValues; + + + CallingConvState CCState(*getTargetMachine().getRegisterInfo()); + LowerArgumentsClient Client(DAG, *this, ArgValues, Root); + + for (unsigned i = 0; i != NumArgs; ++i) { + MVT::ValueType ArgVT = Op.getValue(i).getValueType(); unsigned ArgFlags = cast(Op.getOperand(3+i))->getValue(); - unsigned ArgIncrement = 8; - unsigned ObjSize = 0; - unsigned ObjIntRegs = 0; - unsigned ObjXMMRegs = 0; - // FIXME: __int128 and long double support? - HowToPassX86_64CCCArgument(ObjectVT, NumIntRegs, NumXMMRegs, - ObjSize, ObjIntRegs, ObjXMMRegs); - if (ObjSize > 8) - ArgIncrement = ObjSize; - - unsigned Reg = 0; - SDOperand ArgValue; - if (ObjIntRegs || ObjXMMRegs) { - switch (ObjectVT) { - default: assert(0 && "Unhandled argument type!"); - case MVT::i8: - case MVT::i16: - case MVT::i32: - case MVT::i64: { - TargetRegisterClass *RC = NULL; - switch (ObjectVT) { - default: assert(0 && "Unknown integer VT!"); - case MVT::i8: - case MVT::i16: - case MVT::i32: - RC = X86::GR32RegisterClass; - Reg = GPR32ArgRegs[NumIntRegs]; - ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i32); - break; - case MVT::i64: - RC = X86::GR64RegisterClass; - Reg = GPR64ArgRegs[NumIntRegs]; - ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i64); - break; - } - Reg = AddLiveIn(MF, Reg, RC); - - // If this is an 8 or 16-bit value, it is really passed promoted to 32 - // bits. Insert an assert[sz]ext to capture this, then truncate to the - // right size. - if (ObjectVT == MVT::i8 || ObjectVT == MVT::i16) { - // FIXME: FORMAL_ARGUMENTS can't currently distinguish between an - // argument with undefined high bits, so we can't insert a assertzext - // yet. - if (ArgFlags & 1) { - unsigned ExtOpc = (ArgFlags & 1) ? ISD::AssertSext :ISD::AssertZext; - ArgValue = DAG.getNode(ExtOpc, MVT::i32, ArgValue, - DAG.getValueType(ObjectVT)); - } - ArgValue = DAG.getNode(ISD::TRUNCATE, ObjectVT, ArgValue); - } - break; - } - case MVT::f32: - case MVT::f64: - case MVT::v16i8: - case MVT::v8i16: - case MVT::v4i32: - case MVT::v2i64: - case MVT::v4f32: - case MVT::v2f64: { - TargetRegisterClass *RC= (ObjectVT == MVT::f32) ? - X86::FR32RegisterClass : ((ObjectVT == MVT::f64) ? - X86::FR64RegisterClass : X86::VR128RegisterClass); - Reg = AddLiveIn(MF, XMMArgRegs[NumXMMRegs], RC); - ArgValue = DAG.getCopyFromReg(Root, Reg, ObjectVT); - break; - } - } - NumIntRegs += ObjIntRegs; - NumXMMRegs += ObjXMMRegs; - } else if (ObjSize) { - // XMM arguments have to be aligned on 16-byte boundary. - if (ObjSize == 16) - ArgOffset = ((ArgOffset + 15) / 16) * 16; - // Create the SelectionDAG nodes corresponding to a load from this - // parameter. - int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); - SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); - ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0); - ArgOffset += ArgIncrement; // Move on to the next argument. - } - - ArgValues.push_back(ArgValue); + X86_64_CCC_AssignArgument(Client, CCState, ArgVT, ArgFlags, SDOperand()); } + unsigned StackSize = CCState.getNextStackOffset(); + // If the function takes variable number of arguments, make a frame index for // the start of the first vararg value... for expansion of llvm.va_start. if (isVarArg) { + unsigned NumIntRegs = CCState.getFirstUnallocated(GPR64ArgRegs, 6); + unsigned NumXMMRegs = CCState.getFirstUnallocated(XMMArgRegs, 8); + // For X86-64, if there are vararg parameters that are passed via // registers, then we must store them to their spots on the stack so they // may be loaded by deferencing the result of va_next. VarArgsGPOffset = NumIntRegs * 8; VarArgsFPOffset = 6 * 8 + NumXMMRegs * 16; - VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset); + VarArgsFrameIndex = MFI->CreateFixedObject(1, StackSize); RegSaveFrameIndex = MFI->CreateStackObject(6 * 8 + 8 * 16, 16); // Store the integer parameter registers. @@ -1285,11 +1398,11 @@ ReturnAddrIndex = 0; // No return address slot generated yet. BytesToPopOnReturn = 0; // Callee pops nothing. - BytesCallerReserves = ArgOffset; + BytesCallerReserves = StackSize; // Return the new list of results. return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(), - &ArgValues[0], ArgValues.size()); + &ArgValues[0], ArgValues.size()).getValue(Op.ResNo); } SDOperand @@ -1303,129 +1416,38 @@ // Count how many bytes are to be pushed on the stack. unsigned NumBytes = 0; - unsigned NumIntRegs = 0; // Int regs used for parameter passing. - unsigned NumXMMRegs = 0; // XMM regs used for parameter passing. - - static const unsigned GPR32ArgRegs[] = { - X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D - }; - static const unsigned GPR64ArgRegs[] = { - X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9 - }; - static const unsigned XMMArgRegs[] = { - X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3, - X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 - }; - - for (unsigned i = 0; i != NumOps; ++i) { - SDOperand Arg = Op.getOperand(5+2*i); - MVT::ValueType ArgVT = Arg.getValueType(); - - switch (ArgVT) { - default: assert(0 && "Unknown value type!"); - case MVT::i8: - case MVT::i16: - case MVT::i32: - case MVT::i64: - if (NumIntRegs < 6) - ++NumIntRegs; - else - NumBytes += 8; - break; - case MVT::f32: - case MVT::f64: - case MVT::v16i8: - case MVT::v8i16: - case MVT::v4i32: - case MVT::v2i64: - case MVT::v4f32: - case MVT::v2f64: - if (NumXMMRegs < 8) - NumXMMRegs++; - else if (ArgVT == MVT::f32 || ArgVT == MVT::f64) - NumBytes += 8; - else { - // XMM arguments have to be aligned on 16-byte boundary. - NumBytes = ((NumBytes + 15) / 16) * 16; - NumBytes += 16; - } - break; + { + CallingConvState CCState(*getTargetMachine().getRegisterInfo()); + EmptyArgumentsClient Client; + + for (unsigned i = 0; i != NumOps; ++i) { + SDOperand Arg = Op.getOperand(5+2*i); + MVT::ValueType ArgVT = Arg.getValueType(); + unsigned ArgFlags = + cast(Op.getOperand(5+2*i+1))->getValue(); + X86_64_CCC_AssignArgument(Client, CCState, ArgVT, ArgFlags, Arg); } + + NumBytes = CCState.getNextStackOffset(); } + Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy())); - // Arguments go on the stack in reverse order, as specified by the ABI. - unsigned ArgOffset = 0; - NumIntRegs = 0; - NumXMMRegs = 0; SmallVector, 8> RegsToPass; SmallVector MemOpChains; - SDOperand StackPtr = DAG.getRegister(X86StackPtr, getPointerTy()); + + CallingConvState CCState(*getTargetMachine().getRegisterInfo()); + LowerCallArgumentsClient Client(DAG, *this, RegsToPass, MemOpChains, Chain); + for (unsigned i = 0; i != NumOps; ++i) { SDOperand Arg = Op.getOperand(5+2*i); MVT::ValueType ArgVT = Arg.getValueType(); - unsigned ArgFlags =cast(Op.getOperand(5+2*i+1))->getValue(); - - if (MVT::isInteger(ArgVT) && ArgVT < MVT::i32) { - // Promote the integer to 32 bits. If the input type is signed use a - // sign extend, otherwise use a zero extend. - unsigned ExtOpc = (ArgFlags & 1) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; - Arg = DAG.getNode(ExtOpc, MVT::i32, Arg); - ArgVT = MVT::i32; - } - - switch (ArgVT) { - default: assert(0 && "Unexpected ValueType for argument!"); - case MVT::i8: - case MVT::i16: - case MVT::i32: - case MVT::i64: - if (NumIntRegs < 6) { - unsigned Reg = 0; - switch (ArgVT) { - default: assert(0 && "Unknown integer size!"); - case MVT::i32: - Reg = GPR32ArgRegs[NumIntRegs]; - break; - case MVT::i64: Reg = GPR64ArgRegs[NumIntRegs]; break; - } - RegsToPass.push_back(std::make_pair(Reg, Arg)); - ++NumIntRegs; - } else { - SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy()); - PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff); - MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0)); - ArgOffset += 8; - } - break; - case MVT::f32: - case MVT::f64: - case MVT::v16i8: - case MVT::v8i16: - case MVT::v4i32: - case MVT::v2i64: - case MVT::v4f32: - case MVT::v2f64: - if (NumXMMRegs < 8) { - RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg)); - NumXMMRegs++; - } else { - if (ArgVT != MVT::f32 && ArgVT != MVT::f64) { - // XMM arguments have to be aligned on 16-byte boundary. - ArgOffset = ((ArgOffset + 15) / 16) * 16; - } - SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy()); - PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff); - MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0)); - if (ArgVT == MVT::f32 || ArgVT == MVT::f64) - ArgOffset += 8; - else - ArgOffset += 16; - } - } + unsigned ArgFlags = + cast(Op.getOperand(5+2*i+1))->getValue(); + X86_64_CCC_AssignArgument(Client, CCState, ArgVT, ArgFlags, Arg); } - + if (!MemOpChains.empty()) Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, &MemOpChains[0], MemOpChains.size()); @@ -1447,6 +1469,14 @@ // of SSE registers used. The contents of %al do not need to match exactly // the number of registers, but must be an ubound on the number of SSE // registers used and is in the range 0 - 8 inclusive. + + // Count the number of XMM registers allocated. + static const unsigned XMMArgRegs[] = { + X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3, + X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 + }; + unsigned NumXMMRegs = CCState.getFirstUnallocated(XMMArgRegs, 8); + Chain = DAG.getCopyToReg(Chain, X86::AL, DAG.getConstant(NumXMMRegs, MVT::i8), InFlag); InFlag = Chain.getValue(1); @@ -1523,8 +1553,6 @@ // This calling convention always arranges for the callee pop value to be 8n+4 // bytes, which is needed for tail recursion elimination and stack alignment // reasons. - - SDOperand X86TargetLowering::LowerFastCCArguments(SDOperand Op, SelectionDAG &DAG, bool isFastCall) { @@ -1670,7 +1698,7 @@ // Return the new list of results. return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(), - &ArgValues[0], ArgValues.size()); + &ArgValues[0], ArgValues.size()).getValue(Op.ResNo); } SDOperand X86TargetLowering::LowerFastCCCallTo(SDOperand Op, SelectionDAG &DAG, From sabre at nondot.org Mon Feb 26 01:51:16 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 01:51:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702260751.l1Q7pGjL006747@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.46 -> 1.47 --- Log message: another missing header :( :( :( --- Diffs of the changes: (+4 -0) APInt.cpp | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.46 llvm/lib/Support/APInt.cpp:1.47 --- llvm/lib/Support/APInt.cpp:1.46 Mon Feb 26 01:44:38 2007 +++ llvm/lib/Support/APInt.cpp Mon Feb 26 01:51:00 2007 @@ -13,6 +13,7 @@ // //===----------------------------------------------------------------------===// +#if 0 #define DEBUG_TYPE "apint" #include "llvm/ADT/APInt.h" #include "llvm/DerivedTypes.h" @@ -1681,3 +1682,6 @@ cerr << " (" << this->toString(10, false) << ")\n" << std::setbase(10); } #endif + +#endif + From sabre at nondot.org Mon Feb 26 02:00:10 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 02:00:10 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200702260800.l1Q80A1Y007325@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.340 -> 1.341 --- Log message: switch to smallvector --- Diffs of the changes: (+1 -3) X86ISelLowering.cpp | 4 +--- 1 files changed, 1 insertion(+), 3 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.340 llvm/lib/Target/X86/X86ISelLowering.cpp:1.341 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.340 Mon Feb 26 01:50:02 2007 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Feb 26 01:59:53 2007 @@ -1059,17 +1059,15 @@ //===----------------------------------------------------------------------===// class CallingConvState { - uint32_t UsedRegs[(X86::NUM_TARGET_REGS+31)/32]; unsigned StackOffset; const MRegisterInfo &MRI; + SmallVector UsedRegs; public: CallingConvState(const MRegisterInfo &mri) : MRI(mri) { // No stack is used. StackOffset = 0; UsedRegs.resize(MRI.getNumRegs()); - // No registers are used. - memset(UsedRegs, 0, sizeof(UsedRegs)); } unsigned getNextStackOffset() const { return StackOffset; } From reid at x10sys.com Mon Feb 26 02:11:14 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 02:11:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702260811.l1Q8BETX010497@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.47 -> 1.48 --- Log message: Re-enable this. The header was committed. --- Diffs of the changes: (+0 -4) APInt.cpp | 4 ---- 1 files changed, 4 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.47 llvm/lib/Support/APInt.cpp:1.48 --- llvm/lib/Support/APInt.cpp:1.47 Mon Feb 26 01:51:00 2007 +++ llvm/lib/Support/APInt.cpp Mon Feb 26 02:10:54 2007 @@ -13,7 +13,6 @@ // //===----------------------------------------------------------------------===// -#if 0 #define DEBUG_TYPE "apint" #include "llvm/ADT/APInt.h" #include "llvm/DerivedTypes.h" @@ -1682,6 +1681,3 @@ cerr << " (" << this->toString(10, false) << ")\n" << std::setbase(10); } #endif - -#endif - From clattner at apple.com Mon Feb 26 10:30:04 2007 From: clattner at apple.com (clattner at apple.com) Date: Mon, 26 Feb 2007 08:30:04 -0800 (PST) Subject: [llvm-commits] [124234] Change LLVM_TARGET_INTRINSIC_LOWER to not implicitly return. Message-ID: <20070226163004.DD7CF6617DC7@src> Revision: 124234 Author: clattner Date: 2007-02-23 20:15:35 -0800 (Fri, 23 Feb 2007) Log Message: ----------- Change LLVM_TARGET_INTRINSIC_LOWER to not implicitly return. Change LLVM_TARGET_INTRINSIC_LOWER to pass in the exp of the call. Change llvm-i386.c to emit an error on a bogus _mm_shuffle_epi32, instead of producing an arcane error message from llvm stuff. Modified Paths: -------------- apple-local/branches/llvm/gcc/config/i386/i386.h apple-local/branches/llvm/gcc/config/i386/llvm-i386.cpp apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp apple-local/branches/llvm/gcc/config/rs6000/rs6000.h apple-local/branches/llvm/gcc/llvm-convert.cpp apple-local/branches/llvm/gcc/llvm-internal.h Modified: apple-local/branches/llvm/gcc/config/i386/i386.h =================================================================== --- apple-local/branches/llvm/gcc/config/i386/i386.h 2007-02-23 20:14:43 UTC (rev 124233) +++ apple-local/branches/llvm/gcc/config/i386/i386.h 2007-02-24 04:15:35 UTC (rev 124234) @@ -4059,12 +4059,12 @@ * macro should call the target TreeToLLVM::TargetIntrinsicLower method and * return true.This macro is invoked from a method in the TreeToLLVM class. */ -#define LLVM_TARGET_INTRINSIC_LOWER(BUILTIN_CODE, DESTLOC, RESULT, \ +#define LLVM_TARGET_INTRINSIC_LOWER(EXP, BUILTIN_CODE, DESTLOC, RESULT, \ DESTTY, OPS, ARGS, CURBB, \ RESISSIGNED, EXPISSIGNED) \ - return TargetIntrinsicLower(BUILTIN_CODE, DESTLOC, RESULT, \ - DESTTY, OPS, ARGS, CURBB, \ - RESISSIGNED, EXPISSIGNED); + TargetIntrinsicLower(EXP, BUILTIN_CODE, DESTLOC, RESULT, \ + DESTTY, OPS, ARGS, CURBB, \ + RESISSIGNED, EXPISSIGNED); /* APPLE LOCAL end LLVM */ /* Modified: apple-local/branches/llvm/gcc/config/i386/llvm-i386.cpp =================================================================== --- apple-local/branches/llvm/gcc/config/i386/llvm-i386.cpp 2007-02-23 20:14:43 UTC (rev 124233) +++ apple-local/branches/llvm/gcc/config/i386/llvm-i386.cpp 2007-02-24 04:15:35 UTC (rev 124234) @@ -30,6 +30,10 @@ #include "llvm/Intrinsics.h" #include "llvm/Module.h" +extern "C" { +#include "toplev.h" +} + /* TargetIntrinsicCastResult - This function just provides a frequently * used sequence for use inside TargetIntrinsicLower. */ static void TargetIntrinsicCastResult(Value *&Result, const Type *ResultType, bool ResIsSigned, bool ExpIsSigned, @@ -48,7 +52,8 @@ * LLVM code, emit the code now. If we can handle the code, this macro should * emit the code, return true. */ -bool TreeToLLVM::TargetIntrinsicLower(unsigned FnCode, +bool TreeToLLVM::TargetIntrinsicLower(tree exp, + unsigned FnCode, Value *DestLoc, Value *&Result, const Type *ResultType, @@ -280,9 +285,12 @@ Result = BuildVectorShuffle(Ops[0], Ops[1], ((EV & 0x03) >> 0), ((EV & 0x0c) >> 2), ((EV & 0x30) >> 4)+4, ((EV & 0xc0) >> 6)+4); - return true; + } else { + error("%Hmask must be an immediate", &EXPR_LOCATION(exp)); + Result = Ops[0]; } - return false; + + return true; case IX86_BUILTIN_PSHUFW: case IX86_BUILTIN_PSHUFD: if (ConstantInt *Elt = dyn_cast(Ops[1])) { @@ -290,9 +298,11 @@ Result = BuildVectorShuffle(Ops[0], Ops[0], ((EV & 0x03) >> 0), ((EV & 0x0c) >> 2), ((EV & 0x30) >> 4), ((EV & 0xc0) >> 6)); - return true; + } else { + error("%Hmask must be an immediate", &EXPR_LOCATION(exp)); + Result = Ops[0]; } - return false; + return true; case IX86_BUILTIN_PSHUFHW: if (ConstantInt *Elt = dyn_cast(Ops[1])) { int EV = Elt->getZExtValue(); @@ -310,9 +320,12 @@ ((EV & 0x03) >> 0), ((EV & 0x0c) >> 2), ((EV & 0x30) >> 4), ((EV & 0xc0) >> 6), 4, 5, 6, 7); - return true; + } else { + error("%Hmask must be an immediate", &EXPR_LOCATION(exp)); + Result = Ops[0]; } - return false; + + return true; case IX86_BUILTIN_PUNPCKHBW128: Result = BuildVectorShuffle(Ops[0], Ops[1], 8, 24, 9, 25, 10, 26, 11, 27, Modified: apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp =================================================================== --- apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp 2007-02-23 20:14:43 UTC (rev 124233) +++ apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp 2007-02-24 04:15:35 UTC (rev 124234) @@ -114,7 +114,8 @@ * invocation into normal LLVM code. If the target can handle the builtin, this * function should emit the expanded code and return true. */ -bool TreeToLLVM::TargetIntrinsicLower(unsigned FnCode, +bool TreeToLLVM::TargetIntrinsicLower(tree_node *exp, + unsigned FnCode, Value *DestLoc, Value *&Result, const Type *ResultType, Modified: apple-local/branches/llvm/gcc/config/rs6000/rs6000.h =================================================================== --- apple-local/branches/llvm/gcc/config/rs6000/rs6000.h 2007-02-23 20:14:43 UTC (rev 124233) +++ apple-local/branches/llvm/gcc/config/rs6000/rs6000.h 2007-02-24 04:15:35 UTC (rev 124234) @@ -3640,11 +3640,11 @@ * macro should call the target TreeToLLVM::TargetIntrinsicLower method and * return true.This macro is invoked from a method in the TreeToLLVM class. */ -#define LLVM_TARGET_INTRINSIC_LOWER(BUILTIN_CODE, DESTLOC, RESULT, \ +#define LLVM_TARGET_INTRINSIC_LOWER(EXP, BUILTIN_CODE, DESTLOC, RESULT, \ DESTTY, OPS, ARGS, CURBB, \ RESISSIGNED, EXPISSIGNED) \ - return TargetIntrinsicLower(BUILTIN_CODE, DESTLOC, RESULT, \ - DESTTY, OPS, ARGS, CURBB, \ - RESISSIGNED, EXPISSIGNED); + TargetIntrinsicLower(EXP, BUILTIN_CODE, DESTLOC, RESULT, \ + DESTTY, OPS, ARGS, CURBB, \ + RESISSIGNED, EXPISSIGNED); /* APPLE LOCAL end LLVM */ Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-23 20:14:43 UTC (rev 124233) +++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-24 04:15:35 UTC (rev 124234) @@ -3448,8 +3448,9 @@ bool ResIsSigned = !TYPE_UNSIGNED(TREE_TYPE(TREE_TYPE(fndecl))); bool ExpIsSigned = !TYPE_UNSIGNED(TREE_TYPE(exp)); unsigned FnCode = DECL_FUNCTION_CODE(fndecl); - LLVM_TARGET_INTRINSIC_LOWER(FnCode, DestLoc, Result, ResultType, Operands, - Args, CurBB, ResIsSigned, ExpIsSigned); + return LLVM_TARGET_INTRINSIC_LOWER(exp, FnCode, DestLoc, Result, ResultType, + Operands, Args, CurBB, ResIsSigned, + ExpIsSigned); #endif return false; } Modified: apple-local/branches/llvm/gcc/llvm-internal.h =================================================================== --- apple-local/branches/llvm/gcc/llvm-internal.h 2007-02-23 20:14:43 UTC (rev 124233) +++ apple-local/branches/llvm/gcc/llvm-internal.h 2007-02-24 04:15:35 UTC (rev 124234) @@ -473,7 +473,8 @@ Value *EmitCONSTRUCTOR(tree_node *exp, Value *DestLoc); // Optional target defined builtin intrinsic expanding function. - bool TargetIntrinsicLower(unsigned FnCode, + bool TargetIntrinsicLower(tree_node *exp, + unsigned FnCode, Value *DestLoc, Value *&Result, const Type *ResultType, From reid at x10sys.com Mon Feb 26 11:50:51 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 11:50:51 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702261750.l1QHophZ029603@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.21 -> 1.22 --- Log message: Implement inline methods that make transition of ConstantInt to use APInt easier to comprehend and might be useful elsewhere. --- Diffs of the changes: (+38 -2) APInt.h | 40 ++++++++++++++++++++++++++++++++++++++-- 1 files changed, 38 insertions(+), 2 deletions(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.21 llvm/include/llvm/ADT/APInt.h:1.22 --- llvm/include/llvm/ADT/APInt.h:1.21 Mon Feb 26 01:45:40 2007 +++ llvm/include/llvm/ADT/APInt.h Mon Feb 26 11:50:32 2007 @@ -463,12 +463,12 @@ /// if isSign == true, it should be largest signed value, otherwise largest /// unsigned value. /// @brief Gets max value of the APInt with bitwidth <= 64. - static APInt getMaxValue(uint32_t numBits, bool isSign); + static APInt getMaxValue(uint32_t numBits, bool isSigned); /// @returns the smallest value for an APInt of the given bit-width and /// if isSign == true, it should be smallest signed value, otherwise zero. /// @brief Gets min value of the APInt with bitwidth <= 64. - static APInt getMinValue(uint32_t numBits, bool isSign); + static APInt getMinValue(uint32_t numBits, bool isSigned); /// @returns the all-ones value for an APInt of the specified bit-width. /// @brief Get the all-ones value. @@ -484,6 +484,42 @@ return countLeadingZeros() != BitWidth; } + /// This checks to see if the value has all bits of the APInt are set or not. + /// @brief Determine if all bits are set + inline bool isAllOnesValue() const { + return countPopulation() == BitWidth; + } + + /// This checks to see if the value of this APInt is the maximum unsigned + /// value for the APInt's bit width. + /// @brief Determine if this is the largest unsigned value. + bool isMaxValue() const { + return countPopulation() == BitWidth; + } + + /// This checks to see if the value of this APInt is the maximum signed + /// value for the APInt's bit width. + /// @brief Determine if this is the largest signed value. + bool isMaxSignedValue() const { + return BitWidth == 1 ? VAL == 0 : + !isNegative() && countPopulation() == BitWidth - 1; + } + + /// This checks to see if the value of this APInt is the minimum signed + /// value for the APInt's bit width. + /// @brief Determine if this is the smallest unsigned value. + bool isMinValue() const { + return countPopulation() == 0; + } + + /// This checks to see if the value of this APInt is the minimum signed + /// value for the APInt's bit width. + /// @brief Determine if this is the smallest signed value. + bool isMinSignedValue() const { + return BitWidth == 1 ? VAL == 1 : + isNegative() && countPopulation() == 1; + } + /// @returns a character interpretation of the APInt. std::string toString(uint8_t radix = 10, bool wantSigned = true) const; From sabre at nondot.org Mon Feb 26 12:17:31 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 12:17:31 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86CallingConv.td X86.td Message-ID: <200702261817.l1QIHVlx030080@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86CallingConv.td added (r1.1) X86.td updated: 1.28 -> 1.29 --- Log message: Add a description of the X86-64 calling convention and the return conventions. This doesn't do anything yet, but may in the future. --- Diffs of the changes: (+143 -0) X86.td | 11 ++++ X86CallingConv.td | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) Index: llvm/lib/Target/X86/X86CallingConv.td diff -c /dev/null llvm/lib/Target/X86/X86CallingConv.td:1.1 *** /dev/null Mon Feb 26 12:17:24 2007 --- llvm/lib/Target/X86/X86CallingConv.td Mon Feb 26 12:17:14 2007 *************** *** 0 **** --- 1,132 ---- + //===- X86CallingConv.td - Calling Conventions for X86 32/64 ----*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This describes the calling conventions for the X86-32 and X86-64 + // architectures. + // + //===----------------------------------------------------------------------===// + + + class CCAction; + class CallingConv; + + + /// CCMatchType - If the current argument is one of the specified types, apply + /// Action A. + class CCMatchType VTs, CCAction A> : CCAction { + } + + /// CCMatchIf - If the predicate matches, apply A. + class CCMatchIf : CCAction { + string Predicate = predicate; + } + + /// CCAssignToReg - This action matches if there is a register in the specified + /// list that is still available. If so, it assigns the value to the first + /// available register and succeeds. + class CCAssignToReg regList> : CCAction { + list RegList = regList; + } + + /// CCAssignToStack - This action always matches: it assigns the value to a + /// stack slot of the specified size and alignment on the stack. + class CCAssignToStack : CCAction { + int Size = size; + int Align = align; + } + + + + /// CCPromoteToType - If applied, this promotes the specified current value to + /// the specified type. + class CCPromoteToType : CCAction { + ValueType DestTy = destTy; + } + + /// CCDelegateTo - This action invokes the specified sub-calling-convention. It + /// is successful if the specified CC matches. + class CCDelegateTo : CCAction { + CallingConv CC = cc; + } + + + class CallingConv actions> { + list Actions = actions; + } + + //===----------------------------------------------------------------------===// + // Return Value Calling Conventions + //===----------------------------------------------------------------------===// + + def RetCC_X86Common : CallingConv<[ + // Scalar values are returned in AX first, then DX. + CCMatchType<[i8] , CCAssignToReg<[AL]>>, + CCMatchType<[i16], CCAssignToReg<[AX]>>, + CCMatchType<[i32], CCAssignToReg<[EAX, EDX]>>, + CCMatchType<[i64], CCAssignToReg<[RAX, RDX]>>, + + // Vector types are always returned in XMM0. If the target doesn't have XMM0, + // it won't have vector types. + CCMatchType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToReg<[XMM0]>> + ]>; + + // Return conventions for the X86-32 C calling convention. + def RetCC_X86_32_C : CallingConv<[ + // The X86-32 calling convention returns FP values in ST0, otherwise it is the + // same as the common X86 calling conv. + CCMatchType<[f32], CCAssignToReg<[ST0]>>, + CCMatchType<[f64], CCAssignToReg<[ST0]>>, + CCDelegateTo + ]>; + + // Return conventions for the X86-32 Fast calling convention. + def RetCC_X86_32_Fast : CallingConv<[ + // The X86-32 fastcc returns FP values in XMM0 if the target has SSE2, + // otherwise it is the the C calling conventions. + CCMatchType<[f32], CCMatchIf<"Subtarget->hasSSE2()", CCAssignToReg<[XMM0]>>>, + CCMatchType<[f64], CCMatchIf<"Subtarget->hasSSE2()", CCAssignToReg<[XMM0]>>>, + CCDelegateTo + ]>; + + // Return conventions for the X86-64 C calling convention. + def RetCC_X86_64_C : CallingConv<[ + // The X86-64 calling convention always returns FP values in XMM0. + CCMatchType<[f32], CCAssignToReg<[XMM0]>>, + CCMatchType<[f64], CCAssignToReg<[XMM0]>>, + CCDelegateTo + ]>; + + + //===----------------------------------------------------------------------===// + // Argument Calling Conventions + //===----------------------------------------------------------------------===// + + + def CC_X86_64_C : CallingConv<[ + // Promote i8/i16 arguments to i32. + CCMatchType<[i8, i16], CCPromoteToType>, + + // The first 6 integer arguments are passed in integer registers. + CCMatchType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, R8D, R9D]>>, + CCMatchType<[i64], CCAssignToReg<[RDI, RSI, RDX, RCX, R8 , R9 ]>>, + + // The first 8 FP/Vector arguments are passed in XMM registers. + CCMatchType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], + CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>, + + // Integer/FP values get stored in stack slots that are 8 bytes in size and + // 8-byte aligned if there are no more registers to hold them. + CCMatchType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>, + + // Vectors get 16-byte stack slots that are 16-byte aligned. + CCMatchType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], + CCAssignToStack<16, 16>> + ]>; + + Index: llvm/lib/Target/X86/X86.td diff -u llvm/lib/Target/X86/X86.td:1.28 llvm/lib/Target/X86/X86.td:1.29 --- llvm/lib/Target/X86/X86.td:1.28 Fri Oct 6 04:17:41 2006 +++ llvm/lib/Target/X86/X86.td Mon Feb 26 12:17:14 2007 @@ -123,6 +123,17 @@ 24]; } +//===----------------------------------------------------------------------===// +// Calling Conventions +//===----------------------------------------------------------------------===// + +include "X86CallingConv.td" + + +//===----------------------------------------------------------------------===// +// Assembly Printers +//===----------------------------------------------------------------------===// + // The X86 target supports two different syntaxes for emitting machine code. // This is controlled by the -x86-asm-syntax={att|intel} def ATTAsmWriter : AsmWriter { From rspencer at reidspencer.com Mon Feb 26 12:46:29 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Mon, 26 Feb 2007 10:46:29 -0800 Subject: [llvm-commits] ConstantInt Patch Message-ID: <1172515589.3004.20.camel@bashful.x10sys.com> Hi, I would like to commit this small patch but thought I should send it out first. This changes ConstantInt to use an APInt object as its value instead of a uint64_t. The interface to ConstantInt still uses uint64_t so the APInt is just being used as a glorified uint64_t as all bit widths are <= 64. This change passes DejaGnu, the MultiSource/Benchmarks test suite, and a few of the SPEC benchmarks that I tried (444.namd, 176.gcc, 473.astar). Okay to commit? Reid. -------------- next part -------------- A non-text attachment was scrubbed... Name: ConstantInt.patch Type: text/x-patch Size: 4951 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070226/3dbf4caf/attachment.bin From sabre at nondot.org Mon Feb 26 12:56:24 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 12:56:24 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86CallingConv.td Message-ID: <200702261856.l1QIuOKi032005@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86CallingConv.td updated: 1.1 -> 1.2 --- Log message: fix attribution --- Diffs of the changes: (+1 -1) X86CallingConv.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86CallingConv.td diff -u llvm/lib/Target/X86/X86CallingConv.td:1.1 llvm/lib/Target/X86/X86CallingConv.td:1.2 --- llvm/lib/Target/X86/X86CallingConv.td:1.1 Mon Feb 26 12:17:14 2007 +++ llvm/lib/Target/X86/X86CallingConv.td Mon Feb 26 12:56:07 2007 @@ -2,7 +2,7 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under +// This file was developed by Chris Lattner and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// From dpatel at apple.com Mon Feb 26 13:32:18 2007 From: dpatel at apple.com (Devang Patel) Date: Mon, 26 Feb 2007 13:32:18 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Message-ID: <200702261932.l1QJWI0M004542@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: LoopUnswitch.cpp updated: 1.61 -> 1.62 --- Log message: Do not unswitch loop on same value again and again. --- Diffs of the changes: (+7 -0) LoopUnswitch.cpp | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.61 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.62 --- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.61 Mon Feb 5 17:32:05 2007 +++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Mon Feb 26 13:31:58 2007 @@ -62,6 +62,8 @@ // LoopProcessWorklist - List of loops we need to process. std::vector LoopProcessWorklist; + std::set UnswitchedVals; + public: virtual bool runOnFunction(Function &F); bool visitLoop(Loop *L); @@ -186,6 +188,11 @@ // Find a value to unswitch on: // FIXME: this should chose the most expensive case! Constant *UnswitchVal = SI->getCaseValue(1); + // Do not process same value again and again. + if (UnswitchedVals.count(UnswitchVal) != 0) + continue; + UnswitchedVals.insert(UnswitchVal); + if (UnswitchIfProfitable(LoopCond, UnswitchVal, L)) { ++NumSwitches; return true; From sabre at nondot.org Mon Feb 26 13:44:19 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 13:44:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp PPCInstrInfo.td Message-ID: <200702261944.l1QJiJIX004777@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.cpp updated: 1.256 -> 1.257 PPCInstrInfo.td updated: 1.274 -> 1.275 --- Log message: always lower to RETFLAG, never leave it as just ret. --- Diffs of the changes: (+7 -11) PPCISelLowering.cpp | 15 +++++++-------- PPCInstrInfo.td | 3 --- 2 files changed, 7 insertions(+), 11 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.256 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.257 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.256 Sun Feb 25 14:01:40 2007 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Mon Feb 26 13:44:02 2007 @@ -1626,13 +1626,13 @@ } static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) { - SDOperand Copy; + SDOperand Chain = Op.getOperand(0); switch(Op.getNumOperands()) { default: assert(0 && "Do not know how to return this many arguments!"); abort(); case 1: - return SDOperand(); // ret void is legal + return DAG.getNode(PPCISD::RET_FLAG, MVT::Other, Chain); case 3: { MVT::ValueType ArgVT = Op.getOperand(1).getValueType(); unsigned ArgReg; @@ -1647,8 +1647,7 @@ ArgReg = PPC::F1; } - Copy = DAG.getCopyToReg(Op.getOperand(0), ArgReg, Op.getOperand(1), - SDOperand()); + Chain = DAG.getCopyToReg(Chain, ArgReg, Op.getOperand(1), SDOperand()); // If we haven't noted the R3/F1 are live out, do so now. if (DAG.getMachineFunction().liveout_empty()) @@ -1656,9 +1655,9 @@ break; } case 5: - Copy = DAG.getCopyToReg(Op.getOperand(0), PPC::R3, Op.getOperand(3), - SDOperand()); - Copy = DAG.getCopyToReg(Copy, PPC::R4, Op.getOperand(1),Copy.getValue(1)); + Chain = DAG.getCopyToReg(Chain, PPC::R3, Op.getOperand(3), SDOperand()); + Chain = DAG.getCopyToReg(Chain, PPC::R4, Op.getOperand(1), + Chain.getValue(1)); // If we haven't noted the R3+R4 are live out, do so now. if (DAG.getMachineFunction().liveout_empty()) { DAG.getMachineFunction().addLiveOut(PPC::R3); @@ -1666,7 +1665,7 @@ } break; } - return DAG.getNode(PPCISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1)); + return DAG.getNode(PPCISD::RET_FLAG, MVT::Other, Chain, Chain.getValue(1)); } static SDOperand LowerSTACKRESTORE(SDOperand Op, SelectionDAG &DAG, Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.274 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.275 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.274 Sun Feb 25 13:20:53 2007 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Mon Feb 26 13:44:02 2007 @@ -1080,9 +1080,6 @@ def : Pat<(sub immSExt16:$imm, GPRC:$in), (SUBFIC GPRC:$in, imm:$imm)>; -// Return void support. -def : Pat<(ret), (BLR)>; - // SHL/SRL def : Pat<(shl GPRC:$in, (i32 imm:$imm)), (RLWINM GPRC:$in, imm:$imm, 0, (SHL32 imm:$imm))>; From dpatel at apple.com Mon Feb 26 14:23:06 2007 From: dpatel at apple.com (Devang Patel) Date: Mon, 26 Feb 2007 14:23:06 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Message-ID: <200702262023.l1QKN6pt005625@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: LoopUnswitch.cpp updated: 1.62 -> 1.63 --- Log message: Use efficient container SmallPtrSet --- Diffs of the changes: (+4 -3) LoopUnswitch.cpp | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.62 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.63 --- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.62 Mon Feb 26 13:31:58 2007 +++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Mon Feb 26 14:22:50 2007 @@ -38,6 +38,7 @@ #include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/ADT/Statistic.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" @@ -62,7 +63,7 @@ // LoopProcessWorklist - List of loops we need to process. std::vector LoopProcessWorklist; - std::set UnswitchedVals; + SmallPtrSet UnswitchedVals; public: virtual bool runOnFunction(Function &F); @@ -129,6 +130,7 @@ Changed |= visitLoop(L); } + UnswitchedVals.clear(); return Changed; } @@ -189,9 +191,8 @@ // FIXME: this should chose the most expensive case! Constant *UnswitchVal = SI->getCaseValue(1); // Do not process same value again and again. - if (UnswitchedVals.count(UnswitchVal) != 0) + if (!UnswitchedVals.insert(UnswitchVal)) continue; - UnswitchedVals.insert(UnswitchVal); if (UnswitchIfProfitable(LoopCond, UnswitchVal, L)) { ++NumSwitches; From rspencer at reidspencer.com Mon Feb 26 14:44:31 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Mon, 26 Feb 2007 12:44:31 -0800 Subject: [llvm-commits] ConstantInt Patch In-Reply-To: <1172515589.3004.20.camel@bashful.x10sys.com> References: <1172515589.3004.20.camel@bashful.x10sys.com> Message-ID: <1172522671.3004.31.camel@bashful.x10sys.com> Chris, Here is round two. This is a slightly larger patch that also includes the following changes: * APInt::getValue() -> getSExtValue() and getZExtValue() * const APInt& ConstantInt::getValue() const { return Val; } * ConstantInt::get(const Type*, const APInt&) * APInt constructor for ConstantInt::get to use * APInt::getHashValue() -- used for the DenseMap of ConstantInt values. * Changes in Constants.cpp to use getHashValue() for the key in the map of ConstantInt values. Reid. On Mon, 2007-02-26 at 10:46 -0800, Reid Spencer wrote: > Hi, > > I would like to commit this small patch but thought I should send it out > first. This changes ConstantInt to use an APInt object as its value > instead of a uint64_t. The interface to ConstantInt still uses uint64_t > so the APInt is just being used as a glorified uint64_t as all bit > widths are <= 64. This change passes DejaGnu, the MultiSource/Benchmarks > test suite, and a few of the SPEC benchmarks that I tried (444.namd, > 176.gcc, 473.astar). > > Okay to commit? > > Reid. > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits -------------- next part -------------- A non-text attachment was scrubbed... Name: ConstantInt2.patch Type: text/x-patch Size: 11595 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070226/66071298/attachment.bin From reid at x10sys.com Mon Feb 26 14:57:28 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 14:57:28 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702262057.l1QKvSoL007658@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.22 -> 1.23 --- Log message: 1. Split getValue() into getSExtValue() and getZExtValue() to match ConstantInt better. 2. Add a getHashValue() method. --- Diffs of the changes: (+25 -9) APInt.h | 34 +++++++++++++++++++++++++--------- 1 files changed, 25 insertions(+), 9 deletions(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.22 llvm/include/llvm/ADT/APInt.h:1.23 --- llvm/include/llvm/ADT/APInt.h:1.22 Mon Feb 26 11:50:32 2007 +++ llvm/include/llvm/ADT/APInt.h Mon Feb 26 14:57:12 2007 @@ -447,16 +447,27 @@ return BitWidth - countLeadingZeros(); } - /// @returns a uint64_t value from this APInt. If this APInt contains a single - /// word, just returns VAL, otherwise pVal[0]. - inline uint64_t getValue(bool isSigned = false) const { + /// This method attempts to return the value of this APInt as a zero extended + /// uint64_t. The bitwidth must be <= 64 or the value must fit within a + /// uint64_t. Otherwise an assertion will result. + /// @brief Get zero extended value + inline uint64_t getZExtValue() const { if (isSingleWord()) - return isSigned ? int64_t(VAL << (64 - BitWidth)) >> - (64 - BitWidth) : VAL; - uint32_t n = getActiveBits(); - if (n <= 64) - return pVal[0]; - assert(0 && "This APInt's bitwidth > 64"); + return VAL; + assert(getActiveBits() <= 64 && "Too many bits for uint64_t"); + return pVal[0]; + } + + /// This method attempts to return the value of this APInt as a sign extended + /// int64_t. The bit width must be <= 64 or the value must fit within an + /// int64_t. Otherwise an assertion will result. + /// @brief Get sign extended value + inline int64_t getSExtValue() const { + if (isSingleWord()) + return int64_t(VAL << (APINT_BITS_PER_WORD - BitWidth)) >> + (APINT_BITS_PER_WORD - BitWidth); + assert(getActiveBits() <= 64 && "Too many bits for int64_t"); + return int64_t(pVal[0]); } /// @returns the largest value for an APInt of the specified bit-width and @@ -478,6 +489,11 @@ /// @brief Get the '0' value. static APInt getNullValue(uint32_t numBits); + /// The hash value is computed as the sum of the words and the bit width. + /// @returns A hash value computed from the sum of the APInt words. + /// @brief Get a hash value based on this APInt + uint64_t getHashValue() const; + /// This converts the APInt to a boolean valy as a test against zero. /// @brief Boolean conversion function. inline bool getBoolValue() const { From reid at x10sys.com Mon Feb 26 15:02:49 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 15:02:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702262102.l1QL2nvq019962@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.48 -> 1.49 --- Log message: Implement the getHashValue method. Fix toString use of getValue to use getZExtValue() --- Diffs of the changes: (+16 -1) APInt.cpp | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletion(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.48 llvm/lib/Support/APInt.cpp:1.49 --- llvm/lib/Support/APInt.cpp:1.48 Mon Feb 26 02:10:54 2007 +++ llvm/lib/Support/APInt.cpp Mon Feb 26 15:02:27 2007 @@ -661,6 +661,21 @@ return getMinValue(numBits, false); } +uint64_t APInt::getHashValue() const { + // LLVM only supports bit widths up to 2^23 so shift the bitwidth into the + // high range. This makes the hash unique for integer values < 2^41 bits and + // doesn't hurt for larger values. + uint64_t hash = uint64_t(BitWidth) << (APINT_BITS_PER_WORD - 23); + + // Add the sum of the words to the hash. + if (isSingleWord()) + hash += VAL; + else + for (uint32_t i = 0; i < getNumWords(); ++i) + hash += pVal[i]; + return hash; +} + /// HiBits - This function returns the high "numBits" bits of this APInt. APInt APInt::getHiBits(uint32_t numBits) const { return APIntOps::lshr(*this, BitWidth - numBits); @@ -1660,7 +1675,7 @@ APInt tmp2(tmp.getBitWidth(), 0); divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2, &APdigit); - uint32_t digit = APdigit.getValue(); + uint32_t digit = APdigit.getZExtValue(); assert(digit < radix && "divide failed"); result.insert(insert_at,digits[digit]); tmp = tmp2; From reid at x10sys.com Mon Feb 26 15:06:22 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 15:06:22 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702262106.l1QL6MQg020051@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.23 -> 1.24 --- Log message: Fix indentation. --- Diffs of the changes: (+1 -1) APInt.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.23 llvm/include/llvm/ADT/APInt.h:1.24 --- llvm/include/llvm/ADT/APInt.h:1.23 Mon Feb 26 14:57:12 2007 +++ llvm/include/llvm/ADT/APInt.h Mon Feb 26 15:06:05 2007 @@ -467,7 +467,7 @@ return int64_t(VAL << (APINT_BITS_PER_WORD - BitWidth)) >> (APINT_BITS_PER_WORD - BitWidth); assert(getActiveBits() <= 64 && "Too many bits for int64_t"); - return int64_t(pVal[0]); + return int64_t(pVal[0]); } /// @returns the largest value for an APInt of the specified bit-width and From dpatel at apple.com Mon Feb 26 15:07:35 2007 From: dpatel at apple.com (dpatel at apple.com) Date: Mon, 26 Feb 2007 13:07:35 -0800 (PST) Subject: [llvm-commits] [124163] Backport mingw32 support from FSF GCC mainline. Message-ID: <20070226210735.4D1DF671543E@src> Revision: 124163 Author: dpatel Date: 2007-02-21 12:19:03 -0800 (Wed, 21 Feb 2007) Log Message: ----------- Backport mingw32 support from FSF GCC mainline. This patch is prepared by Anton Korobeynikov. Modified Paths: -------------- apple-local/branches/llvm/gcc/config/i386/cygming.h apple-local/branches/llvm/gcc/config/i386/i386-protos.h apple-local/branches/llvm/gcc/config/i386/i386.c apple-local/branches/llvm/gcc/config/i386/t-cygming apple-local/branches/llvm/gcc/config/i386/t-mingw32 apple-local/branches/llvm/gcc/config/i386/winnt.c apple-local/branches/llvm/gcc/config.gcc apple-local/branches/llvm/gcc/cp/decl.c apple-local/branches/llvm/gcc/doc/extend.texi apple-local/branches/llvm/gcc/doc/fragments.texi apple-local/branches/llvm/gcc/doc/tm.texi apple-local/branches/llvm/gcc/target-def.h apple-local/branches/llvm/gcc/target.h apple-local/branches/llvm/gcc/tree.c apple-local/branches/llvm/gcc/tree.h apple-local/branches/llvm/gcc/varasm.c Modified: apple-local/branches/llvm/gcc/config/i386/cygming.h =================================================================== --- apple-local/branches/llvm/gcc/config/i386/cygming.h 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/config/i386/cygming.h 2007-02-21 20:19:03 UTC (rev 124163) @@ -207,8 +207,10 @@ section and we need to set DECL_SECTION_NAME so we do that here. Note that we can be called twice on the same decl. */ -#undef TARGET_ENCODE_SECTION_INFO -#define TARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info + /* APPLE LOCAL begin mainline 2005-07-31 */ +#undef SUBTARGET_ENCODE_SECTION_INFO +#define SUBTARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info + /* APPLE LOCAL end mainline 2005-07-31 */ #undef TARGET_STRIP_NAME_ENCODING #define TARGET_STRIP_NAME_ENCODING i386_pe_strip_name_encoding_full @@ -216,6 +218,11 @@ #undef ASM_OUTPUT_LABELREF #define ASM_OUTPUT_LABELREF i386_pe_output_labelref + /* APPLE LOCAL begin mainline 2005-07-31 */ +#undef COMMON_ASM_OP +#define COMMON_ASM_OP "\t.comm\t" + /* APPLE LOCAL end mainline 2005-07-31 */ + /* Output a common block. */ #undef ASM_OUTPUT_COMMON #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \ @@ -422,6 +429,23 @@ #undef TARGET_USE_LOCAL_THUNK_ALIAS_P #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!DECL_ONE_ONLY (DECL)) + /* APPLE LOCAL begin mainline 2005-10-12 */ +#define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P i386_pe_valid_dllimport_attribute_p +#define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION i386_pe_adjust_class_at_definition + /* APPLE LOCAL end mainline 2005-10-12 */ + + /* APPLE LOCAL begin mainline 2005-06-01 */ +/* mcount() does not need a counter variable. */ +#undef NO_PROFILE_COUNTERS +#define NO_PROFILE_COUNTERS 1 + /* APPLE LOCAL end mainline 2005-06-01 */ + + /* APPLE LOCAL begin mainline 2005-04-01 */ +#define SUBTARGET_ATTRIBUTE_TABLE \ + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ \ + { "selectany", 0, 0, true, false, false, ix86_handle_selectany_attribute } + /* APPLE LOCAL end mainline 2005-04-01 */ + #undef TREE #ifndef BUFSIZ Modified: apple-local/branches/llvm/gcc/config/i386/i386-protos.h =================================================================== --- apple-local/branches/llvm/gcc/config/i386/i386-protos.h 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/config/i386/i386-protos.h 2007-02-21 20:19:03 UTC (rev 124163) @@ -237,6 +237,9 @@ extern int ix86_local_alignment (tree, int); extern int ix86_constant_alignment (tree, int); extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *); +/* APPLE LOCAL begin mainline 2005-04-01 */ +extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *); +/* APPLE LOCAL end mainline 2005-04-01 */ extern unsigned int i386_pe_section_type_flags (tree, const char *, int); extern void i386_pe_asm_named_section (const char *, unsigned int, tree); @@ -261,6 +264,15 @@ extern const char *i386_pe_strip_name_encoding (const char *); extern const char *i386_pe_strip_name_encoding_full (const char *); extern void i386_pe_output_labelref (FILE *, const char *); + /* APPLE LOCAL begin mainline 2005-10-12 */ +extern int i386_pe_valid_dllimport_attribute_p (tree); + +/* In winnt-cxx.c and winnt-stubs.c */ +extern void i386_pe_adjust_class_at_definition (tree); +extern bool i386_pe_type_dllimport_p (tree); +extern bool i386_pe_type_dllexport_p (tree); + + /* APPLE LOCAL end mainline 2005-10-12 */ extern rtx maybe_get_pool_constant (rtx); extern char internal_label_prefix[16]; Modified: apple-local/branches/llvm/gcc/config/i386/i386.c =================================================================== --- apple-local/branches/llvm/gcc/config/i386/i386.c 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/config/i386/i386.c 2007-02-21 20:19:03 UTC (rev 124163) @@ -1354,6 +1354,13 @@ #undef TARGET_ASM_FUNCTION_EPILOGUE #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue + /* APPLE LOCAL begin mainline 2005-07-31 */ +#ifdef SUBTARGET_ENCODE_SECTION_INFO +#undef TARGET_ENCODE_SECTION_INFO +#define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO +#endif + + /* APPLE LOCAL end mainline 2005-07-31 */ #undef TARGET_ASM_OPEN_PAREN #define TARGET_ASM_OPEN_PAREN "" #undef TARGET_ASM_CLOSE_PAREN @@ -2323,7 +2330,9 @@ #if TARGET_DLLIMPORT_DECL_ATTRIBUTES /* Dllimport'd functions are also called indirectly. */ - if (decl && lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl)) + /* APPLE LOCAL begin mainline 2005-10-12 */ + if (decl && DECL_DLLIMPORT_P (decl) + /* APPLE LOCAL end mainline 2005-10-12 */ && ix86_function_regparm (TREE_TYPE (decl), NULL) >= 3) return false; #endif Modified: apple-local/branches/llvm/gcc/config/i386/t-cygming =================================================================== --- apple-local/branches/llvm/gcc/config/i386/t-cygming 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/config/i386/t-cygming 2007-02-21 20:19:03 UTC (rev 124163) @@ -16,4 +16,19 @@ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ $(srcdir)/config/i386/winnt.c + # APPLE LOCAL begin mainline 2005-10-12 +winnt-cxx.o: $(srcdir)/config/i386/winnt-cxx.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ + $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \ + $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H) + $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ + $(srcdir)/config/i386/winnt-cxx.c + + +winnt-stubs.o: $(srcdir)/config/i386/winnt-stubs.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ + $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \ + $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H) + $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ + $(srcdir)/config/i386/winnt-stubs.c + # APPLE LOCAL end mainline 2005-10-12 + STMP_FIXINC=stmp-fixinc Modified: apple-local/branches/llvm/gcc/config/i386/t-mingw32 =================================================================== --- apple-local/branches/llvm/gcc/config/i386/t-mingw32 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/config/i386/t-mingw32 2007-02-21 20:19:03 UTC (rev 124163) @@ -1,2 +1,7 @@ # We hide calls to w32api needed for w32 thread support here: LIB2FUNCS_EXTRA = $(srcdir)/config/i386/gthr-win32.c + + # APPLE LOCAL begin mainline 2005-08-02 +# Match SYSTEM_INCLUDE_DIR +NATIVE_SYSTEM_HEADER_DIR = /mingw/include + # APPLE LOCAL end mainline 2005-08-02 Modified: apple-local/branches/llvm/gcc/config/i386/winnt.c =================================================================== --- apple-local/branches/llvm/gcc/config/i386/winnt.c 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/config/i386/winnt.c 2007-02-21 20:19:03 UTC (rev 124163) @@ -1,7 +1,7 @@ /* Subroutines for insn-output.c for Windows NT. Contributed by Douglas Rupp (drupp at cs.washington.edu) Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 - Free Software Foundation, Inc. + 2005, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -76,6 +76,31 @@ return NULL_TREE; } + /* APPLE LOCAL begin mainline 2005-04-01 */ + +/* Handle a "selectany" attribute; + arguments as in struct attribute_spec.handler. */ +tree +ix86_handle_selectany_attribute (tree *node, tree name, + tree args ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED, + bool *no_add_attrs) +{ + /* The attribute applies only to objects that are initialized and have + external linkage. However, we may not know about initialization + until the language frontend has processed the decl. We'll check for + initialization later in encode_section_info. */ + if (TREE_CODE (*node) != VAR_DECL || !TREE_PUBLIC (*node)) + { + error ("%qs attribute applies only to initialized variables" + " with external linkage", IDENTIFIER_POINTER (name)); + *no_add_attrs = true; + } + + return NULL_TREE; +} + + /* APPLE LOCAL end mainline 2005-04-01 */ /* Return the type that we should use to determine if DECL is imported or exported. */ @@ -83,133 +108,85 @@ static tree associated_type (tree decl) { - tree t = NULL_TREE; - - /* In the C++ frontend, DECL_CONTEXT for a method doesn't actually refer - to the containing class. So we look at the 'this' arg. */ - if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) - { - /* Artificial methods are not affected by the import/export status - of their class unless they are COMDAT. Implicit copy ctor's and - dtor's are not affected by class status but virtual and - non-virtual thunks are. */ - if (!DECL_ARTIFICIAL (decl) || DECL_COMDAT (decl)) - t = TYPE_MAIN_VARIANT - (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))))); - } - else if (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl))) - t = DECL_CONTEXT (decl); - - return t; + /* APPLE LOCAL begin mainline 2005-10-12 */ + return (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl))) + ? DECL_CONTEXT (decl) : NULL_TREE; + /* APPLE LOCAL end mainline 2005-10-12 */ } -/* Return nonzero if DECL is a dllexport'd object. */ +/* Return true if DECL is a dllexport'd object. */ int i386_pe_dllexport_p (tree decl) { - tree exp; - if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL) return 0; - exp = lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)); - if (exp) + + /* APPLE LOCAL begin mainline 2005-10-12 */ + if (lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))) return 1; - /* Class members get the dllexport status of their class. */ - if (associated_type (decl)) - { - exp = lookup_attribute ("dllexport", - TYPE_ATTRIBUTES (associated_type (decl))); - if (exp) - return 1; - } - + /* Also mark class members of exported classes with dllexport. */ + if (associated_type (decl) + && lookup_attribute ("dllexport", + TYPE_ATTRIBUTES (associated_type (decl)))) + return i386_pe_type_dllexport_p (decl); + /* APPLE LOCAL end mainline 2005-10-12 */ + return 0; } -/* Return nonzero if DECL is a dllimport'd object. */ +/* Return true if DECL is a dllimport'd object. */ int i386_pe_dllimport_p (tree decl) { - tree imp; - int context_imp = 0; - - if (TREE_CODE (decl) == FUNCTION_DECL - && TARGET_NOP_FUN_DLLIMPORT) - return 0; - if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL) return 0; - imp = lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl)); - - /* Class members get the dllimport status of their class. */ - if (!imp && associated_type (decl)) + /* APPLE LOCAL begin mainline 2005-10-12 */ + /* Lookup the attribute in addition to checking the DECL_DLLIMPORT_P flag. + We may need to override an earlier decision. */ + if (DECL_DLLIMPORT_P (decl) + && lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl))) { - imp = lookup_attribute ("dllimport", - TYPE_ATTRIBUTES (associated_type (decl))); - if (imp) - context_imp = 1; - } - - if (imp) - { - /* Don't mark defined functions as dllimport. If the definition - itself was marked with dllimport, than ix86_handle_dll_attribute - reports an error. This handles the case when the definition - overrides an earlier declaration. */ - if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl) - && !DECL_INLINE (decl)) - { - /* Don't warn about artificial methods. */ - if (!DECL_ARTIFICIAL (decl)) - warning ("%Jfunction '%D' is defined after prior declaration " - "as dllimport: attribute ignored", decl, decl); - return 0; - } - - /* We ignore the dllimport attribute for inline member functions. - This differs from MSVC behavior which treats it like GNUC - 'extern inline' extension. */ - else if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl)) + /* Make a final check to see if this is a definition before we generate + RTL for an indirect reference. */ + if (!DECL_EXTERNAL (decl)) { - if (extra_warnings) - warning ("%Jinline function '%D' is declared as dllimport: " - "attribute ignored.", decl, decl); - return 0; - } - - /* Don't allow definitions of static data members in dllimport class, - Just ignore attribute for vtable data. */ - else if (TREE_CODE (decl) == VAR_DECL - && TREE_STATIC (decl) && TREE_PUBLIC (decl) - && !DECL_EXTERNAL (decl) && context_imp) - { - if (!DECL_VIRTUAL_P (decl)) - error ("%Jdefinition of static data member '%D' of " - "dllimport'd class.", decl, decl); - return 0; - } - - /* Since we can't treat a pointer to a dllimport'd symbol as a - constant address, we turn off the attribute on C++ virtual - methods to allow creation of vtables using thunks. Don't mark - artificial methods either (in associated_type, only COMDAT - artificial method get import status from class context). */ - else if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE - && (DECL_VIRTUAL_P (decl) || DECL_ARTIFICIAL (decl))) - return 0; - + error ("%qD: definition is marked as dllimport", decl); + DECL_DLLIMPORT_P (decl) = 0; + return 0; + } return 1; } + /* The DECL_DLLIMPORT_P flag was set for decls in the class definition + by targetm.cxx.adjust_class_at_definition. Check again to emit + warnings if the class attribute has been overriden by an + out-of-class definition. */ + else if (associated_type (decl) + && lookup_attribute ("dllimport", + TYPE_ATTRIBUTES (associated_type (decl)))) + return i386_pe_type_dllimport_p (decl); + /* APPLE LOCAL end mainline 2005-10-12 */ + return 0; } +/* APPLE LOCAL begin mainline 2005-10-12 */ +/* Handle the -mno-fun-dllimport target switch. */ +int +i386_pe_valid_dllimport_attribute_p (tree decl) +{ + if (TARGET_NOP_FUN_DLLIMPORT && TREE_CODE (decl) == FUNCTION_DECL) + return 0; + return 1; +} +/* APPLE LOCAL end mainline 2005-10-12 */ + /* Return nonzero if SYMBOL is marked as being dllexport'd. */ int @@ -251,10 +228,9 @@ if (i386_pe_dllimport_name_p (oldname)) { warning ("%Jinconsistent dll linkage for '%D', dllexport assumed.", - decl, decl); + decl, decl); /* Remove DLL_IMPORT_PREFIX. */ oldname += strlen (DLL_IMPORT_PREFIX); - DECL_NON_ADDR_CONST_P (decl) = 0; } else if (i386_pe_dllexport_name_p (oldname)) return; /* already done */ @@ -301,12 +277,15 @@ else if (i386_pe_dllimport_name_p (oldname)) { /* Already done, but do a sanity check to prevent assembler errors. */ - if (!DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl)) - { - error ("%Jfailure in redeclaration of '%D': dllimport'd " - "symbol lacks external linkage.", decl, decl); - abort(); - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + if (!DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl) + || !DECL_DLLIMPORT_P (decl)) + { + error ("%Jfailure in redeclaration of '%D': dllimport'd " + "symbol lacks external linkage.", decl, decl); + abort(); + } + /* APPLE LOCAL end mainline 2005-10-12 */ return; } @@ -324,8 +303,9 @@ newrtl = gen_rtx_MEM (Pmode,symref); XEXP (DECL_RTL (decl), 0) = newrtl; - /* Can't treat a pointer to this as a constant address */ - DECL_NON_ADDR_CONST_P (decl) = 1; + /* APPLE LOCAL begin mainline 2005-10-12 */ + DECL_DLLIMPORT_P (decl) = 1; + /* APPLE LOCAL end mainline 2005-10-12 */ } /* Return string which is the former assembler name modified with a @@ -338,7 +318,7 @@ int total = 0; /* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead of DECL_ASSEMBLER_NAME. */ - const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); + const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); char *newsym; char *p; tree formal_type; @@ -351,7 +331,7 @@ if (formal_type != NULL_TREE) { /* These attributes are ignored for variadic functions in - i386.c:ix86_return_pops_args. For compatibility with MS + i386.c:ix86_return_pops_args. For compatibility with MS compiler do not add @0 suffix here. */ if (TREE_VALUE (tree_last (formal_type)) != void_type_node) return DECL_ASSEMBLER_NAME (decl); @@ -360,17 +340,19 @@ by convert_arguments in c-typeck.c or cp/typeck.c. */ while (TREE_VALUE (formal_type) != void_type_node && COMPLETE_TYPE_P (TREE_VALUE (formal_type))) - { - int parm_size - = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type))); - /* Must round up to include padding. This is done the same - way as in store_one_arg. */ - parm_size = ((parm_size + PARM_BOUNDARY - 1) - / PARM_BOUNDARY * PARM_BOUNDARY); - total += parm_size; - formal_type = TREE_CHAIN (formal_type);\ - } - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + { + int parm_size + = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type))); + /* Must round up to include padding. This is done the same + way as in store_one_arg. */ + parm_size = ((parm_size + PARM_BOUNDARY - 1) + / PARM_BOUNDARY * PARM_BOUNDARY); + total += parm_size; + formal_type = TREE_CHAIN (formal_type); \ + } + /* APPLE LOCAL end mainline 2005-10-12 */ + } /* Assume max of 8 base 10 digits in the suffix. */ newsym = alloca (1 + strlen (asmname) + 1 + 8 + 1); @@ -392,62 +374,65 @@ tree newid = NULL_TREE; if (lookup_attribute ("stdcall", type_attributes)) - newid = gen_stdcall_or_fastcall_suffix (decl, false); + newid = gen_stdcall_or_fastcall_suffix (decl, false); else if (lookup_attribute ("fastcall", type_attributes)) - newid = gen_stdcall_or_fastcall_suffix (decl, true); + newid = gen_stdcall_or_fastcall_suffix (decl, true); if (newid != NULL_TREE) - { - rtx rtlname = XEXP (rtl, 0); - if (GET_CODE (rtlname) == MEM) - rtlname = XEXP (rtlname, 0); - XSTR (rtlname, 0) = IDENTIFIER_POINTER (newid); - /* These attributes must be present on first declaration, - change_decl_assembler_name will warn if they are added - later and the decl has been referenced, but duplicate_decls - should catch the mismatch before this is called. */ - change_decl_assembler_name (decl, newid); - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + { + rtx rtlname = XEXP (rtl, 0); + if (GET_CODE (rtlname) == MEM) + rtlname = XEXP (rtlname, 0); + XSTR (rtlname, 0) = IDENTIFIER_POINTER (newid); + /* These attributes must be present on first declaration, + change_decl_assembler_name will warn if they are added + later and the decl has been referenced, but duplicate_decls + should catch the mismatch before this is called. */ + change_decl_assembler_name (decl, newid); + } + /* APPLE LOCAL end mainline 2005-10-12 */ } + /* APPLE LOCAL begin mainline 2005-10-12 */ + else if (TREE_CODE (decl) == VAR_DECL + && lookup_attribute ("selectany", DECL_ATTRIBUTES (decl))) + { + if (DECL_INITIAL (decl) + /* If an object is initialized with a ctor, the static + initialization and destruction code for it is present in + each unit defining the object. The code that calls the + ctor is protected by a link-once guard variable, so that + the object still has link-once semantics, */ + || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))) + make_decl_one_only (decl); + else + error ("%qD:'selectany' attribute applies only to initialized objects", + decl); + } + /* APPLE LOCAL end mainline 2005-10-12 */ + /* Mark the decl so we can tell from the rtl whether the object is - dllexport'd or dllimport'd. This also handles dllexport/dllimport - override semantics. */ + dllexport'd or dllimport'd. tree.c: merge_dllimport_decl_attributes + handles dllexport/dllimport override semantics. */ if (i386_pe_dllexport_p (decl)) i386_pe_mark_dllexport (decl); else if (i386_pe_dllimport_p (decl)) i386_pe_mark_dllimport (decl); - /* It might be that DECL has already been marked as dllimport, but a - subsequent definition nullified that. The attribute is gone but - DECL_RTL still has (DLL_IMPORT_PREFIX) prefixed. We need to remove - that. Ditto for the DECL_NON_ADDR_CONST_P flag. */ - else if ((TREE_CODE (decl) == FUNCTION_DECL - || TREE_CODE (decl) == VAR_DECL) - && DECL_RTL (decl) != NULL_RTX - && GET_CODE (DECL_RTL (decl)) == MEM - && GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM - && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 0)) == SYMBOL_REF - && i386_pe_dllimport_name_p (XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0))) - { - const char *oldname = XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0); - - /* Remove DLL_IMPORT_PREFIX. */ - tree idp = get_identifier (oldname + strlen (DLL_IMPORT_PREFIX)); - rtx symref = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp)); - SYMBOL_REF_DECL (symref) = decl; - XEXP (DECL_RTL (decl), 0) = symref; - DECL_NON_ADDR_CONST_P (decl) = 0; - - /* We previously set TREE_PUBLIC and DECL_EXTERNAL. - We leave these alone for now. */ - - if (DECL_INITIAL (decl) || !DECL_EXTERNAL (decl)) - warning ("%J'%D' defined locally after being " - "referenced with dllimport linkage", decl, decl); - else - warning ("%J'%D' redeclared without dllimport attribute " - "after being referenced with dllimport linkage", decl, decl); - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + /* It might be that DECL has been declared as dllimport, but a + subsequent definition nullified that. Assert that + tree.c: merge_dllimport_decl_attributes has removed the attribute + before the RTL name was marked with the DLL_IMPORT_PREFIX. */ + else + gcc_assert(!((TREE_CODE (decl) == FUNCTION_DECL + || TREE_CODE (decl) == VAR_DECL) + && rtl != NULL_RTX + && GET_CODE (rtl) == MEM + && GET_CODE (XEXP (rtl, 0)) == MEM + && GET_CODE (XEXP (XEXP (rtl, 0), 0)) == SYMBOL_REF + && i386_pe_dllimport_name_p (XSTR (XEXP (XEXP (rtl, 0), 0), 0)))); + /* APPLE LOCAL end mainline 2005-10-12 */ } /* Strip only the leading encoding, leaving the stdcall suffix and fastcall @@ -595,8 +580,10 @@ flags = SECTION_WRITE; if (decl && TREE_CODE (decl) == VAR_DECL - && lookup_attribute ("shared", DECL_ATTRIBUTES (decl))) - flags |= SECTION_PE_SHARED; + /* APPLE LOCAL begin mainline 2005-04-01 */ + && lookup_attribute ("shared", DECL_ATTRIBUTES (decl))) + flags |= SECTION_PE_SHARED; + /* APPLE LOCAL end mainline 2005-04-01 */ } if (decl && DECL_ONE_ONLY (decl)) @@ -612,7 +599,7 @@ else { if (decl && **slot != flags) - error ("%J'%D' causes a section type conflict", decl, decl); + error ("%J'%D' causes a section type conflict", decl, decl); } return flags; @@ -620,7 +607,7 @@ void i386_pe_asm_named_section (const char *name, unsigned int flags, - tree decl ATTRIBUTE_UNUSED) + tree decl) { char flagchars[8], *f = flagchars; @@ -647,10 +634,18 @@ if (flags & SECTION_LINKONCE) { /* Functions may have been compiled at various levels of - optimization so we can't use `same_size' here. - Instead, have the linker pick one. */ + optimization so we can't use `same_size' here. + Instead, have the linker pick one, without warning. + If 'selectany' attibute has been specified, MS compiler + sets 'discard' characteristic, rather than telling linker + to warn of size or content mismatch, so do the same. */ + /* APPLE LOCAL begin mainline 2005-04-01 */ + bool discard = (flags & SECTION_CODE) + || lookup_attribute ("selectany", + DECL_ATTRIBUTES (decl)); fprintf (asm_out_file, "\t.linkonce %s\n", - (flags & SECTION_CODE ? "discard" : "same_size")); + (discard ? "discard" : "same_size")); + /* APPLE LOCAL end mainline 2005-10-12 */ } } @@ -751,11 +746,11 @@ /* Positively ensure only one declaration for any given symbol. */ if (! TREE_ASM_WRITTEN (decl) && TREE_SYMBOL_REFERENCED (decl)) - { - TREE_ASM_WRITTEN (decl) = 1; - i386_pe_declare_function_type (asm_out_file, p->name, - TREE_PUBLIC (decl)); - } + { + TREE_ASM_WRITTEN (decl) = 1; + i386_pe_declare_function_type (asm_out_file, p->name, + TREE_PUBLIC (decl)); + } } if (export_head) @@ -763,11 +758,11 @@ struct export_list *q; drectve_section (); for (q = export_head; q != NULL; q = q->next) - { - fprintf (asm_out_file, "\t.ascii \" -export:%s%s\"\n", - i386_pe_strip_name_encoding (q->name), - (q->is_data) ? ",data" : ""); - } + { + fprintf (asm_out_file, "\t.ascii \" -export:%s%s\"\n", + i386_pe_strip_name_encoding (q->name), + (q->is_data) ? ",data" : ""); + } } } Modified: apple-local/branches/llvm/gcc/config.gcc =================================================================== --- apple-local/branches/llvm/gcc/config.gcc 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/config.gcc 2007-02-21 20:19:03 UTC (rev 124163) @@ -1209,9 +1209,11 @@ xm_file=i386/xm-cygwin.h tmake_file="i386/t-cygwin i386/t-cygming" target_gtfiles="\$(srcdir)/config/i386/winnt.c" - extra_objs=winnt.o + # APPLE LOCAL begin mainline 2005-10-12 + extra_objs="winnt.o winnt-stubs.o" + # APPLE LOCAL end mainline 2005-10-12 c_target_objs=cygwin2.o - cxx_target_objs=cygwin2.o + cxx_target_objs="cygwin2.o winnt-cxx.o" extra_gcc_objs=cygwin1.o if test x$enable_threads = xyes; then thread_file='posix' @@ -1222,7 +1224,10 @@ xm_file=i386/xm-mingw32.h tmake_file="i386/t-cygming i386/t-mingw32" target_gtfiles="\$(srcdir)/config/i386/winnt.c" - extra_objs=winnt.o + # APPLE LOCAL begin mainline 2005-10-12 + extra_objs="winnt.o winnt-stubs.o" + cxx_target_objs="winnt-cxx.o" + # APPLE LOCAL end mainline 2005-10-12 case ${enable_threads} in "" | yes | win32) thread_file='win32' ;; esac Modified: apple-local/branches/llvm/gcc/cp/decl.c =================================================================== --- apple-local/branches/llvm/gcc/cp/decl.c 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/cp/decl.c 2007-02-21 20:19:03 UTC (rev 124163) @@ -3846,6 +3846,18 @@ objc_checkon_weak_attribute (decl); /* APPLE LOCAL end radar 4592503 */ + /* APPLE LOCAL begin mainline 2005-10-12 */ + /* Dllimported symbols cannot be defined. Static data members (which + can be initialized in-class and dllimported) go through grokfield, + not here, so we don't need to exclude those decls when checking for + a definition. */ + if (initialized && DECL_DLLIMPORT_P (decl)) + { + error ("definition of %q#D is marked %", decl); + DECL_DLLIMPORT_P (decl) = 0; + } + /* APPLE LOCAL end mainline 2005-10-12 */ + /* If #pragma weak was used, mark the decl weak now. */ maybe_apply_pragma_weak (decl); Modified: apple-local/branches/llvm/gcc/doc/extend.texi =================================================================== --- apple-local/branches/llvm/gcc/doc/extend.texi 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/doc/extend.texi 2007-02-21 20:19:03 UTC (rev 124163) @@ -3198,6 +3198,28 @@ is invalid even if the size of the structure is the same as the size of the @code{int}. + at c APPLE LOCAL begin mainline 2005-04-01 + at item selectany +The @code{selectany} attribute causes an initialized global variable to +have link-once semantics. When multiple definitions of the variable are +encountered by the linker, the first is selected and the remainder are +discarded. Following usage by the Microsoft compiler, the linker is told + at emph{not} to warn about size or content differences of the multiple +definitions. + +Although the primary usage of this attribute is for POD types, the +attribute can also be applied to global C++ objects that are initialized +by a constructor. In this case, the static initialization and destruction +code for the object is emitted in each translation defining the object, +but the calls to the constructor and destructor are protected by a +link-once guard variable. + +The @code{selectany} attribute is only available on Microsoft Windows +targets. You can use @code{__declspec (selectany)} as a synonym for + at code{__attribute__ ((selectany))} for compatibility with other +compilers. + at c APPLE LOCAL end mainline 2005-04-01 + @item weak The @code{weak} attribute is described in @xref{Function Attributes}. Modified: apple-local/branches/llvm/gcc/doc/fragments.texi =================================================================== --- apple-local/branches/llvm/gcc/doc/fragments.texi 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/doc/fragments.texi 2007-02-21 20:19:03 UTC (rev 124163) @@ -151,6 +151,14 @@ of options to be used for all builds. If you set this, you should probably set @code{CRTSTUFF_T_CFLAGS} to a dash followed by it. + at c APPLE LOCAL begin mainline 2005-08-02 + at findex NATIVE_SYSTEM_HEADER_DIR + at item NATIVE_SYSTEM_HEADER_DIR +If the default location for system headers is not @file{/usr/include}, +you must set this to the directory containing the headers. This value +should match the value of the @code{SYSTEM_INCLUDE_DIR} macro. + at c APPLE LOCAL end mainline 2005-08-02 + @findex SPECS @item SPECS Unfortunately, setting @code{MULTILIB_EXTRA_OPTS} is not enough, since Modified: apple-local/branches/llvm/gcc/doc/tm.texi =================================================================== --- apple-local/branches/llvm/gcc/doc/tm.texi 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/doc/tm.texi 2007-02-21 20:19:03 UTC (rev 124163) @@ -8560,6 +8560,14 @@ @file{i386/i386.c}, for example. @end deftypefn + at c APPLE LOCAL begin mainline 2005-10-12 + at deftypefn {Target Hook} bool TARGET_VALID_DLLIMPORT_ATTRIBUTE_P (tree @var{decl}) + at var{decl} is a variable or function with @code{__attribute__((dllimport))} +specified. Use this hook if the target needs to add extra validation +checks to @code{handle_dll_attribute}. + at end deftypefn + at c APPLE LOCAL begin mainline 2005-10-12 + @defmac TARGET_DECLSPEC Define this macro to a nonzero value if you want to treat @code{__declspec(X)} as equivalent to @code{__attribute((X))}. By @@ -8727,6 +8735,15 @@ @end deftypefn @c APPLE LOCAL end mainline 4.2 2006-03-01 4311680 + + at c APPLE LOCAL begin mainline 2005-10-12 + at deftypefn {Target Hook} void TARGET_CXX_ADJUST_CLASS_AT_DEFINITION (tree @var{type}) + at var{type} is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that has just been +defined. Use this hook to make adjustments to the class (eg, tweak +visibility or perform any other required target modifications). + at end deftypefn + at c APPLE LOCAL end mainline 2005-10-12 + @node Misc @section Miscellaneous Parameters @cindex parameters, miscellaneous Modified: apple-local/branches/llvm/gcc/target-def.h =================================================================== --- apple-local/branches/llvm/gcc/target-def.h 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/target-def.h 2007-02-21 20:19:03 UTC (rev 124163) @@ -416,6 +416,12 @@ #define TARGET_DWARF_HANDLE_FRAME_UNSPEC 0 +/* APPLE LOCAL begin mainline 2005-10-12 */ +#ifndef TARGET_VALID_DLLIMPORT_ATTRIBUTE_P +#define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P hook_bool_tree_true +#endif +/* APPLE LOCAL end mainline 2005-10-12 */ + #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_false #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_false #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_false @@ -530,6 +536,13 @@ #endif /* APPLE LOCAL end mainline 4.2 2006-03-01 4311680 */ + + /* APPLE LOCAL begin mainline 2005-10-12 */ +#ifndef TARGET_CXX_ADJUST_CLASS_AT_DEFINITION +#define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION hook_void_tree +#endif + /* APPLE LOCAL begin mainline 2005-10-12 */ + #define TARGET_CXX \ { \ TARGET_CXX_GUARD_TYPE, \ @@ -543,6 +556,9 @@ TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY, \ TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT, \ /* APPLE LOCAL end mainline 4.2 2006-03-01 4311680 */ \ + /* APPLE LOCAL begin mainline 2005-10-12 */ \ + TARGET_CXX_ADJUST_CLASS_AT_DEFINITION \ + /* APPLE LOCAL end mainline 2005-10-12 */ \ } /* The whole shebang. */ @@ -604,6 +620,9 @@ TARGET_MD_ASM_CLOBBERS, \ TARGET_DWARF_CALLING_CONVENTION, \ TARGET_DWARF_HANDLE_FRAME_UNSPEC, \ + /* APPLE LOCAL begin mainline 2005-10-12 */ \ + TARGET_VALID_DLLIMPORT_ATTRIBUTE_P, \ + /* APPLE LOCAL end mainline 2005-10-12 */ \ TARGET_CALLS, \ TARGET_CXX, \ TARGET_HAVE_NAMED_SECTIONS, \ Modified: apple-local/branches/llvm/gcc/target.h =================================================================== --- apple-local/branches/llvm/gcc/target.h 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/target.h 2007-02-21 20:19:03 UTC (rev 124163) @@ -525,6 +525,13 @@ to let the backend emit the call frame instructions. */ void (* dwarf_handle_frame_unspec) (const char *, rtx, int); + /* APPLE LOCAL begin mainline 2005-10-12 */ + /* DECL is a variable or function with __attribute__((dllimport)) + specified. Use this hook if the target needs to add extra validation + checks to handle_dll_attribute (). */ + bool (* valid_dllimport_attribute_p) (tree decl); + /* APPLE LOCAL begin mainline 2005-10-12 */ + /* Functions relating to calls - argument passing, returns, etc. */ struct calls { bool (*promote_function_args) (tree fntype); @@ -628,6 +635,13 @@ only one translation unit will not be COMDAT. */ bool (*class_data_always_comdat) (void); /* APPLE LOCAL end mainline 4.2 2006-03-01 4311680 */ + /* APPLE LOCAL begin mainline 2005-10-12 */ + /* TYPE is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that + has just been defined. Use this hook to make adjustments to the + class (eg, tweak visibility or perform any other required + target modifications). */ + void (*adjust_class_at_definition) (tree type); + /* APPLE LOCAL end mainline 2005-10-12 */ } cxx; /* Leave the boolean fields at the end. */ Modified: apple-local/branches/llvm/gcc/tree.c =================================================================== --- apple-local/branches/llvm/gcc/tree.c 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/tree.c 2007-02-21 20:19:03 UTC (rev 124163) @@ -1632,7 +1632,9 @@ case VAR_DECL: return ((TREE_STATIC (arg) || DECL_EXTERNAL (arg)) && ! DECL_THREAD_LOCAL (arg) - && ! DECL_NON_ADDR_CONST_P (arg) + /* APPLE LOCAL begin mainline 2005-10-12 */ + && ! DECL_DLLIMPORT_P (arg) + /* APPLE LOCAL end mainline 2005-10-12 */ ? arg : NULL); case CONST_DECL: @@ -3245,39 +3247,84 @@ merge_dllimport_decl_attributes (tree old, tree new) { tree a; - int delete_dllimport_p; + /* APPLE LOCAL begin mainline 2005-10-12 */ + int delete_dllimport_p = 1; + /* APPLE LOCAL end mainline 2005-10-12 */ - old = DECL_ATTRIBUTES (old); - new = DECL_ATTRIBUTES (new); - /* What we need to do here is remove from `old' dllimport if it doesn't appear in `new'. dllimport behaves like extern: if a declaration is marked dllimport and a definition appears later, then the object - is not dllimport'd. */ - if (lookup_attribute ("dllimport", old) != NULL_TREE - && lookup_attribute ("dllimport", new) == NULL_TREE) - delete_dllimport_p = 1; + is not dllimport'd. We also remove a `new' dllimport if the old list + contains dllexport: dllexport always overrides dllimport, regardless + of the order of declaration. */ + /* APPLE LOCAL begin mainline 2005-10-12 */ + if (!VAR_OR_FUNCTION_DECL_P (new)) + delete_dllimport_p = 0; + else if (DECL_DLLIMPORT_P (new) + && lookup_attribute ("dllexport", DECL_ATTRIBUTES (old))) + { + DECL_DLLIMPORT_P (new) = 0; + warning ("%qD already declared with dllexport attribute: " + "dllimport ignored", new); + } + else if (DECL_DLLIMPORT_P (old) && !DECL_DLLIMPORT_P (new)) + { + /* Warn about overriding a symbol that has already been used. eg: + extern int __attribute__ ((dllimport)) foo; + int* bar () {return &foo;} + int foo; + */ + if (TREE_USED (old)) + { + warning ("%qD redeclared without dllimport attribute " + "after being referenced with dll linkage", new); + /* If we have used a variable's address with dllimport linkage, + keep the old DECL_DLLIMPORT_P flag: the ADDR_EXPR using the + decl may already have had TREE_INVARIANT and TREE_CONSTANT + computed. + We still remove the attribute so that assembler code refers + to '&foo rather than '_imp__foo'. */ + if (TREE_CODE (old) == VAR_DECL && TREE_ADDRESSABLE (old)) + DECL_DLLIMPORT_P (new) = 1; + } + + /* Let an inline definition silently override the external reference, + but otherwise warn about attribute inconsistency. */ + else if (TREE_CODE (new) == VAR_DECL + || !DECL_DECLARED_INLINE_P (new)) + warning ("%qD redeclared without dllimport attribute: " + "previous dllimport ignored", new); + } + /* APPLE LOCAL end mainline 2005-10-12 */ else delete_dllimport_p = 0; - a = merge_attributes (old, new); + /* APPLE LOCAL begin mainline 2005-10-12 */ + a = merge_attributes (DECL_ATTRIBUTES (old), DECL_ATTRIBUTES (new)); + /* APPLE LOCAL end mainline 2005-10-12 */ if (delete_dllimport_p) { tree prev, t; + /* APPLE LOCAL begin mainline 2005-10-12 */ + const size_t attr_len = strlen ("dllimport"); + /* APPLE LOCAL end mainline 2005-10-12 */ /* Scan the list for dllimport and delete it. */ for (prev = NULL_TREE, t = a; t; prev = t, t = TREE_CHAIN (t)) - { - if (is_attribute_p ("dllimport", TREE_PURPOSE (t))) - { - if (prev == NULL_TREE) - a = TREE_CHAIN (a); - else - TREE_CHAIN (prev) = TREE_CHAIN (t); - break; - } - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + { + if (is_attribute_with_length_p ("dllimport", attr_len, + TREE_PURPOSE (t))) + { + if (prev == NULL_TREE) + a = TREE_CHAIN (a); + else + TREE_CHAIN (prev) = TREE_CHAIN (t); + break; + } + } + /* APPLE LOCAL end mainline 2005-10-12 */ } return a; @@ -3298,15 +3345,19 @@ { if (flags & ((int) ATTR_FLAG_DECL_NEXT | (int) ATTR_FLAG_FUNCTION_NEXT | (int) ATTR_FLAG_ARRAY_NEXT)) - { - *no_add_attrs = true; - return tree_cons (name, args, NULL_TREE); - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + { + *no_add_attrs = true; + return tree_cons (name, args, NULL_TREE); + } + /* APPLE LOCAL end mainline 2005-10-12 */ if (TREE_CODE (node) != RECORD_TYPE && TREE_CODE (node) != UNION_TYPE) - { - warning ("%qs attribute ignored", IDENTIFIER_POINTER (name)); - *no_add_attrs = true; - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + { + warning ("%qs attribute ignored", IDENTIFIER_POINTER (name)); + *no_add_attrs = true; + } + /* APPLE LOCAL end mainline 2005-10-12 */ return NULL_TREE; } @@ -3315,34 +3366,51 @@ any damage. */ if (is_attribute_p ("dllimport", name)) { + /* APPLE LOCAL begin mainline 2005-10-12 */ + /* Honor any target-specific overides. */ + if (!targetm.valid_dllimport_attribute_p (node)) + *no_add_attrs = true; + + else if (TREE_CODE (node) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (node)) + { + warning ("inline function %qD declared as " + " dllimport: attribute ignored", node); + *no_add_attrs = true; + } + /* APPLE LOCAL end mainline 2005-10-12 */ /* Like MS, treat definition of dllimported variables and - non-inlined functions on declaration as syntax errors. We - allow the attribute for function definitions if declared - inline. */ - if (TREE_CODE (node) == FUNCTION_DECL && DECL_INITIAL (node) - && !DECL_DECLARED_INLINE_P (node)) - { - error ("%Jfunction %qD definition is marked dllimport.", node, node); - *no_add_attrs = true; - } + non-inlined functions on declaration as syntax errors. */ + /* APPLE LOCAL begin mainline 2005-10-12 */ + else if (TREE_CODE (node) == FUNCTION_DECL && DECL_INITIAL (node)) + { + error ("%Jfunction %qD definition is marked dllimport.", node, node); + *no_add_attrs = true; + } + /* APPLE LOCAL end mainline 2005-10-12 */ else if (TREE_CODE (node) == VAR_DECL) - { - if (DECL_INITIAL (node)) - { - error ("%Jvariable %qD definition is marked dllimport.", - node, node); - *no_add_attrs = true; - } + /* APPLE LOCAL begin mainline 2005-10-12 */ + { + if (DECL_INITIAL (node)) + { + error ("%Jvariable %qD definition is marked dllimport.", + node, node); + *no_add_attrs = true; + } - /* `extern' needn't be specified with dllimport. - Specify `extern' now and hope for the best. Sigh. */ - DECL_EXTERNAL (node) = 1; - /* Also, implicitly give dllimport'd variables declared within - a function global scope, unless declared static. */ - if (current_function_decl != NULL_TREE && !TREE_STATIC (node)) - TREE_PUBLIC (node) = 1; - } + /* `extern' needn't be specified with dllimport. + Specify `extern' now and hope for the best. Sigh. */ + DECL_EXTERNAL (node) = 1; + /* Also, implicitly give dllimport'd variables declared within + a function global scope, unless declared static. */ + if (current_function_decl != NULL_TREE && !TREE_STATIC (node)) + TREE_PUBLIC (node) = 1; + } + + if (*no_add_attrs == false) + DECL_DLLIMPORT_P (node) = 1; + /* APPLE LOCAL end mainline 2005-10-12 */ } /* Report error if symbol is not accessible at global scope. */ Modified: apple-local/branches/llvm/gcc/tree.h =================================================================== --- apple-local/branches/llvm/gcc/tree.h 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/tree.h 2007-02-21 20:19:03 UTC (rev 124163) @@ -2368,9 +2368,10 @@ #define DECL_LANG_FLAG_6(NODE) (DECL_CHECK (NODE)->decl.lang_flag_6) #define DECL_LANG_FLAG_7(NODE) (DECL_CHECK (NODE)->decl.lang_flag_7) -/* Used to indicate that the pointer to this DECL cannot be treated as - an address constant. */ -#define DECL_NON_ADDR_CONST_P(NODE) (DECL_CHECK (NODE)->decl.non_addr_const_p) + /* APPLE LOCAL begin mainline 2005-10-12 */ +/* Used to indicate that the DECL is a dllimport. */ +#define DECL_DLLIMPORT_P(NODE) (DECL_CHECK (NODE)->decl.dllimport_flag) + /* APPLE LOCAL end mainline 2005-10-12 */ /* Used in a FIELD_DECL to indicate that we cannot form the address of this component. */ @@ -2463,7 +2464,9 @@ unsigned artificial_flag : 1; unsigned weak_flag : 1; - unsigned non_addr_const_p : 1; + /* APPLE LOCAL begin mainline 2005-10-12 */ + unsigned dllimport_flag : 1; + /* APPLE LOCAL end mainline 2005-10-12 */ unsigned no_instrument_function_entry_exit : 1; unsigned comdat_flag : 1; unsigned malloc_flag : 1; Modified: apple-local/branches/llvm/gcc/varasm.c =================================================================== --- apple-local/branches/llvm/gcc/varasm.c 2007-02-21 17:50:03 UTC (rev 124162) +++ apple-local/branches/llvm/gcc/varasm.c 2007-02-21 20:19:03 UTC (rev 124163) @@ -3705,7 +3705,9 @@ if (value && TREE_CODE (value) == FUNCTION_DECL && ((decl_function_context (value) && !DECL_NO_STATIC_CHAIN (value)) - || DECL_NON_ADDR_CONST_P (value))) + /* APPLE LOCAL begin mainline 2005-10-12 */ + || DECL_DLLIMPORT_P (value))) + /* APPLE LOCAL end mainline 2005-10-12 */ return NULL_TREE; return value; From echeng at apple.com Mon Feb 26 15:23:57 2007 From: echeng at apple.com (echeng at apple.com) Date: Mon, 26 Feb 2007 13:23:57 -0800 (PST) Subject: [llvm-commits] [124325] llvm_get_type cannot be extern inline since it' s externally referenced. Message-ID: <20070226212357.47365672282A@src> Revision: 124325 Author: echeng Date: 2007-02-26 13:23:54 -0800 (Mon, 26 Feb 2007) Log Message: ----------- llvm_get_type cannot be extern inline since it's externally referenced. Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-types.cpp Modified: apple-local/branches/llvm/gcc/llvm-types.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-types.cpp 2007-02-26 19:41:31 UTC (rev 124324) +++ apple-local/branches/llvm/gcc/llvm-types.cpp 2007-02-26 21:23:54 UTC (rev 124325) @@ -91,8 +91,7 @@ // Get LLVM Type for the GCC tree node based on LTypes vector index. // When GCC tree node is initialized, it has 0 as the index value. This is // why all recorded indexes are offset by 1. -extern "C" inline const Type *llvm_get_type(unsigned Index) { - +extern "C" const Type *llvm_get_type(unsigned Index) { if (Index == 0) return NULL; assert ((Index - 1) < LTypes.size() && "Invalid LLVM Type index"); From alenhar2 at cs.uiuc.edu Mon Feb 26 15:34:52 2007 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 26 Feb 2007 15:34:52 -0600 Subject: [llvm-commits] [see] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200702262134.l1QLYqHZ007175@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.536.2.1.2.2 -> 1.536.2.1.2.3 --- Log message: This happens a lot in the kernel. Getting rid of the int to ptr casts really helps DSA --- Diffs of the changes: (+11 -0) InstructionCombining.cpp | 11 +++++++++++ 1 files changed, 11 insertions(+) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.536.2.1.2.2 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.536.2.1.2.3 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.536.2.1.2.2 Fri Feb 23 11:24:11 2007 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Mon Feb 26 15:34:35 2007 @@ -5921,6 +5921,17 @@ } } } + + //and x,c -> cast int to ptr ==> cast (GEP (cast x to sbyte*), 0 - (and x, ~c)) to ptr + if (SrcI->getOpcode() == Instruction::And && isa(CI.getType()) && SrcI->getType()->isInteger() + && isa(SrcI->getOperand(1))) { + Value* BC = InsertCastBefore(SrcI->getOperand(0), PointerType::get(Type::SByteTy), CI); + Value* Tp = InsertNewInstBefore(BinaryOperator::createNot(SrcI->getOperand(1)), CI); + Tp = InsertNewInstBefore(BinaryOperator::createAnd(SrcI->getOperand(0), Tp), CI); + Tp = InsertNewInstBefore(BinaryOperator::createSub(ConstantInt::get(SrcI->getType(), 0), Tp), CI); + Tp = InsertNewInstBefore(new GetElementPtrInst(BC, Tp), CI); + return new CastInst(Tp, CI.getType()); + } } return 0; From evan.cheng at apple.com Mon Feb 26 15:36:34 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 26 Feb 2007 15:36:34 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp Message-ID: <200702262136.l1QLaYcm011958@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: LiveIntervalAnalysis.cpp updated: 1.215 -> 1.216 --- Log message: Joining an interval with a dead copy instruction. Shorten the live range to the last use. --- Diffs of the changes: (+46 -20) LiveIntervalAnalysis.cpp | 66 ++++++++++++++++++++++++++++++++--------------- 1 files changed, 46 insertions(+), 20 deletions(-) Index: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp diff -u llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.215 llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.216 --- llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.215 Sun Feb 25 03:46:31 2007 +++ llvm/lib/CodeGen/LiveIntervalAnalysis.cpp Mon Feb 26 15:36:03 2007 @@ -900,6 +900,7 @@ // are joined. MachineOperand *mopd = CopyMI->findRegisterDefOperand(DstReg); bool isDead = mopd->isDead(); + bool isShorten = false; unsigned SrcStart = 0; unsigned SrcEnd = 0; if (isDead) { @@ -911,9 +912,22 @@ // The instruction which defines the src is only truly dead if there are // no intermediate uses and there isn't a use beyond the copy. // FIXME: find the last use, mark is kill and shorten the live range. - if (SrcEnd > getDefIndex(CopyIdx) || - hasRegisterUse(repSrcReg, SrcStart, CopyIdx)) + if (SrcEnd > getDefIndex(CopyIdx)) isDead = false; + else { + MachineOperand *MOU; + MachineInstr *LastUse = + lastRegisterUse(repSrcReg, SrcStart, CopyIdx, MOU); + if (LastUse) { + // Shorten the liveinterval to the end of last use. + MOU->setIsKill(); + isDead = false; + isShorten = true; + SrcEnd = getUseIndex(getInstructionIndex(LastUse)); + } + } + if (isDead) + isShorten = true; } // Okay, attempt to join these two intervals. On failure, this returns false. @@ -926,15 +940,11 @@ if (SrcStart == 0 && MRegisterInfo::isPhysicalRegister(SrcReg)) { // Live-in to the function but dead. Remove it from MBB live-in set. // JoinIntervals may end up swapping the two intervals. - LiveInterval &LiveInInt = (repSrcReg == DestInt.reg) ? DestInt : SrcInt; - LiveInInt.removeRange(SrcStart, SrcEnd); MachineBasicBlock *MBB = CopyMI->getParent(); MBB->removeLiveIn(SrcReg); } else { MachineInstr *SrcMI = getInstructionFromIndex(SrcStart); if (SrcMI) { - // FIXME: SrcMI == NULL means the register is livein to a non-entry - // MBB. Remove the range from its live interval? MachineOperand *mops = SrcMI->findRegisterDefOperand(SrcReg); if (mops) // FIXME: mops == NULL means SrcMI defines a subregister? @@ -942,6 +952,12 @@ } } } + + if (isShorten) { + // Shorten the live interval. + LiveInterval &LiveInInt = (repSrcReg == DestInt.reg) ? DestInt : SrcInt; + LiveInInt.removeRange(SrcStart, SrcEnd); + } } else { // Coallescing failed. @@ -1481,27 +1497,37 @@ return !RegClass->contains(RegB); } -/// hasRegisterUse - Returns true if there is any use of the specific -/// reg between indexes Start and End. -bool -LiveIntervals::hasRegisterUse(unsigned Reg, unsigned Start, unsigned End) { - for (unsigned Index = Start+InstrSlots::NUM; Index < End; - Index += InstrSlots::NUM) { +/// lastRegisterUse - Returns the last use of the specific register between +/// cycles Start and End. It also returns the use operand by reference. It +/// returns NULL if there are no uses. +MachineInstr * +LiveIntervals::lastRegisterUse(unsigned Reg, unsigned Start, unsigned End, + MachineOperand *&MOU) { + int e = (End-1) / InstrSlots::NUM * InstrSlots::NUM; + int s = Start; + while (e >= s) { // Skip deleted instructions - while (Index < End && !getInstructionFromIndex(Index)) - Index += InstrSlots::NUM; - if (Index >= End) break; + MachineInstr *MI = getInstructionFromIndex(e); + while ((e - InstrSlots::NUM) >= s && !MI) { + e -= InstrSlots::NUM; + MI = getInstructionFromIndex(e); + } + if (e < s || MI == NULL) + return NULL; - MachineInstr *MI = getInstructionFromIndex(Index); - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { + for (unsigned i = 0, NumOps = MI->getNumOperands(); i != NumOps; ++i) { MachineOperand &MO = MI->getOperand(i); if (MO.isReg() && MO.isUse() && MO.getReg() && - mri_->regsOverlap(rep(MO.getReg()), Reg)) - return true; + mri_->regsOverlap(rep(MO.getReg()), Reg)) { + MOU = &MO; + return MI; + } } + + e -= InstrSlots::NUM; } - return false; + return NULL; } /// unsetRegisterKill - Unset IsKill property of all uses of specific register From evan.cheng at apple.com Mon Feb 26 15:37:53 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 26 Feb 2007 15:37:53 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h Message-ID: <200702262137.l1QLbr6I013434@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: LiveIntervalAnalysis.h updated: 1.74 -> 1.75 --- Log message: Joining an interval with a dead copy instruction. Shorten the live range to the last use. --- Diffs of the changes: (+5 -3) LiveIntervalAnalysis.h | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) Index: llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h diff -u llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h:1.74 llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h:1.75 --- llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h:1.74 Thu Feb 22 17:52:23 2007 +++ llvm/include/llvm/CodeGen/LiveIntervalAnalysis.h Mon Feb 26 15:37:37 2007 @@ -258,9 +258,11 @@ bool AdjustCopiesBackFrom(LiveInterval &IntA, LiveInterval &IntB, MachineInstr *CopyMI); - /// hasRegisterUse - Returns true if there is any use of the specific - /// reg between indexes Start and End. - bool hasRegisterUse(unsigned Reg, unsigned Start, unsigned End); + /// lastRegisterUse - Returns the last use of the specific register between + /// cycles Start and End. It also returns the use operand by reference. It + /// returns NULL if there are no uses. + MachineInstr *lastRegisterUse(unsigned Reg, unsigned Start, unsigned End, + MachineOperand *&MOU); /// unsetRegisterKill - Unset IsKill property of all uses of specific /// register of the specific instruction. From rspencer at reidspencer.com Mon Feb 26 17:09:34 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Mon, 26 Feb 2007 15:09:34 -0800 Subject: [llvm-commits] ConstantInt Patch #3 In-Reply-To: <1172522671.3004.31.camel@bashful.x10sys.com> References: <1172515589.3004.20.camel@bashful.x10sys.com> <1172522671.3004.31.camel@bashful.x10sys.com> Message-ID: <1172531374.3004.43.camel@bashful.x10sys.com> One more time .. This one avoids collisions in the IntConstants map by using APInt directly in the DenseMap. This was made possible by relaxing APInt::operator= and using a small structure for the key type so that we can do operator== correctly for APInt (handling different bit widths). This passes tests. I'm likely to commit this soonish. Reid. On Mon, 2007-02-26 at 12:44 -0800, Reid Spencer wrote: > Chris, > > Here is round two. This is a slightly larger patch that also includes > the following changes: > > * APInt::getValue() -> getSExtValue() and getZExtValue() > * const APInt& ConstantInt::getValue() const { return Val; } > * ConstantInt::get(const Type*, const APInt&) > * APInt constructor for ConstantInt::get to use > * APInt::getHashValue() -- used for the DenseMap of ConstantInt > values. > * Changes in Constants.cpp to use getHashValue() for the key in > the map of ConstantInt values. > Reid. > > On Mon, 2007-02-26 at 10:46 -0800, Reid Spencer wrote: > > Hi, > > > > I would like to commit this small patch but thought I should send it out > > first. This changes ConstantInt to use an APInt object as its value > > instead of a uint64_t. The interface to ConstantInt still uses uint64_t > > so the APInt is just being used as a glorified uint64_t as all bit > > widths are <= 64. This change passes DejaGnu, the MultiSource/Benchmarks > > test suite, and a few of the SPEC benchmarks that I tried (444.namd, > > 176.gcc, 473.astar). > > > > Okay to commit? > > > > Reid. > > _______________________________________________ > > llvm-commits mailing list > > llvm-commits at cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits -------------- next part -------------- A non-text attachment was scrubbed... Name: ConstantInt3.patch Type: text/x-patch Size: 15868 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070226/35716fff/attachment.bin From clattner at apple.com Mon Feb 26 17:15:11 2007 From: clattner at apple.com (Chris Lattner) Date: Mon, 26 Feb 2007 15:15:11 -0800 Subject: [llvm-commits] ConstantInt Patch #3 In-Reply-To: <1172531374.3004.43.camel@bashful.x10sys.com> References: <1172515589.3004.20.camel@bashful.x10sys.com> <1172522671.3004.31.camel@bashful.x10sys.com> <1172531374.3004.43.camel@bashful.x10sys.com> Message-ID: On Feb 26, 2007, at 3:09 PM, Reid Spencer wrote: > This one avoids collisions in the IntConstants map by using APInt > directly in the DenseMap. This was made possible by relaxing > APInt::operator= and using a small structure for the key type so > that we > can do operator== correctly for APInt (handling different bit widths). Please eliminate the uint64_t version of the ConstantInt ctor: two ::get method's is fine, but you want just one ctor. I don't see the use of the uint64_t version anyway. + APInt first; + const Type* second; Please give these meaningful names. + bool operator==(const KeyTy& that) const { + if (this == &that) + return true; You can drop this 'fast path' that will never be true. + return second == that.second && + this->first.getBitWidth() == that.first.getBitWidth () && + this->first == that.first; If the 'second's match, how could the types not match. Otherwise, looks good. I didn't look at the APInt diff. -Chris > This passes tests. I'm likely to commit this soonish. > > Reid. > > On Mon, 2007-02-26 at 12:44 -0800, Reid Spencer wrote: >> Chris, >> >> Here is round two. This is a slightly larger patch that also includes >> the following changes: >> >> * APInt::getValue() -> getSExtValue() and getZExtValue() >> * const APInt& ConstantInt::getValue() const { return Val; } >> * ConstantInt::get(const Type*, const APInt&) >> * APInt constructor for ConstantInt::get to use >> * APInt::getHashValue() -- used for the DenseMap of >> ConstantInt >> values. >> * Changes in Constants.cpp to use getHashValue() for the key in >> the map of ConstantInt values. >> Reid. >> >> On Mon, 2007-02-26 at 10:46 -0800, Reid Spencer wrote: >>> Hi, >>> >>> I would like to commit this small patch but thought I should send >>> it out >>> first. This changes ConstantInt to use an APInt object as its value >>> instead of a uint64_t. The interface to ConstantInt still uses >>> uint64_t >>> so the APInt is just being used as a glorified uint64_t as all bit >>> widths are <= 64. This change passes DejaGnu, the MultiSource/ >>> Benchmarks >>> test suite, and a few of the SPEC benchmarks that I tried (444.namd, >>> 176.gcc, 473.astar). >>> >>> Okay to commit? >>> >>> Reid. >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits at cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Mon Feb 26 17:16:34 2007 From: clattner at apple.com (Chris Lattner) Date: Mon, 26 Feb 2007 15:16:34 -0800 Subject: [llvm-commits] ConstantInt Patch #3 In-Reply-To: References: <1172515589.3004.20.camel@bashful.x10sys.com> <1172522671.3004.31.camel@bashful.x10sys.com> <1172531374.3004.43.camel@bashful.x10sys.com> Message-ID: <07EDD15C-92BF-41E0-B74A-5E0CDF4E1848@apple.com> On Feb 26, 2007, at 3:15 PM, Chris Lattner wrote: > + return second == that.second && > + this->first.getBitWidth() == that.first.getBitWidth > () && > + this->first == that.first; > > If the 'second's match, how could the types not match. More coherently, you can drop the second line of the condition. -Chris From reid at x10sys.com Mon Feb 26 17:38:38 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 17:38:38 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702262338.l1QNccCi026051@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.49 -> 1.50 --- Log message: 1. Make sure all delete operators of arrays use the array form of delete. 2. Rewrite operator=(const APInt& RHS) to allow the RHS to be a different bit width than the LHS. This makes it possible to use APInt as the key of a DenseMap, as needed for the IntConstants map in Constants.cpp 3. Fix operator=(uint64_t) to clear unused bits in case the client assigns a value that has more bits than the APInt allows. 4. Assert that bit widths are equal in operator== 5. Revise getHashValue() to put the bit width in the low order six bits. This should help to make i1 0, i2 0, ... i64 0 all distinct in the IntConstants DenseMap. --- Diffs of the changes: (+45 -19) APInt.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 45 insertions(+), 19 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.49 llvm/lib/Support/APInt.cpp:1.50 --- llvm/lib/Support/APInt.cpp:1.49 Mon Feb 26 15:02:27 2007 +++ llvm/lib/Support/APInt.cpp Mon Feb 26 17:38:21 2007 @@ -99,16 +99,43 @@ APInt::~APInt() { if (!isSingleWord() && pVal) - delete[] pVal; + delete [] pVal; } APInt& APInt::operator=(const APInt& RHS) { - assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); - if (isSingleWord()) + // Don't do anything for X = X + if (this == &RHS) + return *this; + + // If the bitwidths are the same, we can avoid mucking with memory + if (BitWidth == RHS.getBitWidth()) { + if (isSingleWord()) + VAL = RHS.VAL; + else + memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE); + return *this; + } + + if (isSingleWord()) + if (RHS.isSingleWord()) + VAL = RHS.VAL; + else { + VAL = 0; + pVal = getMemory(RHS.getNumWords()); + memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE); + } + else if (getNumWords() == RHS.getNumWords()) + memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE); + else if (RHS.isSingleWord()) { + delete [] pVal; VAL = RHS.VAL; - else - memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE); - return *this; + } else { + delete [] pVal; + pVal = getMemory(RHS.getNumWords()); + memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE); + } + BitWidth = RHS.BitWidth; + return clearUnusedBits(); } APInt& APInt::operator=(uint64_t RHS) { @@ -118,7 +145,7 @@ pVal[0] = RHS; memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE); } - return *this; + return clearUnusedBits(); } /// add_1 - This function adds a single "digit" integer, y, to the multiple @@ -457,6 +484,7 @@ } bool APInt::operator==(const APInt& RHS) const { + assert(BitWidth == RHS.BitWidth && "Comparison requires equal bit widths"); if (isSingleWord()) return VAL == RHS.VAL; @@ -662,17 +690,15 @@ } uint64_t APInt::getHashValue() const { - // LLVM only supports bit widths up to 2^23 so shift the bitwidth into the - // high range. This makes the hash unique for integer values < 2^41 bits and - // doesn't hurt for larger values. - uint64_t hash = uint64_t(BitWidth) << (APINT_BITS_PER_WORD - 23); + // Put the bit width into the low order bits. + uint64_t hash = BitWidth; // Add the sum of the words to the hash. if (isSingleWord()) - hash += VAL; + hash += VAL << 6; // clear separation of up to 64 bits else for (uint32_t i = 0; i < getNumWords(); ++i) - hash += pVal[i]; + hash += pVal[i] << 6; // clear sepration of up to 64 bits return hash; } @@ -867,12 +893,12 @@ if (wordsAfter == 1) { uint64_t *tmp = pVal; VAL = pVal[0]; - delete tmp; + delete [] tmp; } else { uint64_t *newVal = getClearedMemory(wordsAfter); for (uint32_t i = 0; i < wordsAfter; ++i) newVal[i] = pVal[i]; - delete pVal; + delete [] pVal; pVal = newVal; } } @@ -920,7 +946,7 @@ for (uint32_t i = wordsBefore; i < wordsAfter; i++) newVal[i] = -1ULL; if (wordsBefore != 1) - delete pVal; + delete [] pVal; pVal = newVal; clearUnusedBits(); } @@ -940,7 +966,7 @@ for (uint32_t i = 0; i < wordsBefore; ++i) newVal[i] = pVal[i]; if (wordsBefore != 1) - delete pVal; + delete [] pVal; pVal = newVal; } } @@ -1407,7 +1433,7 @@ if (Quotient->isSingleWord()) Quotient->VAL = 0; else - delete Quotient->pVal; + delete [] Quotient->pVal; Quotient->BitWidth = LHS.BitWidth; if (!Quotient->isSingleWord()) Quotient->pVal = getClearedMemory(Quotient->getNumWords()); @@ -1438,7 +1464,7 @@ if (Remainder->isSingleWord()) Remainder->VAL = 0; else - delete Remainder->pVal; + delete [] Remainder->pVal; Remainder->BitWidth = RHS.BitWidth; if (!Remainder->isSingleWord()) Remainder->pVal = getClearedMemory(Remainder->getNumWords()); From reid at x10sys.com Mon Feb 26 17:54:21 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 17:54:21 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Constants.h Message-ID: <200702262354.l1QNsLjk026311@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Constants.h updated: 1.132 -> 1.133 --- Log message: For PR1205: http://llvm.org/PR1205 : Implement the first step towards arbitrary precision integer support in LLVM. The APInt class provides arbitrary precision arithmetic and value representation. This patch changes ConstantInt to use APInt as its value representation without supporting bit widths > 64 yet. That change will come after ConstantFolding handles bit widths > 64 bits. --- Diffs of the changes: (+30 -25) Constants.h | 55 ++++++++++++++++++++++++++++++------------------------- 1 files changed, 30 insertions(+), 25 deletions(-) Index: llvm/include/llvm/Constants.h diff -u llvm/include/llvm/Constants.h:1.132 llvm/include/llvm/Constants.h:1.133 --- llvm/include/llvm/Constants.h:1.132 Tue Feb 20 01:18:01 2007 +++ llvm/include/llvm/Constants.h Mon Feb 26 17:54:03 2007 @@ -22,6 +22,7 @@ #include "llvm/Constant.h" #include "llvm/Type.h" +#include "llvm/ADT/APInt.h" namespace llvm { @@ -42,30 +43,39 @@ class ConstantInt : public Constant { static ConstantInt *TheTrueVal, *TheFalseVal; ConstantInt(const ConstantInt &); // DO NOT IMPLEMENT - ConstantInt(const IntegerType *Ty, uint64_t V); - uint64_t Val; + ConstantInt(const IntegerType *Ty, const APInt& V); + APInt Val; public: + /// Return the constant as an APInt value reference. This allows clients to + /// obtain a copy of the value, with all its precision in tact. + /// @brief Return the constant's value. + inline const APInt& getValue() const { + return Val; + } + /// Return the constant as a 64-bit unsigned integer value after it - /// has been zero extended as appropriate for the type of this constant. + /// has been zero extended as appropriate for the type of this constant. Note + /// that this method can assert if the value does not fit in 64 bits. + /// @deprecated /// @brief Return the zero extended value. inline uint64_t getZExtValue() const { - return Val; + return Val.getZExtValue(); } /// Return the constant as a 64-bit integer value after it has been sign - /// sign extended as appropriate for the type of this constant. + /// sign extended as appropriate for the type of this constant. Note that + /// this method can assert if the value does not fit in 64 bits. + /// @deprecated /// @brief Return the sign extended value. inline int64_t getSExtValue() const { - unsigned Size = Value::getType()->getPrimitiveSizeInBits(); - return (int64_t(Val) << (64-Size)) >> (64-Size); + return Val.getSExtValue(); } + /// A helper method that can be used to determine if the constant contained /// within is equal to a constant. This only works for very small values, /// because this is all that can be represented with all types. /// @brief Determine if this constant's value is same as an unsigned char. - bool equalsInt(unsigned char V) const { - assert(V <= 127 && - "equalsInt: Can only be used with very small positive constants!"); + bool equalsInt(uint64_t V) const { return Val == V; } @@ -85,6 +95,7 @@ /// sized/signed value for the type Ty. /// @brief Get a ConstantInt for a specific value. static ConstantInt *get(const Type *Ty, int64_t V); + static ConstantInt *get(const Type *Ty, const APInt& V); /// getType - Specialize the getType() method to always return an IntegerType, /// which reduces the amount of casting needed in parts of the compiler. @@ -118,7 +129,7 @@ /// @returns true iff this constant's bits are all set to true. /// @brief Determine if the value is all ones. bool isAllOnesValue() const { - return getSExtValue() == -1; + return Val.isAllOnesValue(); } /// This function will return true iff this constant represents the largest @@ -127,13 +138,10 @@ /// by this type. /// @brief Determine if the value is maximal. bool isMaxValue(bool isSigned) const { - if (isSigned) { - int64_t V = getSExtValue(); - if (V < 0) return false; // Be careful about wrap-around on 'long's - ++V; - return !isValueValidForType(Value::getType(), V) || V < 0; - } - return isAllOnesValue(); + if (isSigned) + return Val.isMaxSignedValue(); + else + return Val.isMaxValue(); } /// This function will return true iff this constant represents the smallest @@ -142,13 +150,10 @@ /// this type. /// @brief Determine if the value is minimal. bool isMinValue(bool isSigned) const { - if (isSigned) { - int64_t V = getSExtValue(); - if (V > 0) return false; // Be careful about wrap-around on 'long's - --V; - return !isValueValidForType(Value::getType(), V) || V > 0; - } - return getZExtValue() == 0; + if (isSigned) + return Val.isMinSignedValue(); + else + return Val.isMinValue(); } /// @returns the value for an integer constant of the given type that has all From reid at x10sys.com Mon Feb 26 17:54:23 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 17:54:23 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp Message-ID: <200702262354.l1QNsNxk026316@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Constants.cpp updated: 1.220 -> 1.221 --- Log message: For PR1205: http://llvm.org/PR1205 : Implement the first step towards arbitrary precision integer support in LLVM. The APInt class provides arbitrary precision arithmetic and value representation. This patch changes ConstantInt to use APInt as its value representation without supporting bit widths > 64 yet. That change will come after ConstantFolding handles bit widths > 64 bits. --- Diffs of the changes: (+49 -16) Constants.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 49 insertions(+), 16 deletions(-) Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.220 llvm/lib/VMCore/Constants.cpp:1.221 --- llvm/lib/VMCore/Constants.cpp:1.220 Tue Feb 20 15:30:56 2007 +++ llvm/lib/VMCore/Constants.cpp Mon Feb 26 17:54:03 2007 @@ -138,8 +138,9 @@ // ConstantInt //===----------------------------------------------------------------------===// -ConstantInt::ConstantInt(const IntegerType *Ty, uint64_t V) +ConstantInt::ConstantInt(const IntegerType *Ty, const APInt& V) : Constant(Ty, ConstantIntVal, 0, 0), Val(V) { + assert(V.getBitWidth() == Ty->getBitWidth() && "Invalid constant for type"); } ConstantInt *ConstantInt::TheTrueVal = 0; @@ -166,32 +167,55 @@ namespace { - struct DenseMapInt64KeyInfo { - typedef std::pair KeyTy; - static inline KeyTy getEmptyKey() { return KeyTy(0, 0); } - static inline KeyTy getTombstoneKey() { return KeyTy(1, 0); } + struct DenseMapAPIntKeyInfo { + struct KeyTy { + APInt val; + const Type* type; + KeyTy(const APInt& V, const Type* Ty) : val(V), type(Ty) {} + KeyTy(const KeyTy& that) : val(that.val), type(that.type) {} + bool operator==(const KeyTy& that) const { + return type == that.type && this->val == that.val; + } + bool operator!=(const KeyTy& that) const { + return !this->operator==(that); + } + }; + static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); } + static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); } static unsigned getHashValue(const KeyTy &Key) { - return DenseMapKeyInfo::getHashValue(Key.second) ^ Key.first; + return DenseMapKeyInfo::getHashValue(Key.type) ^ + Key.val.getHashValue(); } static bool isPod() { return true; } }; } -typedef DenseMap IntMapTy; +typedef DenseMap IntMapTy; static ManagedStatic IntConstants; -// Get a ConstantInt from an int64_t. Note here that we canoncialize the value -// to a uint64_t value that has been zero extended down to the size of the -// integer type of the ConstantInt. This allows the getZExtValue method to -// just return the stored value while getSExtValue has to convert back to sign -// extended. getZExtValue is more common in LLVM than getSExtValue(). ConstantInt *ConstantInt::get(const Type *Ty, int64_t V) { const IntegerType *ITy = cast(Ty); - V &= ITy->getBitMask(); - ConstantInt *&Slot = (*IntConstants)[std::make_pair(uint64_t(V), Ty)]; - if (Slot) return Slot; + APInt Tmp(ITy->getBitWidth(), V); + return get(Ty, Tmp); +} + +// Get a ConstantInt from a Type and APInt. Note that the value stored in +// the DenseMap as the key is a DensMapAPIntKeyInfo::KeyTy which has provided +// operator== and operator!= to ensure that the DenseMap doesn't attempt to +// compare APInt's of different widths, which would violate an APInt class +// invariant which generates an assertion. +ConstantInt *ConstantInt::get(const Type *Ty, const APInt& V) { + const IntegerType *ITy = cast(Ty); + assert(ITy->getBitWidth() == V.getBitWidth() && "Invalid type for constant"); + // get an existing value or the insertion position + DenseMapAPIntKeyInfo::KeyTy Key(V, Ty); + ConstantInt *&Slot = (*IntConstants)[Key]; + // if it exists, return it. + if (Slot) + return Slot; + // otherwise create a new one, insert it, and return it. return Slot = new ConstantInt(ITy, V); } @@ -215,6 +239,15 @@ namespace { + struct DenseMapInt64KeyInfo { + typedef std::pair KeyTy; + static inline KeyTy getEmptyKey() { return KeyTy(0, 0); } + static inline KeyTy getTombstoneKey() { return KeyTy(1, 0); } + static unsigned getHashValue(const KeyTy &Key) { + return DenseMapKeyInfo::getHashValue(Key.second) ^ Key.first; + } + static bool isPod() { return true; } + }; struct DenseMapInt32KeyInfo { typedef std::pair KeyTy; static inline KeyTy getEmptyKey() { return KeyTy(0, 0); } From reid at x10sys.com Mon Feb 26 19:28:27 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 19:28:27 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702270128.l1R1SROe027930@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.50 -> 1.51 --- Log message: Simplify and document RoundDoubleToAPInt. --- Diffs of the changes: (+15 -3) APInt.cpp | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.50 llvm/lib/Support/APInt.cpp:1.51 --- llvm/lib/Support/APInt.cpp:1.50 Mon Feb 26 17:38:21 2007 +++ llvm/lib/Support/APInt.cpp Mon Feb 26 19:28:10 2007 @@ -803,15 +803,27 @@ uint64_t I; } T; T.D = Double; + + // Get the sign bit from the highest order bit bool isNeg = T.I >> 63; + + // Get the 11-bit exponent and adjust for the 1023 bit bias int64_t exp = ((T.I >> 52) & 0x7ff) - 1023; + + // If the exponent is negative, the value is < 0 so just return 0. if (exp < 0) - return APInt(64ull, 0u); - uint64_t mantissa = ((T.I << 12) >> 12) | (1ULL << 52); + return APInt(64u, 0u); + + // Extract the mantissa by clearing the top 12 bits (sign + exponent). + uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52; + + // If the exponent doesn't shift all bits out of the mantissa if (exp < 52) return isNeg ? -APInt(64u, mantissa >> (52 - exp)) : APInt(64u, mantissa >> (52 - exp)); - APInt Tmp(exp + 1, mantissa); + + // Otherwise, we have to shift the mantissa bits up to the right location + APInt Tmp(exp+1, mantissa); Tmp = Tmp.shl(exp - 52); return isNeg ? -Tmp : Tmp; } From evan.cheng at apple.com Mon Feb 26 19:58:21 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 26 Feb 2007 19:58:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/PrologEpilogInserter.cpp RegisterScavenging.cpp Message-ID: <200702270158.l1R1wLCk028561@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: PrologEpilogInserter.cpp updated: 1.69 -> 1.70 RegisterScavenging.cpp updated: 1.3 -> 1.4 --- Log message: forward() should not increment internal iterator. Its client may insert instruction between now and next forward() call. --- Diffs of the changes: (+26 -5) PrologEpilogInserter.cpp | 2 +- RegisterScavenging.cpp | 29 +++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/PrologEpilogInserter.cpp diff -u llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.69 llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.70 --- llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.69 Thu Feb 22 19:11:26 2007 +++ llvm/lib/CodeGen/PrologEpilogInserter.cpp Mon Feb 26 19:58:04 2007 @@ -455,7 +455,7 @@ } // Update register states. if (MRI.requiresRegisterScavenging()) - RS.forward(); + RS.forward(I); } } } Index: llvm/lib/CodeGen/RegisterScavenging.cpp diff -u llvm/lib/CodeGen/RegisterScavenging.cpp:1.3 llvm/lib/CodeGen/RegisterScavenging.cpp:1.4 --- llvm/lib/CodeGen/RegisterScavenging.cpp:1.3 Sun Feb 25 03:47:31 2007 +++ llvm/lib/CodeGen/RegisterScavenging.cpp Mon Feb 26 19:58:04 2007 @@ -22,10 +22,11 @@ #include "llvm/Target/MRegisterInfo.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/ADT/STLExtras.h" using namespace llvm; RegScavenger::RegScavenger(MachineBasicBlock *mbb) - : MBB(mbb), MBBI(mbb->begin()) { + : MBB(mbb), MBBIInited(false) { const MachineFunction &MF = *MBB->getParent(); const TargetMachine &TM = MF.getTarget(); const MRegisterInfo *RegInfo = TM.getRegisterInfo(); @@ -52,6 +53,14 @@ } void RegScavenger::forward() { + assert(MBBI != MBB->end() && "Already at the end of the basic block!"); + // Move ptr forward. + if (!MBBIInited) { + MBBI = MBB->begin(); + MBBIInited = true; + } else + MBBI = next(MBBI); + MachineInstr *MI = MBBI; // Process uses first. BitVector ChangedRegs(NumPhysRegs); @@ -86,12 +95,14 @@ if (!MO.isDead()) setUsed(Reg); } - - ++MBBI; } void RegScavenger::backward() { - MachineInstr *MI = --MBBI; + assert(MBBI != MBB->begin() && "Already at start of basic block!"); + // Move ptr backward. + MBBI = prior(MBBI); + + MachineInstr *MI = MBBI; // Process defs first. const TargetInstrDescriptor *TID = MI->getInstrDescriptor(); for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { @@ -122,6 +133,16 @@ setUsed(ChangedRegs); } +void RegScavenger::forward(MachineBasicBlock::iterator I) { + while (MBBI != I) + forward(); +} + +void RegScavenger::backward(MachineBasicBlock::iterator I) { + while (MBBI != I) + backward(); +} + /// CreateRegClassMask - Set the bits that represent the registers in the /// TargetRegisterClass. static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) { From evan.cheng at apple.com Mon Feb 26 19:59:05 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 26 Feb 2007 19:59:05 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/RegisterScavenging.h Message-ID: <200702270159.l1R1x5aL028585@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: RegisterScavenging.h updated: 1.1 -> 1.2 --- Log message: forward() should not increment internal iterator. Its client may insert instruction between now and next forward() call. --- Diffs of the changes: (+6 -0) RegisterScavenging.h | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/include/llvm/CodeGen/RegisterScavenging.h diff -u llvm/include/llvm/CodeGen/RegisterScavenging.h:1.1 llvm/include/llvm/CodeGen/RegisterScavenging.h:1.2 --- llvm/include/llvm/CodeGen/RegisterScavenging.h:1.1 Thu Feb 22 19:01:19 2007 +++ llvm/include/llvm/CodeGen/RegisterScavenging.h Mon Feb 26 19:58:48 2007 @@ -27,6 +27,7 @@ class RegScavenger { MachineBasicBlock *MBB; MachineBasicBlock::iterator MBBI; + bool MBBIInited; unsigned NumPhysRegs; /// RegStates - The current state of all the physical registers immediately @@ -42,6 +43,11 @@ void forward(); void backward(); + /// forward / backward - Move the internal MBB iterator and update register + /// states until it has reached but not processed the specific iterator. + void forward(MachineBasicBlock::iterator I); + void backward(MachineBasicBlock::iterator I); + /// isReserved - Returns true if a register is reserved. It is never "unused". bool isReserved(unsigned Reg) const { return ReservedRegs[Reg]; } From reid at x10sys.com Mon Feb 26 20:34:19 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 20:34:19 -0600 Subject: [llvm-commits] CVS: llvm/test/Integer/a1.ll a1.ll.out a15.ll a15.ll.out a17.ll a17.ll.out a31.ll a31.ll.out a33.ll a33.ll.out a63.ll a63.ll.out a7.ll a7.ll.out a9.ll a9.ll.out Message-ID: <200702270234.l1R2YJo4029199@zion.cs.uiuc.edu> Changes in directory llvm/test/Integer: a1.ll updated: 1.4 -> 1.5 a1.ll.out updated: 1.3 -> 1.4 a15.ll updated: 1.4 -> 1.5 a15.ll.out updated: 1.3 -> 1.4 a17.ll updated: 1.4 -> 1.5 a17.ll.out updated: 1.3 -> 1.4 a31.ll updated: 1.4 -> 1.5 a31.ll.out updated: 1.3 -> 1.4 a33.ll updated: 1.4 -> 1.5 a33.ll.out updated: 1.3 -> 1.4 a63.ll updated: 1.4 -> 1.5 a63.ll.out updated: 1.3 -> 1.4 a7.ll updated: 1.5 -> 1.6 a7.ll.out updated: 1.4 -> 1.5 a9.ll updated: 1.4 -> 1.5 a9.ll.out updated: 1.3 -> 1.4 --- Log message: Remove test cases that produce undefined results. --- Diffs of the changes: (+5 -33) a1.ll | 6 +++--- a1.ll.out | 4 ++-- a15.ll | 2 -- a15.ll.out | 2 -- a17.ll | 2 -- a17.ll.out | 2 -- a31.ll | 2 -- a31.ll.out | 2 -- a33.ll | 2 -- a33.ll.out | 2 -- a63.ll | 2 -- a63.ll.out | 2 -- a7.ll | 2 -- a7.ll.out | 2 -- a9.ll | 2 -- a9.ll.out | 2 -- 16 files changed, 5 insertions(+), 33 deletions(-) Index: llvm/test/Integer/a1.ll diff -u llvm/test/Integer/a1.ll:1.4 llvm/test/Integer/a1.ll:1.5 --- llvm/test/Integer/a1.ll:1.4 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a1.ll Mon Feb 26 20:34:02 2007 @@ -12,13 +12,13 @@ @h = constant i1 shl(i1 1 , i1 1) @i = constant i1 shl(i1 1 , i1 0) - at j = constant i1 lshr(i1 1, i1 1) - at m = constant i1 ashr(i1 1, i1 1) + at j = constant i1 lshr(i1 1, i1 1) ; undefined + at m = constant i1 ashr(i1 1, i1 1) ; undefined @n = constant i1 mul(i1 -1, i1 1) @o = constant i1 sdiv(i1 -1, i1 1) @p = constant i1 sdiv(i1 1 , i1 -1) @q = constant i1 udiv(i1 -1, i1 1) @r = constant i1 udiv(i1 1, i1 -1) - at s = constant i1 srem(i1 -1, i1 1) + at s = constant i1 srem(i1 -1, i1 1) ; overflow @t = constant i1 urem(i1 -1, i1 1) Index: llvm/test/Integer/a1.ll.out diff -u llvm/test/Integer/a1.ll.out:1.3 llvm/test/Integer/a1.ll.out:1.4 --- llvm/test/Integer/a1.ll.out:1.3 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a1.ll.out Mon Feb 26 20:34:02 2007 @@ -8,13 +8,13 @@ @h = constant i1 false ; [#uses=0] @i = constant i1 true ; [#uses=0] @j = constant i1 false ; [#uses=0] - at m = constant i1 true ; [#uses=0] + at m = constant i1 false ; [#uses=0] @n = constant i1 true ; [#uses=0] @o = constant i1 true ; [#uses=0] @p = constant i1 true ; [#uses=0] @q = constant i1 true ; [#uses=0] @r = constant i1 true ; [#uses=0] - at s = constant i1 false ; [#uses=0] + at s = constant i1 srem (i1 true, i1 true) ; [#uses=0] @t = constant i1 false ; [#uses=0] implementation ; Functions: Index: llvm/test/Integer/a15.ll diff -u llvm/test/Integer/a15.ll:1.4 llvm/test/Integer/a15.ll:1.5 --- llvm/test/Integer/a15.ll:1.4 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a15.ll Mon Feb 26 20:34:02 2007 @@ -13,9 +13,7 @@ @h = constant i15 shl(i15 1 , i15 15) @i = constant i15 shl(i15 1 , i15 14) @j = constant i15 lshr(i15 32767 , i15 14) - at k = constant i15 lshr(i15 32767 , i15 15) @l = constant i15 ashr(i15 32767 , i15 14) - at m = constant i15 ashr(i15 32767 , i15 15) @n = constant i15 mul(i15 32767, i15 2) @q = constant i15 mul(i15 -16383,i15 -3) Index: llvm/test/Integer/a15.ll.out diff -u llvm/test/Integer/a15.ll.out:1.3 llvm/test/Integer/a15.ll.out:1.4 --- llvm/test/Integer/a15.ll.out:1.3 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a15.ll.out Mon Feb 26 20:34:02 2007 @@ -8,9 +8,7 @@ @h = constant i15 0 ; [#uses=0] @i = constant i15 -16384 ; [#uses=0] @j = constant i15 1 ; [#uses=0] - at k = constant i15 0 ; [#uses=0] @l = constant i15 -1 ; [#uses=0] - at m = constant i15 -1 ; [#uses=0] @n = constant i15 -2 ; [#uses=0] @q = constant i15 16381 ; [#uses=0] @r = constant i15 0 ; [#uses=0] Index: llvm/test/Integer/a17.ll diff -u llvm/test/Integer/a17.ll:1.4 llvm/test/Integer/a17.ll:1.5 --- llvm/test/Integer/a17.ll:1.4 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a17.ll Mon Feb 26 20:34:02 2007 @@ -13,9 +13,7 @@ @h = constant i17 shl(i17 1 , i17 17) @i = constant i17 shl(i17 1 , i17 16) @j = constant i17 lshr(i17 131071 , i17 16) - at k = constant i17 lshr(i17 131071 , i17 17) @l = constant i17 ashr(i17 131071 , i17 16) - at m = constant i17 ashr(i17 131071 , i17 17) @n = constant i17 mul(i17 131071, i17 2) @q = constant i17 sdiv(i17 -1, i17 65535) Index: llvm/test/Integer/a17.ll.out diff -u llvm/test/Integer/a17.ll.out:1.3 llvm/test/Integer/a17.ll.out:1.4 --- llvm/test/Integer/a17.ll.out:1.3 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a17.ll.out Mon Feb 26 20:34:02 2007 @@ -8,9 +8,7 @@ @h = constant i17 0 ; [#uses=0] @i = constant i17 -65536 ; [#uses=0] @j = constant i17 1 ; [#uses=0] - at k = constant i17 0 ; [#uses=0] @l = constant i17 -1 ; [#uses=0] - at m = constant i17 -1 ; [#uses=0] @n = constant i17 -2 ; [#uses=0] @q = constant i17 0 ; [#uses=0] @r = constant i17 2 ; [#uses=0] Index: llvm/test/Integer/a31.ll diff -u llvm/test/Integer/a31.ll:1.4 llvm/test/Integer/a31.ll:1.5 --- llvm/test/Integer/a31.ll:1.4 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a31.ll Mon Feb 26 20:34:02 2007 @@ -13,9 +13,7 @@ @h = constant i31 shl(i31 1 , i31 31) @i = constant i31 shl(i31 1 , i31 30) @j = constant i31 lshr(i31 2147483647 , i31 30) - at k = constant i31 lshr(i31 2147483647 , i31 31) @l = constant i31 ashr(i31 2147483647 , i31 30) - at m = constant i31 ashr(i31 2147483647 , i31 31) @n = constant i31 mul(i31 2147483647, i31 2) @q = constant i31 sdiv(i31 -1, i31 1073741823) Index: llvm/test/Integer/a31.ll.out diff -u llvm/test/Integer/a31.ll.out:1.3 llvm/test/Integer/a31.ll.out:1.4 --- llvm/test/Integer/a31.ll.out:1.3 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a31.ll.out Mon Feb 26 20:34:02 2007 @@ -8,9 +8,7 @@ @h = constant i31 0 ; [#uses=0] @i = constant i31 -1073741824 ; [#uses=0] @j = constant i31 1 ; [#uses=0] - at k = constant i31 0 ; [#uses=0] @l = constant i31 -1 ; [#uses=0] - at m = constant i31 -1 ; [#uses=0] @n = constant i31 -2 ; [#uses=0] @q = constant i31 0 ; [#uses=0] @r = constant i31 2 ; [#uses=0] Index: llvm/test/Integer/a33.ll diff -u llvm/test/Integer/a33.ll:1.4 llvm/test/Integer/a33.ll:1.5 --- llvm/test/Integer/a33.ll:1.4 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a33.ll Mon Feb 26 20:34:02 2007 @@ -13,9 +13,7 @@ @h = constant i33 shl(i33 1 , i33 33) @i = constant i33 shl(i33 1 , i33 32) @j = constant i33 lshr(i33 8589934591 , i33 32) - at k = constant i33 lshr(i33 8589934591 , i33 33) @l = constant i33 ashr(i33 8589934591 , i33 32) - at m = constant i33 ashr(i33 8589934591 , i33 33) @n = constant i33 mul(i33 8589934591, i33 2) @q = constant i33 sdiv(i33 -1, i33 4294967295) Index: llvm/test/Integer/a33.ll.out diff -u llvm/test/Integer/a33.ll.out:1.3 llvm/test/Integer/a33.ll.out:1.4 --- llvm/test/Integer/a33.ll.out:1.3 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a33.ll.out Mon Feb 26 20:34:02 2007 @@ -8,9 +8,7 @@ @h = constant i33 0 ; [#uses=0] @i = constant i33 -4294967296 ; [#uses=0] @j = constant i33 1 ; [#uses=0] - at k = constant i33 0 ; [#uses=0] @l = constant i33 -1 ; [#uses=0] - at m = constant i33 -1 ; [#uses=0] @n = constant i33 -2 ; [#uses=0] @q = constant i33 0 ; [#uses=0] @r = constant i33 2 ; [#uses=0] Index: llvm/test/Integer/a63.ll diff -u llvm/test/Integer/a63.ll:1.4 llvm/test/Integer/a63.ll:1.5 --- llvm/test/Integer/a63.ll:1.4 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a63.ll Mon Feb 26 20:34:02 2007 @@ -13,9 +13,7 @@ @h = constant i63 shl(i63 1 , i63 63) @i = constant i63 shl(i63 1 , i63 62) @j = constant i63 lshr(i63 9223372036854775807 , i63 62) - at k = constant i63 lshr(i63 9223372036854775807 , i63 63) @l = constant i63 ashr(i63 9223372036854775807 , i63 62) - at m = constant i63 ashr(i63 9223372036854775807 , i63 63) @n = constant i63 mul(i63 9223372036854775807, i63 2) @q = constant i63 sdiv(i63 -1, i63 4611686018427387903) Index: llvm/test/Integer/a63.ll.out diff -u llvm/test/Integer/a63.ll.out:1.3 llvm/test/Integer/a63.ll.out:1.4 --- llvm/test/Integer/a63.ll.out:1.3 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a63.ll.out Mon Feb 26 20:34:02 2007 @@ -8,9 +8,7 @@ @h = constant i63 0 ; [#uses=0] @i = constant i63 -4611686018427387904 ; [#uses=0] @j = constant i63 1 ; [#uses=0] - at k = constant i63 0 ; [#uses=0] @l = constant i63 -1 ; [#uses=0] - at m = constant i63 -1 ; [#uses=0] @n = constant i63 -2 ; [#uses=0] @q = constant i63 0 ; [#uses=0] @u = constant i63 -1 ; [#uses=0] Index: llvm/test/Integer/a7.ll diff -u llvm/test/Integer/a7.ll:1.5 llvm/test/Integer/a7.ll:1.6 --- llvm/test/Integer/a7.ll:1.5 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a7.ll Mon Feb 26 20:34:02 2007 @@ -16,9 +16,7 @@ @h = constant i7 shl(i7 1 , i7 7) @i = constant i7 shl(i7 1 , i7 6) @j = constant i7 lshr(i7 127 , i7 6) - at k = constant i7 lshr(i7 127 , i7 7) @l = constant i7 ashr(i7 127 , i7 6) - at m = constant i7 ashr(i7 127 , i7 7) @m2= constant i7 ashr(i7 -1 , i7 3) @n = constant i7 mul(i7 127, i7 2) Index: llvm/test/Integer/a7.ll.out diff -u llvm/test/Integer/a7.ll.out:1.4 llvm/test/Integer/a7.ll.out:1.5 --- llvm/test/Integer/a7.ll.out:1.4 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a7.ll.out Mon Feb 26 20:34:02 2007 @@ -11,9 +11,7 @@ @h = constant i7 0 ; [#uses=0] @i = constant i7 -64 ; [#uses=0] @j = constant i7 1 ; [#uses=0] - at k = constant i7 0 ; [#uses=0] @l = constant i7 -1 ; [#uses=0] - at m = constant i7 -1 ; [#uses=0] @m2 = constant i7 -1 ; [#uses=0] @n = constant i7 -2 ; [#uses=0] @t = constant i7 -2 ; [#uses=0] Index: llvm/test/Integer/a9.ll diff -u llvm/test/Integer/a9.ll:1.4 llvm/test/Integer/a9.ll:1.5 --- llvm/test/Integer/a9.ll:1.4 Thu Feb 1 20:16:22 2007 +++ llvm/test/Integer/a9.ll Mon Feb 26 20:34:02 2007 @@ -13,9 +13,7 @@ @h = constant i9 shl(i9 1 , i9 9) @i = constant i9 shl(i9 1 , i9 8) @j = constant i9 lshr(i9 511 , i9 8) - at k = constant i9 lshr(i9 511 , i9 9) @l = constant i9 ashr(i9 511 , i9 8) - at m = constant i9 ashr(i9 511 , i9 9) @n = constant i9 mul(i9 511, i9 2) @q = constant i9 sdiv(i9 511, i9 2) Index: llvm/test/Integer/a9.ll.out diff -u llvm/test/Integer/a9.ll.out:1.3 llvm/test/Integer/a9.ll.out:1.4 --- llvm/test/Integer/a9.ll.out:1.3 Fri Jan 26 02:25:06 2007 +++ llvm/test/Integer/a9.ll.out Mon Feb 26 20:34:02 2007 @@ -8,9 +8,7 @@ @h = constant i9 0 ; [#uses=0] @i = constant i9 -256 ; [#uses=0] @j = constant i9 1 ; [#uses=0] - at k = constant i9 0 ; [#uses=0] @l = constant i9 -1 ; [#uses=0] - at m = constant i9 -1 ; [#uses=0] @n = constant i9 -2 ; [#uses=0] @q = constant i9 0 ; [#uses=0] @r = constant i9 255 ; [#uses=0] From reid at x10sys.com Mon Feb 26 20:45:28 2007 From: reid at x10sys.com (Reid Spencer) Date: Mon, 26 Feb 2007 20:45:28 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/PowerPC/calls.ll Message-ID: <200702270245.l1R2jSdj029388@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/PowerPC: calls.ll updated: 1.3 -> 1.4 --- Log message: XFAIL this on x86-Linux until its fixed. --- Diffs of the changes: (+1 -0) calls.ll | 1 + 1 files changed, 1 insertion(+) Index: llvm/test/CodeGen/PowerPC/calls.ll diff -u llvm/test/CodeGen/PowerPC/calls.ll:1.3 llvm/test/CodeGen/PowerPC/calls.ll:1.4 --- llvm/test/CodeGen/PowerPC/calls.ll:1.3 Fri Dec 1 22:23:08 2006 +++ llvm/test/CodeGen/PowerPC/calls.ll Mon Feb 26 20:45:12 2007 @@ -3,6 +3,7 @@ ; RUN: llvm-upgrade < %s | llvm-as | llc -march=ppc32 | grep 'bl ' | wc -l | grep 2 && ; RUN: llvm-upgrade < %s | llvm-as | llc -march=ppc32 | grep 'bctrl' | wc -l | grep 1 && ; RUN: llvm-upgrade < %s | llvm-as | llc -march=ppc32 | grep 'bla ' | wc -l | grep 1 +; XFAIL: [0-9x]86-pc-linux.* declare void %foo() From evan.cheng at apple.com Mon Feb 26 20:55:46 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 26 Feb 2007 20:55:46 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h PPCRegisterInfo.cpp PPCRegisterInfo.h Message-ID: <200702270255.l1R2tkE7029560@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCMachineFunctionInfo.h updated: 1.3 -> 1.4 PPCRegisterInfo.cpp updated: 1.112 -> 1.113 PPCRegisterInfo.h updated: 1.29 -> 1.30 --- Log message: Backing out Jim's LR spill changes. This was causing llvm-gcc bootstrapping to infinite loop: PPCMachineFunctionInfo.h updated: 1.2 -> 1.3 PPCRegisterInfo.cpp updated: 1.110 -> 1.111 PPCRegisterInfo.h updated: 1.28 -> 1.29 --- Diffs of the changes: (+2 -19) PPCMachineFunctionInfo.h | 7 ------- PPCRegisterInfo.cpp | 13 ++----------- PPCRegisterInfo.h | 1 - 3 files changed, 2 insertions(+), 19 deletions(-) Index: llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h diff -u llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.3 llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.4 --- llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.3 Fri Feb 23 14:34:16 2007 +++ llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h Mon Feb 26 20:55:29 2007 @@ -26,10 +26,6 @@ /// stored. Also used as an anchor for instructions that need to be altered /// when using frame pointers (dyna_add, dyna_sub.) int FramePointerSaveIndex; - - /// UsesLR - Indicates whether LR is used in the current function. - /// - bool UsesLR; public: PPCFunctionInfo(MachineFunction& MF) @@ -38,9 +34,6 @@ int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } - - void setUsesLR(bool U) { UsesLR = U; } - bool usesLR() { return UsesLR; } }; Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.112 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.113 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.112 Sat Feb 24 23:34:32 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Feb 26 20:55:29 2007 @@ -538,8 +538,8 @@ /// usesLR - Returns if the link registers (LR) has been used in the function. /// bool PPCRegisterInfo::usesLR(MachineFunction &MF) const { - PPCFunctionInfo *FI = MF.getInfo(); - return FI->usesLR(); + const bool *PhysRegsUsed = MF.getUsedPhysregs(); + return PhysRegsUsed[getRARegister()]; } void PPCRegisterInfo:: @@ -874,15 +874,6 @@ MFI->setStackSize(FrameSize); } -void PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF) - const { - // Save and clear the LR state. - PPCFunctionInfo *FI = MF.getInfo(); - unsigned LR = getRARegister(); - FI->setUsesLR(MF.isPhysRegUsed(LR)); - MF.changePhyRegUsed(LR, false); -} - void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const { MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB MachineBasicBlock::iterator MBBI = MBB.begin(); Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.h diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.29 llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.30 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.29 Fri Feb 23 14:34:16 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.h Mon Feb 26 20:55:29 2007 @@ -82,7 +82,6 @@ /// frame size. void determineFrameLayout(MachineFunction &MF) const; - void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const; void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; From sabre at nondot.org Mon Feb 26 21:05:23 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 21:05:23 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp Constants.cpp ConstantFolding.h Message-ID: <200702270305.l1R35NGr029922@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ConstantFold.cpp updated: 1.138 -> 1.139 Constants.cpp updated: 1.221 -> 1.222 ConstantFolding.h (r1.53) removed --- Log message: ConstantFolding.cpp/h -> ConstantFold.cpp/h to avoid confusion with lib/Analysis/ConstantFolding. --- Diffs of the changes: (+2 -2) ConstantFold.cpp | 2 +- Constants.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/VMCore/ConstantFold.cpp diff -u llvm/lib/VMCore/ConstantFold.cpp:1.138 llvm/lib/VMCore/ConstantFold.cpp:1.139 --- llvm/lib/VMCore/ConstantFold.cpp:1.138 Fri Feb 23 19:19:50 2007 +++ llvm/lib/VMCore/ConstantFold.cpp Mon Feb 26 21:05:06 2007 @@ -18,7 +18,7 @@ // //===----------------------------------------------------------------------===// -#include "ConstantFolding.h" +#include "ConstantFold.h" #include "llvm/Constants.h" #include "llvm/Instructions.h" #include "llvm/DerivedTypes.h" Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.221 llvm/lib/VMCore/Constants.cpp:1.222 --- llvm/lib/VMCore/Constants.cpp:1.221 Mon Feb 26 17:54:03 2007 +++ llvm/lib/VMCore/Constants.cpp Mon Feb 26 21:05:06 2007 @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Constants.h" -#include "ConstantFolding.h" +#include "ConstantFold.h" #include "llvm/DerivedTypes.h" #include "llvm/GlobalValue.h" #include "llvm/Instructions.h" From sabre at nondot.org Mon Feb 26 22:18:31 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 22:18:31 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200702270418.l1R4IVuu031150@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.341 -> 1.342 --- Log message: refactor x86-64 argument lowering yet again, this time eliminating templates, 'clients', etc, and adding CCValAssign instead. --- Diffs of the changes: (+179 -166) X86ISelLowering.cpp | 345 ++++++++++++++++++++++++++-------------------------- 1 files changed, 179 insertions(+), 166 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.341 llvm/lib/Target/X86/X86ISelLowering.cpp:1.342 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.341 Mon Feb 26 01:59:53 2007 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Feb 26 22:18:15 2007 @@ -1061,7 +1061,7 @@ class CallingConvState { unsigned StackOffset; const MRegisterInfo &MRI; - SmallVector UsedRegs; + SmallVector UsedRegs; public: CallingConvState(const MRegisterInfo &mri) : MRI(mri) { // No stack is used. @@ -1119,19 +1119,88 @@ } }; +/// CCValAssign - Represent assignment of one arg/retval to a location. +class CCValAssign { +public: + enum LocInfo { + Full, // The value fills the full location. + SExt, // The value is sign extended in the location. + ZExt, // The value is zero extended in the location. + AExt // The value is extended with undefined upper bits. + // TODO: a subset of the value is in the location. + }; +private: + /// ValNo - This is the value number begin assigned (e.g. an argument number). + unsigned ValNo; + + /// Loc is either a stack offset or a register number. + unsigned Loc; + + /// isMem - True if this is a memory loc, false if it is a register loc. + bool isMem : 1; + + /// Information about how the value is assigned. + LocInfo HTP : 7; + + /// ValVT - The type of the value being assigned. + MVT::ValueType ValVT : 8; + + /// LocVT - The type of the location being assigned to. + MVT::ValueType LocVT : 8; +public: + + static CCValAssign getReg(unsigned ValNo, MVT::ValueType ValVT, + unsigned RegNo, MVT::ValueType LocVT, + LocInfo HTP) { + CCValAssign Ret; + Ret.ValNo = ValNo; + Ret.Loc = RegNo; + Ret.isMem = false; + Ret.HTP = HTP; + Ret.ValVT = ValVT; + Ret.LocVT = LocVT; + return Ret; + } + static CCValAssign getMem(unsigned ValNo, MVT::ValueType ValVT, + unsigned Offset, MVT::ValueType LocVT, + LocInfo HTP) { + CCValAssign Ret; + Ret.ValNo = ValNo; + Ret.Loc = Offset; + Ret.isMem = true; + Ret.HTP = HTP; + Ret.ValVT = ValVT; + Ret.LocVT = LocVT; + return Ret; + } + + unsigned getValNo() const { return ValNo; } + MVT::ValueType getValVT() const { return ValVT; } + + bool isRegLoc() const { return !isMem; } + bool isMemLoc() const { return isMem; } + + unsigned getLocReg() const { assert(isRegLoc()); return Loc; } + unsigned getLocMemOffset() const { assert(isMemLoc()); return Loc; } + MVT::ValueType getLocVT() const { return LocVT; } + + LocInfo getLocInfo() const { return HTP; } +}; + + /// X86_64_CCC_AssignArgument - Implement the X86-64 C Calling Convention. -template -static void X86_64_CCC_AssignArgument(Client &C, CallingConvState &State, +static void X86_64_CCC_AssignArgument(unsigned ValNo, MVT::ValueType ArgVT, unsigned ArgFlags, - DataTy Data) { + CallingConvState &State, + SmallVector &Locs) { MVT::ValueType LocVT = ArgVT; - unsigned ExtendType = ISD::ANY_EXTEND; + CCValAssign::LocInfo LocInfo = CCValAssign::Full; // Promote the integer to 32 bits. If the input type is signed use a // sign extend, otherwise use a zero extend. if (ArgVT == MVT::i8 || ArgVT == MVT::i16) { LocVT = MVT::i32; - ExtendType = (ArgFlags & 1) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; + LocInfo = (ArgFlags & 1) ? CCValAssign::SExt : CCValAssign::ZExt; } // If this is a 32-bit value, assign to a 32-bit register if any are @@ -1141,7 +1210,7 @@ X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D }; if (unsigned Reg = State.AllocateReg(GPR32ArgRegs, 6)) { - C.AssignToReg(Data, Reg, ArgVT, LocVT, ExtendType); + Locs.push_back(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); return; } } @@ -1153,7 +1222,7 @@ X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9 }; if (unsigned Reg = State.AllocateReg(GPR64ArgRegs, 6)) { - C.AssignToReg(Data, Reg, ArgVT, LocVT, ExtendType); + Locs.push_back(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); return; } } @@ -1166,7 +1235,7 @@ X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 }; if (unsigned Reg = State.AllocateReg(XMMArgRegs, 8)) { - C.AssignToReg(Data, Reg, ArgVT, LocVT, ExtendType); + Locs.push_back(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); return; } } @@ -1176,144 +1245,19 @@ if (LocVT == MVT::i32 || LocVT == MVT::i64 || LocVT == MVT::f32 || LocVT == MVT::f64) { unsigned Offset = State.AllocateStack(8, 8); - C.AssignToStack(Data, Offset, ArgVT, LocVT, ExtendType); + Locs.push_back(CCValAssign::getMem(ValNo, ArgVT, Offset, LocVT, LocInfo)); return; } // Vectors get 16-byte stack slots that are 16-byte aligned. if (MVT::isVector(LocVT)) { unsigned Offset = State.AllocateStack(16, 16); - C.AssignToStack(Data, Offset, ArgVT, LocVT, ExtendType); + Locs.push_back(CCValAssign::getMem(ValNo, ArgVT, Offset, LocVT, LocInfo)); return; } assert(0 && "Unknown argument type!"); } -class LowerArgumentsClient { - SelectionDAG &DAG; - X86TargetLowering &TLI; - SmallVector &ArgValues; - SDOperand Chain; -public: - LowerArgumentsClient(SelectionDAG &dag, X86TargetLowering &tli, - SmallVector &argvalues, - SDOperand chain) - : DAG(dag), TLI(tli), ArgValues(argvalues), Chain(chain) { - - } - - void AssignToReg(SDOperand Arg, unsigned RegNo, - MVT::ValueType ArgVT, MVT::ValueType RegVT, - unsigned ExtendType) { - TargetRegisterClass *RC = NULL; - if (RegVT == MVT::i32) - RC = X86::GR32RegisterClass; - else if (RegVT == MVT::i64) - RC = X86::GR64RegisterClass; - else if (RegVT == MVT::f32) - RC = X86::FR32RegisterClass; - else if (RegVT == MVT::f64) - RC = X86::FR64RegisterClass; - else { - RC = X86::VR128RegisterClass; - } - - SDOperand ArgValue = DAG.getCopyFromReg(Chain, RegNo, RegVT); - AddLiveIn(DAG.getMachineFunction(), RegNo, RC); - - // If this is an 8 or 16-bit value, it is really passed promoted to 32 - // bits. Insert an assert[sz]ext to capture this, then truncate to the - // right size. - if (ArgVT < RegVT) { - if (ExtendType == ISD::SIGN_EXTEND) { - ArgValue = DAG.getNode(ISD::AssertSext, RegVT, ArgValue, - DAG.getValueType(ArgVT)); - } else if (ExtendType == ISD::ZERO_EXTEND) { - ArgValue = DAG.getNode(ISD::AssertZext, RegVT, ArgValue, - DAG.getValueType(ArgVT)); - } - ArgValue = DAG.getNode(ISD::TRUNCATE, ArgVT, ArgValue); - } - - ArgValues.push_back(ArgValue); - } - - void AssignToStack(SDOperand Arg, unsigned Offset, - MVT::ValueType ArgVT, MVT::ValueType DestVT, - unsigned ExtendType) { - // Create the SelectionDAG nodes corresponding to a load from this - // parameter. - MachineFunction &MF = DAG.getMachineFunction(); - MachineFrameInfo *MFI = MF.getFrameInfo(); - int FI = MFI->CreateFixedObject(MVT::getSizeInBits(ArgVT)/8, Offset); - SDOperand FIN = DAG.getFrameIndex(FI, TLI.getPointerTy()); - ArgValues.push_back(DAG.getLoad(ArgVT, Chain, FIN, NULL, 0)); - } -}; - -class LowerCallArgumentsClient { - SelectionDAG &DAG; - X86TargetLowering &TLI; - SmallVector, 8> &RegsToPass; - SmallVector &MemOpChains; - SDOperand Chain; - SDOperand StackPtr; -public: - LowerCallArgumentsClient(SelectionDAG &dag, X86TargetLowering &tli, - SmallVector, 8> &rtp, - SmallVector &moc, - SDOperand chain) - : DAG(dag), TLI(tli), RegsToPass(rtp), MemOpChains(moc), Chain(chain) { - - } - - void AssignToReg(SDOperand Arg, unsigned RegNo, - MVT::ValueType ArgVT, MVT::ValueType RegVT, - unsigned ExtendType) { - // If the argument has to be extended somehow before being passed, do so. - if (ArgVT < RegVT) - Arg = DAG.getNode(ExtendType, RegVT, Arg); - - RegsToPass.push_back(std::make_pair(RegNo, Arg)); - } - - void AssignToStack(SDOperand Arg, unsigned Offset, - MVT::ValueType ArgVT, MVT::ValueType DestVT, - unsigned ExtendType) { - // If the argument has to be extended somehow before being stored, do so. - if (ArgVT < DestVT) - Arg = DAG.getNode(ExtendType, DestVT, Arg); - - SDOperand SP = getSP(); - SDOperand PtrOff = DAG.getConstant(Offset, SP.getValueType()); - PtrOff = DAG.getNode(ISD::ADD, SP.getValueType(), SP, PtrOff); - MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0)); - } -private: - SDOperand getSP() { - if (StackPtr.Val == 0) { - MVT::ValueType PtrTy = TLI.getPointerTy(); - StackPtr = DAG.getRegister(TLI.getStackPtrReg(), PtrTy); - } - return StackPtr; - } -}; - -class EmptyArgumentsClient { -public: - EmptyArgumentsClient() {} - - void AssignToReg(SDOperand Arg, unsigned RegNo, - MVT::ValueType ArgVT, MVT::ValueType RegVT, - unsigned ExtendType) { - } - - void AssignToStack(SDOperand Arg, unsigned Offset, - MVT::ValueType ArgVT, MVT::ValueType DestVT, - unsigned ExtendType) { - } -}; - SDOperand X86TargetLowering::LowerX86_64CCCArguments(SDOperand Op, SelectionDAG &DAG) { @@ -1335,15 +1279,62 @@ CallingConvState CCState(*getTargetMachine().getRegisterInfo()); - LowerArgumentsClient Client(DAG, *this, ArgValues, Root); - + SmallVector ArgLocs; + for (unsigned i = 0; i != NumArgs; ++i) { MVT::ValueType ArgVT = Op.getValue(i).getValueType(); unsigned ArgFlags = cast(Op.getOperand(3+i))->getValue(); - - X86_64_CCC_AssignArgument(Client, CCState, ArgVT, ArgFlags, SDOperand()); + X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCState, ArgLocs); } - + + for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { + CCValAssign &VA = ArgLocs[i]; + + + if (VA.isRegLoc()) { + MVT::ValueType RegVT = VA.getLocVT(); + TargetRegisterClass *RC; + if (RegVT == MVT::i32) + RC = X86::GR32RegisterClass; + else if (RegVT == MVT::i64) + RC = X86::GR64RegisterClass; + else if (RegVT == MVT::f32) + RC = X86::FR32RegisterClass; + else if (RegVT == MVT::f64) + RC = X86::FR64RegisterClass; + else { + assert(MVT::isVector(RegVT)); + RC = X86::VR128RegisterClass; + } + + SDOperand ArgValue = DAG.getCopyFromReg(Root, VA.getLocReg(), RegVT); + AddLiveIn(DAG.getMachineFunction(), VA.getLocReg(), RC); + + // If this is an 8 or 16-bit value, it is really passed promoted to 32 + // bits. Insert an assert[sz]ext to capture this, then truncate to the + // right size. + if (VA.getLocInfo() == CCValAssign::SExt) + ArgValue = DAG.getNode(ISD::AssertSext, RegVT, ArgValue, + DAG.getValueType(VA.getValVT())); + else if (VA.getLocInfo() == CCValAssign::ZExt) + ArgValue = DAG.getNode(ISD::AssertZext, RegVT, ArgValue, + DAG.getValueType(VA.getValVT())); + + if (VA.getLocInfo() != CCValAssign::Full) + ArgValue = DAG.getNode(ISD::TRUNCATE, VA.getValVT(), ArgValue); + + ArgValues.push_back(ArgValue); + } else { + assert(VA.isMemLoc()); + + // Create the nodes corresponding to a load from this parameter slot. + int FI = MFI->CreateFixedObject(MVT::getSizeInBits(VA.getValVT())/8, + VA.getLocMemOffset()); + SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); + ArgValues.push_back(DAG.getLoad(VA.getValVT(), Root, FIN, NULL, 0)); + } + } + unsigned StackSize = CCState.getNextStackOffset(); // If the function takes variable number of arguments, make a frame index for @@ -1412,40 +1403,62 @@ SDOperand Callee = Op.getOperand(4); unsigned NumOps = (Op.getNumOperands() - 5) / 2; - // Count how many bytes are to be pushed on the stack. - unsigned NumBytes = 0; - { - CallingConvState CCState(*getTargetMachine().getRegisterInfo()); - EmptyArgumentsClient Client; - - for (unsigned i = 0; i != NumOps; ++i) { - SDOperand Arg = Op.getOperand(5+2*i); - MVT::ValueType ArgVT = Arg.getValueType(); - unsigned ArgFlags = - cast(Op.getOperand(5+2*i+1))->getValue(); - X86_64_CCC_AssignArgument(Client, CCState, ArgVT, ArgFlags, Arg); - } - - NumBytes = CCState.getNextStackOffset(); + CallingConvState CCState(*getTargetMachine().getRegisterInfo()); + SmallVector ArgLocs; + + for (unsigned i = 0; i != NumOps; ++i) { + MVT::ValueType ArgVT = Op.getOperand(5+2*i).getValueType(); + unsigned ArgFlags =cast(Op.getOperand(5+2*i+1))->getValue(); + X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCState, ArgLocs); } - + // Get a count of how many bytes are to be pushed on the stack. + unsigned NumBytes = CCState.getNextStackOffset(); Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy())); SmallVector, 8> RegsToPass; SmallVector MemOpChains; - CallingConvState CCState(*getTargetMachine().getRegisterInfo()); - LowerCallArgumentsClient Client(DAG, *this, RegsToPass, MemOpChains, Chain); + SDOperand StackPtr; + + // Walk the register/memloc assignments, inserting copies/loads. + unsigned LastVal = ~0U; + for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { + CCValAssign &VA = ArgLocs[i]; - for (unsigned i = 0; i != NumOps; ++i) { - SDOperand Arg = Op.getOperand(5+2*i); - MVT::ValueType ArgVT = Arg.getValueType(); - unsigned ArgFlags = - cast(Op.getOperand(5+2*i+1))->getValue(); - X86_64_CCC_AssignArgument(Client, CCState, ArgVT, ArgFlags, Arg); - } + assert(VA.getValNo() != LastVal && + "Don't support value assigned to multiple locs yet"); + LastVal = VA.getValNo(); + + SDOperand Arg = Op.getOperand(5+2*VA.getValNo()); + + // Promote the value if needed. + switch (VA.getLocInfo()) { + default: assert(0 && "Unknown loc info!"); + case CCValAssign::Full: break; + case CCValAssign::SExt: + Arg = DAG.getNode(ISD::SIGN_EXTEND, VA.getLocVT(), Arg); + break; + case CCValAssign::ZExt: + Arg = DAG.getNode(ISD::ZERO_EXTEND, VA.getLocVT(), Arg); + break; + case CCValAssign::AExt: + Arg = DAG.getNode(ISD::ANY_EXTEND, VA.getLocVT(), Arg); + break; + } + if (VA.isRegLoc()) { + RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); + } else { + assert(VA.isMemLoc()); + if (StackPtr.Val == 0) + StackPtr = DAG.getRegister(getStackPtrReg(), getPointerTy()); + SDOperand PtrOff = DAG.getConstant(VA.getLocMemOffset(), getPointerTy()); + PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff); + MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0)); + } + } + if (!MemOpChains.empty()) Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, &MemOpChains[0], MemOpChains.size()); From sabre at nondot.org Mon Feb 26 22:43:21 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 22:43:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200702270443.l1R4hLnc031602@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.342 -> 1.343 --- Log message: move CC Lowering stuff to its own public interface --- Diffs of the changes: (+17 -146) X86ISelLowering.cpp | 163 +++++----------------------------------------------- 1 files changed, 17 insertions(+), 146 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.342 llvm/lib/Target/X86/X86ISelLowering.cpp:1.343 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.342 Mon Feb 26 22:18:15 2007 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Feb 26 22:43:02 2007 @@ -24,6 +24,7 @@ #include "llvm/Intrinsics.h" #include "llvm/ADT/VectorExtras.h" #include "llvm/Analysis/ScalarEvolutionExpressions.h" +#include "llvm/CodeGen/CallingConvLower.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -1058,140 +1059,11 @@ // X86-64 C Calling Convention implementation //===----------------------------------------------------------------------===// -class CallingConvState { - unsigned StackOffset; - const MRegisterInfo &MRI; - SmallVector UsedRegs; -public: - CallingConvState(const MRegisterInfo &mri) : MRI(mri) { - // No stack is used. - StackOffset = 0; - - UsedRegs.resize(MRI.getNumRegs()); - } - - unsigned getNextStackOffset() const { return StackOffset; } - - /// isAllocated - Return true if the specified register (or an alias) is - /// allocated. - bool isAllocated(unsigned Reg) const { - return UsedRegs[Reg/32] & (1 << (Reg&31)); - } - - /// getFirstUnallocated - Return the first unallocated register in the set, or - /// NumRegs if they are all allocated. - unsigned getFirstUnallocated(const unsigned *Regs, unsigned NumRegs) const { - for (unsigned i = 0; i != NumRegs; ++i) - if (!isAllocated(Regs[i])) - return i; - return NumRegs; - } - - /// AllocateReg - Attempt to allocate one of the specified registers. If none - /// are available, return zero. Otherwise, return the first one available, - /// marking it and any aliases as allocated. - unsigned AllocateReg(const unsigned *Regs, unsigned NumRegs) { - unsigned FirstUnalloc = getFirstUnallocated(Regs, NumRegs); - if (FirstUnalloc == NumRegs) - return 0; // Didn't find the reg. - - // Mark the register and any aliases as allocated. - unsigned Reg = Regs[FirstUnalloc]; - MarkAllocated(Reg); - if (const unsigned *RegAliases = MRI.getAliasSet(Reg)) - for (; *RegAliases; ++RegAliases) - MarkAllocated(*RegAliases); - return Reg; - } - - /// AllocateStack - Allocate a chunk of stack space with the specified size - /// and alignment. - unsigned AllocateStack(unsigned Size, unsigned Align) { - assert(Align && ((Align-1) & Align) == 0); // Align is power of 2. - StackOffset = ((StackOffset + Align-1) & ~(Align-1)); - unsigned Result = StackOffset; - StackOffset += Size; - return Result; - } -private: - void MarkAllocated(unsigned Reg) { - UsedRegs[Reg/32] |= 1 << (Reg&31); - } -}; - -/// CCValAssign - Represent assignment of one arg/retval to a location. -class CCValAssign { -public: - enum LocInfo { - Full, // The value fills the full location. - SExt, // The value is sign extended in the location. - ZExt, // The value is zero extended in the location. - AExt // The value is extended with undefined upper bits. - // TODO: a subset of the value is in the location. - }; -private: - /// ValNo - This is the value number begin assigned (e.g. an argument number). - unsigned ValNo; - - /// Loc is either a stack offset or a register number. - unsigned Loc; - - /// isMem - True if this is a memory loc, false if it is a register loc. - bool isMem : 1; - - /// Information about how the value is assigned. - LocInfo HTP : 7; - - /// ValVT - The type of the value being assigned. - MVT::ValueType ValVT : 8; - - /// LocVT - The type of the location being assigned to. - MVT::ValueType LocVT : 8; -public: - - static CCValAssign getReg(unsigned ValNo, MVT::ValueType ValVT, - unsigned RegNo, MVT::ValueType LocVT, - LocInfo HTP) { - CCValAssign Ret; - Ret.ValNo = ValNo; - Ret.Loc = RegNo; - Ret.isMem = false; - Ret.HTP = HTP; - Ret.ValVT = ValVT; - Ret.LocVT = LocVT; - return Ret; - } - static CCValAssign getMem(unsigned ValNo, MVT::ValueType ValVT, - unsigned Offset, MVT::ValueType LocVT, - LocInfo HTP) { - CCValAssign Ret; - Ret.ValNo = ValNo; - Ret.Loc = Offset; - Ret.isMem = true; - Ret.HTP = HTP; - Ret.ValVT = ValVT; - Ret.LocVT = LocVT; - return Ret; - } - - unsigned getValNo() const { return ValNo; } - MVT::ValueType getValVT() const { return ValVT; } - - bool isRegLoc() const { return !isMem; } - bool isMemLoc() const { return isMem; } - - unsigned getLocReg() const { assert(isRegLoc()); return Loc; } - unsigned getLocMemOffset() const { assert(isMemLoc()); return Loc; } - MVT::ValueType getLocVT() const { return LocVT; } - - LocInfo getLocInfo() const { return HTP; } -}; - /// X86_64_CCC_AssignArgument - Implement the X86-64 C Calling Convention. static void X86_64_CCC_AssignArgument(unsigned ValNo, MVT::ValueType ArgVT, unsigned ArgFlags, - CallingConvState &State, + CCState &State, SmallVector &Locs) { MVT::ValueType LocVT = ArgVT; CCValAssign::LocInfo LocInfo = CCValAssign::Full; @@ -1278,18 +1150,23 @@ SmallVector ArgValues; - CallingConvState CCState(*getTargetMachine().getRegisterInfo()); + CCState CCInfo(*getTargetMachine().getRegisterInfo()); SmallVector ArgLocs; for (unsigned i = 0; i != NumArgs; ++i) { MVT::ValueType ArgVT = Op.getValue(i).getValueType(); unsigned ArgFlags = cast(Op.getOperand(3+i))->getValue(); - X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCState, ArgLocs); + X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCInfo, ArgLocs); } + unsigned LastVal = ~0U; for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { CCValAssign &VA = ArgLocs[i]; - + // TODO: If an arg is passed in two places (e.g. reg and stack), skip later + // places. + assert(VA.getValNo() != LastVal && + "Don't support value assigned to multiple locs yet"); + LastVal = VA.getValNo(); if (VA.isRegLoc()) { MVT::ValueType RegVT = VA.getLocVT(); @@ -1335,13 +1212,13 @@ } } - unsigned StackSize = CCState.getNextStackOffset(); + unsigned StackSize = CCInfo.getNextStackOffset(); // If the function takes variable number of arguments, make a frame index for // the start of the first vararg value... for expansion of llvm.va_start. if (isVarArg) { - unsigned NumIntRegs = CCState.getFirstUnallocated(GPR64ArgRegs, 6); - unsigned NumXMMRegs = CCState.getFirstUnallocated(XMMArgRegs, 8); + unsigned NumIntRegs = CCInfo.getFirstUnallocated(GPR64ArgRegs, 6); + unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs, 8); // For X86-64, if there are vararg parameters that are passed via // registers, then we must store them to their spots on the stack so they @@ -1403,17 +1280,17 @@ SDOperand Callee = Op.getOperand(4); unsigned NumOps = (Op.getNumOperands() - 5) / 2; - CallingConvState CCState(*getTargetMachine().getRegisterInfo()); + CCState CCInfo(*getTargetMachine().getRegisterInfo()); SmallVector ArgLocs; for (unsigned i = 0; i != NumOps; ++i) { MVT::ValueType ArgVT = Op.getOperand(5+2*i).getValueType(); unsigned ArgFlags =cast(Op.getOperand(5+2*i+1))->getValue(); - X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCState, ArgLocs); + X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCInfo, ArgLocs); } // Get a count of how many bytes are to be pushed on the stack. - unsigned NumBytes = CCState.getNextStackOffset(); + unsigned NumBytes = CCInfo.getNextStackOffset(); Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy())); SmallVector, 8> RegsToPass; @@ -1422,14 +1299,8 @@ SDOperand StackPtr; // Walk the register/memloc assignments, inserting copies/loads. - unsigned LastVal = ~0U; for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { CCValAssign &VA = ArgLocs[i]; - - assert(VA.getValNo() != LastVal && - "Don't support value assigned to multiple locs yet"); - LastVal = VA.getValNo(); - SDOperand Arg = Op.getOperand(5+2*VA.getValNo()); // Promote the value if needed. @@ -1486,7 +1357,7 @@ X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3, X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 }; - unsigned NumXMMRegs = CCState.getFirstUnallocated(XMMArgRegs, 8); + unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs, 8); Chain = DAG.getCopyToReg(Chain, X86::AL, DAG.getConstant(NumXMMRegs, MVT::i8), InFlag); From sabre at nondot.org Mon Feb 26 22:43:23 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 22:43:23 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/CallingConvLower.h Message-ID: <200702270443.l1R4hNHE031607@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: CallingConvLower.h added (r1.1) --- Log message: move CC Lowering stuff to its own public interface --- Diffs of the changes: (+149 -0) CallingConvLower.h | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 149 insertions(+) Index: llvm/include/llvm/CodeGen/CallingConvLower.h diff -c /dev/null llvm/include/llvm/CodeGen/CallingConvLower.h:1.1 *** /dev/null Mon Feb 26 22:43:12 2007 --- llvm/include/llvm/CodeGen/CallingConvLower.h Mon Feb 26 22:43:02 2007 *************** *** 0 **** --- 1,149 ---- + //===-- llvm/CallingConvLower.h - Calling Conventions -----------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Chris Lattner and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file declares the CCState and CCValAssign classes, used for lowering + // and implementing calling conventions. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_CODEGEN_CALLINGCONVLOWER_H + #define LLVM_CODEGEN_CALLINGCONVLOWER_H + + #include "llvm/ADT/SmallVector.h" + #include "llvm/CodeGen/ValueTypes.h" + + namespace llvm { + class MRegisterInfo; + + /// CCState - This class holds information needed while lowering arguments and + /// return values. It captures which registers are already assigned and which + /// stack slots are used. It provides accessors to allocate these values. + class CCState { + unsigned StackOffset; + const MRegisterInfo &MRI; + SmallVector UsedRegs; + public: + CCState(const MRegisterInfo &mri); + + unsigned getNextStackOffset() const { return StackOffset; } + + /// isAllocated - Return true if the specified register (or an alias) is + /// allocated. + bool isAllocated(unsigned Reg) const { + return UsedRegs[Reg/32] & (1 << (Reg&31)); + } + + /// getFirstUnallocated - Return the first unallocated register in the set, or + /// NumRegs if they are all allocated. + unsigned getFirstUnallocated(const unsigned *Regs, unsigned NumRegs) const { + for (unsigned i = 0; i != NumRegs; ++i) + if (!isAllocated(Regs[i])) + return i; + return NumRegs; + } + + /// AllocateReg - Attempt to allocate one of the specified registers. If none + /// are available, return zero. Otherwise, return the first one available, + /// marking it and any aliases as allocated. + unsigned AllocateReg(const unsigned *Regs, unsigned NumRegs) { + unsigned FirstUnalloc = getFirstUnallocated(Regs, NumRegs); + if (FirstUnalloc == NumRegs) + return 0; // Didn't find the reg. + + // Mark the register and any aliases as allocated. + unsigned Reg = Regs[FirstUnalloc]; + MarkAllocated(Reg); + return Reg; + } + + /// AllocateStack - Allocate a chunk of stack space with the specified size + /// and alignment. + unsigned AllocateStack(unsigned Size, unsigned Align) { + assert(Align && ((Align-1) & Align) == 0); // Align is power of 2. + StackOffset = ((StackOffset + Align-1) & ~(Align-1)); + unsigned Result = StackOffset; + StackOffset += Size; + return Result; + } + private: + /// MarkAllocated - Mark a register and all of its aliases as allocated. + void MarkAllocated(unsigned Reg); + }; + + /// CCValAssign - Represent assignment of one arg/retval to a location. + class CCValAssign { + public: + enum LocInfo { + Full, // The value fills the full location. + SExt, // The value is sign extended in the location. + ZExt, // The value is zero extended in the location. + AExt // The value is extended with undefined upper bits. + // TODO: a subset of the value is in the location. + }; + private: + /// ValNo - This is the value number begin assigned (e.g. an argument number). + unsigned ValNo; + + /// Loc is either a stack offset or a register number. + unsigned Loc; + + /// isMem - True if this is a memory loc, false if it is a register loc. + bool isMem : 1; + + /// Information about how the value is assigned. + LocInfo HTP : 7; + + /// ValVT - The type of the value being assigned. + MVT::ValueType ValVT : 8; + + /// LocVT - The type of the location being assigned to. + MVT::ValueType LocVT : 8; + public: + + static CCValAssign getReg(unsigned ValNo, MVT::ValueType ValVT, + unsigned RegNo, MVT::ValueType LocVT, + LocInfo HTP) { + CCValAssign Ret; + Ret.ValNo = ValNo; + Ret.Loc = RegNo; + Ret.isMem = false; + Ret.HTP = HTP; + Ret.ValVT = ValVT; + Ret.LocVT = LocVT; + return Ret; + } + static CCValAssign getMem(unsigned ValNo, MVT::ValueType ValVT, + unsigned Offset, MVT::ValueType LocVT, + LocInfo HTP) { + CCValAssign Ret; + Ret.ValNo = ValNo; + Ret.Loc = Offset; + Ret.isMem = true; + Ret.HTP = HTP; + Ret.ValVT = ValVT; + Ret.LocVT = LocVT; + return Ret; + } + + unsigned getValNo() const { return ValNo; } + MVT::ValueType getValVT() const { return ValVT; } + + bool isRegLoc() const { return !isMem; } + bool isMemLoc() const { return isMem; } + + unsigned getLocReg() const { assert(isRegLoc()); return Loc; } + unsigned getLocMemOffset() const { assert(isMemLoc()); return Loc; } + MVT::ValueType getLocVT() const { return LocVT; } + + LocInfo getLocInfo() const { return HTP; } + }; + + } // end namespace llvm + + #endif From sabre at nondot.org Mon Feb 26 22:43:23 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 22:43:23 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/CallingConvLower.cpp Message-ID: <200702270443.l1R4hNSX031612@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: CallingConvLower.cpp added (r1.1) --- Log message: move CC Lowering stuff to its own public interface --- Diffs of the changes: (+34 -0) CallingConvLower.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 files changed, 34 insertions(+) Index: llvm/lib/CodeGen/CallingConvLower.cpp diff -c /dev/null llvm/lib/CodeGen/CallingConvLower.cpp:1.1 *** /dev/null Mon Feb 26 22:43:12 2007 --- llvm/lib/CodeGen/CallingConvLower.cpp Mon Feb 26 22:43:02 2007 *************** *** 0 **** --- 1,34 ---- + //===-- llvm/CallingConvLower.cpp - Calling Conventions -------------------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Chris Lattner and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the CCState class, used for lowering and implementing + // calling conventions. + // + //===----------------------------------------------------------------------===// + + #include "llvm/CodeGen/CallingConvLower.h" + #include "llvm/Target/MRegisterInfo.h" + using namespace llvm; + + CCState::CCState(const MRegisterInfo &mri) : MRI(mri) { + // No stack is used. + StackOffset = 0; + + UsedRegs.resize(MRI.getNumRegs()); + } + + + /// MarkAllocated - Mark a register and all of its aliases as allocated. + void CCState::MarkAllocated(unsigned Reg) { + UsedRegs[Reg/32] |= 1 << (Reg&31); + + if (const unsigned *RegAliases = MRI.getAliasSet(Reg)) + for (; (Reg = *RegAliases); ++RegAliases) + UsedRegs[Reg/32] |= 1 << (Reg&31); + } From sabre at nondot.org Mon Feb 26 23:14:14 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 23:14:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200702270514.l1R5EE5u032154@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.343 -> 1.344 --- Log message: Minor refactoring of CC Lowering interfaces --- Diffs of the changes: (+24 -22) X86ISelLowering.cpp | 46 ++++++++++++++++++++++++---------------------- 1 files changed, 24 insertions(+), 22 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.343 llvm/lib/Target/X86/X86ISelLowering.cpp:1.344 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.343 Mon Feb 26 22:43:02 2007 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Feb 26 23:13:54 2007 @@ -429,6 +429,7 @@ // Return Value Calling Convention Implementation //===----------------------------------------------------------------------===// + /// GetRetValueLocs - If we are returning a set of values with the specified /// value types, determine the set of registers each one will land in. This /// sets one element of the ResultRegs array for each element in the VTs array. @@ -1060,11 +1061,11 @@ //===----------------------------------------------------------------------===// -/// X86_64_CCC_AssignArgument - Implement the X86-64 C Calling Convention. -static void X86_64_CCC_AssignArgument(unsigned ValNo, +/// X86_64_CCC_AssignArgument - Implement the X86-64 C Calling Convention. This +/// returns true if the value was not handled by this calling convention. +static bool X86_64_CCC_AssignArgument(unsigned ValNo, MVT::ValueType ArgVT, unsigned ArgFlags, - CCState &State, - SmallVector &Locs) { + CCState &State) { MVT::ValueType LocVT = ArgVT; CCValAssign::LocInfo LocInfo = CCValAssign::Full; @@ -1082,8 +1083,8 @@ X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D }; if (unsigned Reg = State.AllocateReg(GPR32ArgRegs, 6)) { - Locs.push_back(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); - return; + State.addLoc(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); + return false; } } @@ -1094,8 +1095,8 @@ X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9 }; if (unsigned Reg = State.AllocateReg(GPR64ArgRegs, 6)) { - Locs.push_back(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); - return; + State.addLoc(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); + return false; } } @@ -1107,8 +1108,8 @@ X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 }; if (unsigned Reg = State.AllocateReg(XMMArgRegs, 8)) { - Locs.push_back(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); - return; + State.addLoc(CCValAssign::getReg(ValNo, ArgVT, Reg, LocVT, LocInfo)); + return false; } } @@ -1117,17 +1118,17 @@ if (LocVT == MVT::i32 || LocVT == MVT::i64 || LocVT == MVT::f32 || LocVT == MVT::f64) { unsigned Offset = State.AllocateStack(8, 8); - Locs.push_back(CCValAssign::getMem(ValNo, ArgVT, Offset, LocVT, LocInfo)); - return; + State.addLoc(CCValAssign::getMem(ValNo, ArgVT, Offset, LocVT, LocInfo)); + return false; } // Vectors get 16-byte stack slots that are 16-byte aligned. if (MVT::isVector(LocVT)) { unsigned Offset = State.AllocateStack(16, 16); - Locs.push_back(CCValAssign::getMem(ValNo, ArgVT, Offset, LocVT, LocInfo)); - return; + State.addLoc(CCValAssign::getMem(ValNo, ArgVT, Offset, LocVT, LocInfo)); + return false; } - assert(0 && "Unknown argument type!"); + return true; } @@ -1147,18 +1148,18 @@ X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 }; - SmallVector ArgValues; - - - CCState CCInfo(*getTargetMachine().getRegisterInfo()); SmallVector ArgLocs; + CCState CCInfo(MF.getFunction()->getCallingConv(), getTargetMachine(), + ArgLocs); for (unsigned i = 0; i != NumArgs; ++i) { MVT::ValueType ArgVT = Op.getValue(i).getValueType(); unsigned ArgFlags = cast(Op.getOperand(3+i))->getValue(); - X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCInfo, ArgLocs); + if (X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCInfo)) + assert(0 && "Unhandled argument type!"); } + SmallVector ArgValues; unsigned LastVal = ~0U; for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { CCValAssign &VA = ArgLocs[i]; @@ -1280,13 +1281,14 @@ SDOperand Callee = Op.getOperand(4); unsigned NumOps = (Op.getNumOperands() - 5) / 2; - CCState CCInfo(*getTargetMachine().getRegisterInfo()); SmallVector ArgLocs; + CCState CCInfo(CC, getTargetMachine(), ArgLocs); for (unsigned i = 0; i != NumOps; ++i) { MVT::ValueType ArgVT = Op.getOperand(5+2*i).getValueType(); unsigned ArgFlags =cast(Op.getOperand(5+2*i+1))->getValue(); - X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCInfo, ArgLocs); + if (X86_64_CCC_AssignArgument(i, ArgVT, ArgFlags, CCInfo)) + assert(0 && "Unhandled argument type!"); } // Get a count of how many bytes are to be pushed on the stack. From sabre at nondot.org Mon Feb 26 23:14:16 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 23:14:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/CallingConvLower.cpp Message-ID: <200702270514.l1R5EGje032159@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: CallingConvLower.cpp updated: 1.1 -> 1.2 --- Log message: Minor refactoring of CC Lowering interfaces --- Diffs of the changes: (+4 -1) CallingConvLower.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/CallingConvLower.cpp diff -u llvm/lib/CodeGen/CallingConvLower.cpp:1.1 llvm/lib/CodeGen/CallingConvLower.cpp:1.2 --- llvm/lib/CodeGen/CallingConvLower.cpp:1.1 Mon Feb 26 22:43:02 2007 +++ llvm/lib/CodeGen/CallingConvLower.cpp Mon Feb 26 23:13:54 2007 @@ -14,9 +14,12 @@ #include "llvm/CodeGen/CallingConvLower.h" #include "llvm/Target/MRegisterInfo.h" +#include "llvm/Target/TargetMachine.h" using namespace llvm; -CCState::CCState(const MRegisterInfo &mri) : MRI(mri) { +CCState::CCState(unsigned CC, const TargetMachine &tm, + SmallVector &locs) + : CallingConv(CC), TM(tm), MRI(*TM.getRegisterInfo()), Locs(locs) { // No stack is used. StackOffset = 0; From sabre at nondot.org Mon Feb 26 23:14:16 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 23:14:16 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/CallingConvLower.h Message-ID: <200702270514.l1R5EGr2032164@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: CallingConvLower.h updated: 1.1 -> 1.2 --- Log message: Minor refactoring of CC Lowering interfaces --- Diffs of the changes: (+79 -55) CallingConvLower.h | 134 +++++++++++++++++++++++++++++++---------------------- 1 files changed, 79 insertions(+), 55 deletions(-) Index: llvm/include/llvm/CodeGen/CallingConvLower.h diff -u llvm/include/llvm/CodeGen/CallingConvLower.h:1.1 llvm/include/llvm/CodeGen/CallingConvLower.h:1.2 --- llvm/include/llvm/CodeGen/CallingConvLower.h:1.1 Mon Feb 26 22:43:02 2007 +++ llvm/include/llvm/CodeGen/CallingConvLower.h Mon Feb 26 23:13:54 2007 @@ -20,62 +20,8 @@ namespace llvm { class MRegisterInfo; + class TargetMachine; -/// CCState - This class holds information needed while lowering arguments and -/// return values. It captures which registers are already assigned and which -/// stack slots are used. It provides accessors to allocate these values. -class CCState { - unsigned StackOffset; - const MRegisterInfo &MRI; - SmallVector UsedRegs; -public: - CCState(const MRegisterInfo &mri); - - unsigned getNextStackOffset() const { return StackOffset; } - - /// isAllocated - Return true if the specified register (or an alias) is - /// allocated. - bool isAllocated(unsigned Reg) const { - return UsedRegs[Reg/32] & (1 << (Reg&31)); - } - - /// getFirstUnallocated - Return the first unallocated register in the set, or - /// NumRegs if they are all allocated. - unsigned getFirstUnallocated(const unsigned *Regs, unsigned NumRegs) const { - for (unsigned i = 0; i != NumRegs; ++i) - if (!isAllocated(Regs[i])) - return i; - return NumRegs; - } - - /// AllocateReg - Attempt to allocate one of the specified registers. If none - /// are available, return zero. Otherwise, return the first one available, - /// marking it and any aliases as allocated. - unsigned AllocateReg(const unsigned *Regs, unsigned NumRegs) { - unsigned FirstUnalloc = getFirstUnallocated(Regs, NumRegs); - if (FirstUnalloc == NumRegs) - return 0; // Didn't find the reg. - - // Mark the register and any aliases as allocated. - unsigned Reg = Regs[FirstUnalloc]; - MarkAllocated(Reg); - return Reg; - } - - /// AllocateStack - Allocate a chunk of stack space with the specified size - /// and alignment. - unsigned AllocateStack(unsigned Size, unsigned Align) { - assert(Align && ((Align-1) & Align) == 0); // Align is power of 2. - StackOffset = ((StackOffset + Align-1) & ~(Align-1)); - unsigned Result = StackOffset; - StackOffset += Size; - return Result; - } -private: - /// MarkAllocated - Mark a register and all of its aliases as allocated. - void MarkAllocated(unsigned Reg); -}; - /// CCValAssign - Represent assignment of one arg/retval to a location. class CCValAssign { public: @@ -144,6 +90,84 @@ LocInfo getLocInfo() const { return HTP; } }; + + +/// CCState - This class holds information needed while lowering arguments and +/// return values. It captures which registers are already assigned and which +/// stack slots are used. It provides accessors to allocate these values. +class CCState { + unsigned CallingConv; + const TargetMachine &TM; + const MRegisterInfo &MRI; + SmallVector &Locs; + + unsigned StackOffset; + SmallVector UsedRegs; +public: + CCState(unsigned CC, const TargetMachine &TM, + SmallVector &locs); + + void addLoc(const CCValAssign &V) { + Locs.push_back(V); + } + + const TargetMachine &getTarget() const { return TM; } + unsigned getCallingConv() const { return CallingConv; } + + unsigned getNextStackOffset() const { return StackOffset; } + + /// isAllocated - Return true if the specified register (or an alias) is + /// allocated. + bool isAllocated(unsigned Reg) const { + return UsedRegs[Reg/32] & (1 << (Reg&31)); + } + + /// getFirstUnallocated - Return the first unallocated register in the set, or + /// NumRegs if they are all allocated. + unsigned getFirstUnallocated(const unsigned *Regs, unsigned NumRegs) const { + for (unsigned i = 0; i != NumRegs; ++i) + if (!isAllocated(Regs[i])) + return i; + return NumRegs; + } + + /// AllocateReg - Attempt to allocate one register. If it is not available, + /// return zero. Otherwise, return the register, marking it and any aliases + /// as allocated. + unsigned AllocateReg(unsigned Reg) { + if (isAllocated(Reg)) return 0; + MarkAllocated(Reg); + return Reg; + } + + /// AllocateReg - Attempt to allocate one of the specified registers. If none + /// are available, return zero. Otherwise, return the first one available, + /// marking it and any aliases as allocated. + unsigned AllocateReg(const unsigned *Regs, unsigned NumRegs) { + unsigned FirstUnalloc = getFirstUnallocated(Regs, NumRegs); + if (FirstUnalloc == NumRegs) + return 0; // Didn't find the reg. + + // Mark the register and any aliases as allocated. + unsigned Reg = Regs[FirstUnalloc]; + MarkAllocated(Reg); + return Reg; + } + + /// AllocateStack - Allocate a chunk of stack space with the specified size + /// and alignment. + unsigned AllocateStack(unsigned Size, unsigned Align) { + assert(Align && ((Align-1) & Align) == 0); // Align is power of 2. + StackOffset = ((StackOffset + Align-1) & ~(Align-1)); + unsigned Result = StackOffset; + StackOffset += Size; + return Result; + } +private: + /// MarkAllocated - Mark a register and all of its aliases as allocated. + void MarkAllocated(unsigned Reg); +}; + } // end namespace llvm #endif From sabre at nondot.org Mon Feb 26 23:29:16 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 23:29:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200702270529.l1R5TGK7032434@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.344 -> 1.345 --- Log message: switch x86-64 return value lowering over to using same mechanism as argument lowering uses. --- Diffs of the changes: (+88 -68) X86ISelLowering.cpp | 156 +++++++++++++++++++++++++++++----------------------- 1 files changed, 88 insertions(+), 68 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.344 llvm/lib/Target/X86/X86ISelLowering.cpp:1.345 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.344 Mon Feb 26 23:13:54 2007 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Feb 26 23:28:59 2007 @@ -429,79 +429,103 @@ // Return Value Calling Convention Implementation //===----------------------------------------------------------------------===// - -/// GetRetValueLocs - If we are returning a set of values with the specified -/// value types, determine the set of registers each one will land in. This -/// sets one element of the ResultRegs array for each element in the VTs array. -static void GetRetValueLocs(const MVT::ValueType *VTs, unsigned NumVTs, - unsigned *ResultRegs, - const X86Subtarget *Subtarget, - unsigned CC) { - if (NumVTs == 0) return; +/// X86_RetCC_Assign - Implement the X86 return value conventions. This returns +/// true if the value wasn't handled by this CC. +static bool X86_RetCC_Assign(unsigned ValNo, MVT::ValueType ValVT, + unsigned ArgFlags, CCState &State) { + MVT::ValueType LocVT = ValVT; + CCValAssign::LocInfo LocInfo = CCValAssign::Full; - if (NumVTs == 2) { - ResultRegs[0] = VTs[0] == MVT::i64 ? X86::RAX : X86::EAX; - ResultRegs[1] = VTs[1] == MVT::i64 ? X86::RDX : X86::EDX; - return; + // If this is a 32-bit value, assign to a 32-bit register if any are + // available. + if (LocVT == MVT::i8) { + static const unsigned GPR8ArgRegs[] = { X86::AL, X86::DL }; + if (unsigned Reg = State.AllocateReg(GPR8ArgRegs, 2)) { + State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); + return false; + } } - - // Otherwise, NumVTs is 1. - MVT::ValueType ArgVT = VTs[0]; - - unsigned Reg; - switch (ArgVT) { - case MVT::i8: Reg = X86::AL; break; - case MVT::i16: Reg = X86::AX; break; - case MVT::i32: Reg = X86::EAX; break; - case MVT::i64: Reg = X86::RAX; break; - case MVT::f32: - case MVT::f64: - if (Subtarget->is64Bit()) + if (LocVT == MVT::i16) { + static const unsigned GPR16ArgRegs[] = { X86::AX, X86::DX }; + if (unsigned Reg = State.AllocateReg(GPR16ArgRegs, 2)) { + State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); + return false; + } + } + if (LocVT == MVT::i32) { + static const unsigned GPR32ArgRegs[] = { X86::EAX, X86::EDX }; + if (unsigned Reg = State.AllocateReg(GPR32ArgRegs, 2)) { + State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); + return false; + } + } + if (LocVT == MVT::i64) { + static const unsigned GPR64ArgRegs[] = { X86::RAX, X86::RDX }; + if (unsigned Reg = State.AllocateReg(GPR64ArgRegs, 2)) { + State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); + return false; + } + } + if (MVT::isVector(LocVT)) { + if (unsigned Reg = State.AllocateReg(X86::XMM0)) { + State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); + return false; + } + } + if (LocVT == MVT::f32 || LocVT == MVT::f64) { + unsigned Reg; + if (State.getTarget().getSubtarget().is64Bit()) Reg = X86::XMM0; // FP values in X86-64 go in XMM0. - else if (CC == CallingConv::Fast && Subtarget->hasSSE2()) + else if (State.getCallingConv() == CallingConv::Fast && + State.getTarget().getSubtarget().hasSSE2()) Reg = X86::XMM0; // FP values in X86-32 with fastcc go in XMM0. else Reg = X86::ST0; // FP values in X86-32 go in ST0. - break; - default: - assert(MVT::isVector(ArgVT) && "Unknown return value type!"); - Reg = X86::XMM0; // Int/FP vector result -> XMM0. - break; + + if ((Reg = State.AllocateReg(Reg))) { + State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); + return false; + } } - ResultRegs[0] = Reg; + + return true; } - + /// LowerRET - Lower an ISD::RET node. SDOperand X86TargetLowering::LowerRET(SDOperand Op, SelectionDAG &DAG) { assert((Op.getNumOperands() & 1) == 1 && "ISD::RET should have odd # args"); - // Support up returning up to two registers. - MVT::ValueType VTs[2]; - unsigned DestRegs[2]; - unsigned NumRegs = Op.getNumOperands() / 2; - assert(NumRegs <= 2 && "Can only return up to two regs!"); - - for (unsigned i = 0; i != NumRegs; ++i) - VTs[i] = Op.getOperand(i*2+1).getValueType(); + SmallVector RVLocs; + unsigned CC = DAG.getMachineFunction().getFunction()->getCallingConv(); + CCState CCInfo(CC, getTargetMachine(), RVLocs); // Determine which register each value should be copied into. - GetRetValueLocs(VTs, NumRegs, DestRegs, Subtarget, - DAG.getMachineFunction().getFunction()->getCallingConv()); + for (unsigned i = 0; i != Op.getNumOperands() / 2; ++i) { + if (X86_RetCC_Assign(i, Op.getOperand(i*2+1).getValueType(), + cast(Op.getOperand(i*2+2))->getValue(), + CCInfo)) + assert(0 && "Unhandled result type!"); + } // If this is the first return lowered for this function, add the regs to the // liveout set for the function. if (DAG.getMachineFunction().liveout_empty()) { - for (unsigned i = 0; i != NumRegs; ++i) - DAG.getMachineFunction().addLiveOut(DestRegs[i]); + for (unsigned i = 0; i != RVLocs.size(); ++i) + if (RVLocs[i].isRegLoc()) + DAG.getMachineFunction().addLiveOut(RVLocs[i].getLocReg()); } SDOperand Chain = Op.getOperand(0); SDOperand Flag; // Copy the result values into the output registers. - if (NumRegs != 1 || DestRegs[0] != X86::ST0) { - for (unsigned i = 0; i != NumRegs; ++i) { - Chain = DAG.getCopyToReg(Chain, DestRegs[i], Op.getOperand(i*2+1), Flag); + if (RVLocs.size() != 1 || !RVLocs[0].isRegLoc() || + RVLocs[0].getLocReg() != X86::ST0) { + for (unsigned i = 0; i != RVLocs.size(); ++i) { + CCValAssign &VA = RVLocs[i]; + assert(VA.isRegLoc() && "Can only return in registers!"); + Chain = DAG.getCopyToReg(Chain, VA.getLocReg(), Op.getOperand(i*2+1), + Flag); Flag = Chain.getValue(1); } } else { @@ -522,14 +546,14 @@ MemLoc = Value.getOperand(1); } else { // Spill the value to memory and reload it into top of stack. - unsigned Size = MVT::getSizeInBits(VTs[0])/8; + unsigned Size = MVT::getSizeInBits(RVLocs[0].getValVT())/8; MachineFunction &MF = DAG.getMachineFunction(); int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size); MemLoc = DAG.getFrameIndex(SSFI, getPointerTy()); Chain = DAG.getStore(Op.getOperand(0), Value, MemLoc, NULL, 0); } SDVTList Tys = DAG.getVTList(MVT::f64, MVT::Other); - SDOperand Ops[] = { Chain, MemLoc, DAG.getValueType(VTs[0]) }; + SDOperand Ops[] = {Chain, MemLoc, DAG.getValueType(RVLocs[0].getValVT())}; Value = DAG.getNode(X86ISD::FLD, Tys, Ops, 3); Chain = Value.getValue(1); } @@ -558,23 +582,19 @@ unsigned CallingConv, SelectionDAG &DAG) { SmallVector ResultVals; - // We support returning up to two registers. - MVT::ValueType VTs[2]; - unsigned DestRegs[2]; - unsigned NumRegs = TheCall->getNumValues() - 1; - assert(NumRegs <= 2 && "Can only return up to two regs!"); - - for (unsigned i = 0; i != NumRegs; ++i) - VTs[i] = TheCall->getValueType(i); + SmallVector RVLocs; + CCState CCInfo(CallingConv, getTargetMachine(), RVLocs); - // Determine which register each value should be copied into. - GetRetValueLocs(VTs, NumRegs, DestRegs, Subtarget, CallingConv); + for (unsigned i = 0, e = TheCall->getNumValues() - 1; i != e; ++i) { + if (X86_RetCC_Assign(i, TheCall->getValueType(i), 0, CCInfo)) + assert(0 && "Unhandled result type!"); + } // Copy all of the result registers out of their specified physreg. - if (NumRegs != 1 || DestRegs[0] != X86::ST0) { - for (unsigned i = 0; i != NumRegs; ++i) { - Chain = DAG.getCopyFromReg(Chain, DestRegs[i], VTs[i], - InFlag).getValue(1); + if (RVLocs.size() != 1 || RVLocs[0].getLocReg() != X86::ST0) { + for (unsigned i = 0; i != RVLocs.size(); ++i) { + Chain = DAG.getCopyFromReg(Chain, RVLocs[i].getLocReg(), + RVLocs[i].getValVT(), InFlag).getValue(1); InFlag = Chain.getValue(2); ResultVals.push_back(Chain.getValue(0)); } @@ -599,14 +619,14 @@ int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8); SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy()); SDOperand Ops[] = { - Chain, RetVal, StackSlot, DAG.getValueType(VTs[0]), InFlag + Chain, RetVal, StackSlot, DAG.getValueType(RVLocs[0].getValVT()), InFlag }; Chain = DAG.getNode(X86ISD::FST, MVT::Other, Ops, 5); - RetVal = DAG.getLoad(VTs[0], Chain, StackSlot, NULL, 0); + RetVal = DAG.getLoad(RVLocs[0].getValVT(), Chain, StackSlot, NULL, 0); Chain = RetVal.getValue(1); } - if (VTs[0] == MVT::f32 && !X86ScalarSSE) + if (RVLocs[0].getValVT() == MVT::f32 && !X86ScalarSSE) // FIXME: we would really like to remember that this FP_ROUND // operation is okay to eliminate if we allow excess FP precision. RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal); From sabre at nondot.org Mon Feb 26 23:51:21 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 23:51:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86CallingConv.td Message-ID: <200702270551.l1R5pLug000383@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86CallingConv.td updated: 1.2 -> 1.3 --- Log message: fill in some holes --- Diffs of the changes: (+33 -7) X86CallingConv.td | 40 +++++++++++++++++++++++++++++++++------- 1 files changed, 33 insertions(+), 7 deletions(-) Index: llvm/lib/Target/X86/X86CallingConv.td diff -u llvm/lib/Target/X86/X86CallingConv.td:1.2 llvm/lib/Target/X86/X86CallingConv.td:1.3 --- llvm/lib/Target/X86/X86CallingConv.td:1.2 Mon Feb 26 12:56:07 2007 +++ llvm/lib/Target/X86/X86CallingConv.td Mon Feb 26 23:51:05 2007 @@ -12,21 +12,30 @@ // //===----------------------------------------------------------------------===// - class CCAction; class CallingConv; +/// CCPredicateAction - Instances of this class check some predicate, then +/// delegate to another action if the predicate is true. +class CCPredicateAction : CCAction { + CCAction SubAction = A; +} /// CCMatchType - If the current argument is one of the specified types, apply /// Action A. -class CCMatchType VTs, CCAction A> : CCAction { +class CCMatchType VTs, CCAction A> : CCPredicateAction { } /// CCMatchIf - If the predicate matches, apply A. -class CCMatchIf : CCAction { +class CCMatchIf : CCPredicateAction { string Predicate = predicate; } +/// CCMatchIfCC - Match of the current calling convention is 'CC'. +class CCMatchIfCC : CCPredicateAction { + string CallingConv = CC; +} + /// CCAssignToReg - This action matches if there is a register in the specified /// list that is still available. If so, it assigns the value to the first /// available register and succeeds. @@ -42,7 +51,6 @@ } - /// CCPromoteToType - If applied, this promotes the specified current value to /// the specified type. class CCPromoteToType : CCAction { @@ -64,6 +72,7 @@ // Return Value Calling Conventions //===----------------------------------------------------------------------===// +// Return-value conventions common to all X86 CC's. def RetCC_X86Common : CallingConv<[ // Scalar values are returned in AX first, then DX. CCMatchType<[i8] , CCAssignToReg<[AL]>>, @@ -76,7 +85,7 @@ CCMatchType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToReg<[XMM0]>> ]>; -// Return conventions for the X86-32 C calling convention. +// X86-32 C return-value convention. def RetCC_X86_32_C : CallingConv<[ // The X86-32 calling convention returns FP values in ST0, otherwise it is the // same as the common X86 calling conv. @@ -85,7 +94,7 @@ CCDelegateTo ]>; -// Return conventions for the X86-32 Fast calling convention. +// X86-32 FastCC return-value convention. def RetCC_X86_32_Fast : CallingConv<[ // The X86-32 fastcc returns FP values in XMM0 if the target has SSE2, // otherwise it is the the C calling conventions. @@ -94,7 +103,7 @@ CCDelegateTo ]>; -// Return conventions for the X86-64 C calling convention. +// X86-64 C return-value convention. def RetCC_X86_64_C : CallingConv<[ // The X86-64 calling convention always returns FP values in XMM0. CCMatchType<[f32], CCAssignToReg<[XMM0]>>, @@ -103,6 +112,23 @@ ]>; + +// This is the root return-value convention for the X86-32 backend. +def RetCC_X86_32 : CallingConv<[ + // If FastCC, use RetCC_X86_32_Fast. + CCMatchIfCC<"CallingConv::Fast", CCDelegateTo>, + // Otherwise, use RetCC_X86_32_C. + CCDelegateTo +]>; + +// This is the root return-value convention for the X86-64 backend. +def RetCC_X86_64 : CallingConv<[ + // Always just the same as C calling conv for X86-64. + CCDelegateTo +]>; + + + //===----------------------------------------------------------------------===// // Argument Calling Conventions //===----------------------------------------------------------------------===// From sabre at nondot.org Mon Feb 26 23:57:49 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 23:57:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetCallingConv.td Message-ID: <200702270557.l1R5vnY0000533@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetCallingConv.td added (r1.1) --- Log message: move target independent calling convention stuff to TargetCallingConv.td --- Diffs of the changes: (+71 -0) TargetCallingConv.td | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 71 insertions(+) Index: llvm/lib/Target/TargetCallingConv.td diff -c /dev/null llvm/lib/Target/TargetCallingConv.td:1.1 *** /dev/null Mon Feb 26 23:57:42 2007 --- llvm/lib/Target/TargetCallingConv.td Mon Feb 26 23:57:32 2007 *************** *** 0 **** --- 1,71 ---- + //===- TargetCallingConv.td - Target Calling Conventions ---*- tablegen -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Chris Lattner and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file defines the target-independent interfaces with which targets + // describe their calling conventions. + // + //===----------------------------------------------------------------------===// + + class CCAction; + class CallingConv; + + /// CCPredicateAction - Instances of this class check some predicate, then + /// delegate to another action if the predicate is true. + class CCPredicateAction : CCAction { + CCAction SubAction = A; + } + + /// CCMatchType - If the current argument is one of the specified types, apply + /// Action A. + class CCMatchType VTs, CCAction A> : CCPredicateAction { + } + + /// CCMatchIf - If the predicate matches, apply A. + class CCMatchIf : CCPredicateAction { + string Predicate = predicate; + } + + /// CCMatchIfCC - Match of the current calling convention is 'CC'. + class CCMatchIfCC : CCPredicateAction { + string CallingConv = CC; + } + + /// CCAssignToReg - This action matches if there is a register in the specified + /// list that is still available. If so, it assigns the value to the first + /// available register and succeeds. + class CCAssignToReg regList> : CCAction { + list RegList = regList; + } + + /// CCAssignToStack - This action always matches: it assigns the value to a + /// stack slot of the specified size and alignment on the stack. + class CCAssignToStack : CCAction { + int Size = size; + int Align = align; + } + + + /// CCPromoteToType - If applied, this promotes the specified current value to + /// the specified type. + class CCPromoteToType : CCAction { + ValueType DestTy = destTy; + } + + /// CCDelegateTo - This action invokes the specified sub-calling-convention. It + /// is successful if the specified CC matches. + class CCDelegateTo : CCAction { + CallingConv CC = cc; + } + + /// CallingConv - An instance of this is used to define each calling convention + /// that the target supports. + class CallingConv actions> { + list Actions = actions; + } + From sabre at nondot.org Mon Feb 26 23:57:51 2007 From: sabre at nondot.org (Chris Lattner) Date: Mon, 26 Feb 2007 23:57:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86CallingConv.td Message-ID: <200702270557.l1R5vpKj000538@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86CallingConv.td updated: 1.3 -> 1.4 --- Log message: move target independent calling convention stuff to TargetCallingConv.td --- Diffs of the changes: (+0 -56) X86CallingConv.td | 56 ------------------------------------------------------ 1 files changed, 56 deletions(-) Index: llvm/lib/Target/X86/X86CallingConv.td diff -u llvm/lib/Target/X86/X86CallingConv.td:1.3 llvm/lib/Target/X86/X86CallingConv.td:1.4 --- llvm/lib/Target/X86/X86CallingConv.td:1.3 Mon Feb 26 23:51:05 2007 +++ llvm/lib/Target/X86/X86CallingConv.td Mon Feb 26 23:57:32 2007 @@ -12,62 +12,6 @@ // //===----------------------------------------------------------------------===// -class CCAction; -class CallingConv; - -/// CCPredicateAction - Instances of this class check some predicate, then -/// delegate to another action if the predicate is true. -class CCPredicateAction : CCAction { - CCAction SubAction = A; -} - -/// CCMatchType - If the current argument is one of the specified types, apply -/// Action A. -class CCMatchType VTs, CCAction A> : CCPredicateAction { -} - -/// CCMatchIf - If the predicate matches, apply A. -class CCMatchIf : CCPredicateAction { - string Predicate = predicate; -} - -/// CCMatchIfCC - Match of the current calling convention is 'CC'. -class CCMatchIfCC : CCPredicateAction { - string CallingConv = CC; -} - -/// CCAssignToReg - This action matches if there is a register in the specified -/// list that is still available. If so, it assigns the value to the first -/// available register and succeeds. -class CCAssignToReg regList> : CCAction { - list RegList = regList; -} - -/// CCAssignToStack - This action always matches: it assigns the value to a -/// stack slot of the specified size and alignment on the stack. -class CCAssignToStack : CCAction { - int Size = size; - int Align = align; -} - - -/// CCPromoteToType - If applied, this promotes the specified current value to -/// the specified type. -class CCPromoteToType : CCAction { - ValueType DestTy = destTy; -} - -/// CCDelegateTo - This action invokes the specified sub-calling-convention. It -/// is successful if the specified CC matches. -class CCDelegateTo : CCAction { - CallingConv CC = cc; -} - - -class CallingConv actions> { - list Actions = actions; -} - //===----------------------------------------------------------------------===// // Return Value Calling Conventions //===----------------------------------------------------------------------===// From reid at x10sys.com Tue Feb 27 00:24:07 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 00:24:07 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp Message-ID: <200702270624.l1R6O7dJ000934@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ConstantFold.cpp updated: 1.139 -> 1.140 --- Log message: For PR1205: http://llvm.org/PR1205 : Implement constant folding via APInt instead of uint64_t. --- Diffs of the changes: (+135 -102) ConstantFold.cpp | 237 +++++++++++++++++++++++++++++++------------------------ 1 files changed, 135 insertions(+), 102 deletions(-) Index: llvm/lib/VMCore/ConstantFold.cpp diff -u llvm/lib/VMCore/ConstantFold.cpp:1.139 llvm/lib/VMCore/ConstantFold.cpp:1.140 --- llvm/lib/VMCore/ConstantFold.cpp:1.139 Mon Feb 26 21:05:06 2007 +++ llvm/lib/VMCore/ConstantFold.cpp Tue Feb 27 00:23:51 2007 @@ -1,4 +1,4 @@ -//===- ConstantFolding.cpp - LLVM constant folder -------------------------===// +//===- ConstantFold.cpp - LLVM constant folder ----------------------------===// // // The LLVM Compiler Infrastructure // @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// // // This file implements folding of constants for LLVM. This implements the -// (internal) ConstantFolding.h interface, which is used by the +// (internal) ConstantFold.h interface, which is used by the // ConstantExpr::get* methods to automatically fold constants when possible. // // The current constant folding implementation is implemented in two pieces: the @@ -38,11 +38,11 @@ /// CastConstantVector - Convert the specified ConstantVector node to the /// specified vector type. At this point, we know that the elements of the /// input packed constant are all simple integer or FP values. -static Constant *CastConstantVector(ConstantVector *CP, +static Constant *CastConstantVector(ConstantVector *CV, const VectorType *DstTy) { - unsigned SrcNumElts = CP->getType()->getNumElements(); + unsigned SrcNumElts = CV->getType()->getNumElements(); unsigned DstNumElts = DstTy->getNumElements(); - const Type *SrcEltTy = CP->getType()->getElementType(); + const Type *SrcEltTy = CV->getType()->getElementType(); const Type *DstEltTy = DstTy->getElementType(); // If both vectors have the same number of elements (thus, the elements @@ -56,7 +56,7 @@ (SrcEltTy->isFloatingPoint() && DstEltTy->isFloatingPoint())) { for (unsigned i = 0; i != SrcNumElts; ++i) Result.push_back( - ConstantExpr::getBitCast(CP->getOperand(i), DstEltTy)); + ConstantExpr::getBitCast(CV->getOperand(i), DstEltTy)); return ConstantVector::get(Result); } @@ -67,7 +67,7 @@ if (DstEltTy->getTypeID() == Type::DoubleTyID) { for (unsigned i = 0; i != SrcNumElts; ++i) { double V = - BitsToDouble(cast(CP->getOperand(i))->getZExtValue()); + BitsToDouble(cast(CV->getOperand(i))->getZExtValue()); Result.push_back(ConstantFP::get(Type::DoubleTy, V)); } return ConstantVector::get(Result); @@ -75,7 +75,7 @@ assert(DstEltTy == Type::FloatTy && "Unknown fp type!"); for (unsigned i = 0; i != SrcNumElts; ++i) { float V = - BitsToFloat(cast(CP->getOperand(i))->getZExtValue()); + BitsToFloat(cast(CV->getOperand(i))->getZExtValue()); Result.push_back(ConstantFP::get(Type::FloatTy, V)); } return ConstantVector::get(Result); @@ -86,9 +86,10 @@ if (SrcEltTy->getTypeID() == Type::DoubleTyID) { for (unsigned i = 0; i != SrcNumElts; ++i) { - uint64_t V = - DoubleToBits(cast(CP->getOperand(i))->getValue()); - Constant *C = ConstantInt::get(Type::Int64Ty, V); + double V = + DoubleToBits(cast(CV->getOperand(i))->getValue()); + Constant *C = ConstantInt::get(Type::Int64Ty, + APIntOps::RoundDoubleToAPInt(V)); Result.push_back(ConstantExpr::getBitCast(C, DstEltTy )); } return ConstantVector::get(Result); @@ -96,7 +97,7 @@ assert(SrcEltTy->getTypeID() == Type::FloatTyID); for (unsigned i = 0; i != SrcNumElts; ++i) { - uint32_t V = FloatToBits(cast(CP->getOperand(i))->getValue()); + uint32_t V = FloatToBits(cast(CV->getOperand(i))->getValue()); Constant *C = ConstantInt::get(Type::Int32Ty, V); Result.push_back(ConstantExpr::getBitCast(C, DstEltTy)); } @@ -174,12 +175,26 @@ return ConstantFP::get(DestTy, FPC->getValue()); return 0; // Can't fold. case Instruction::FPToUI: - if (const ConstantFP *FPC = dyn_cast(V)) - return ConstantInt::get(DestTy,(uint64_t) FPC->getValue()); + if (const ConstantFP *FPC = dyn_cast(V)) { + APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue())); + uint32_t DestBitWidth = cast(DestTy)->getBitWidth(); + if (Val.getBitWidth() > DestBitWidth) + Val.trunc(DestBitWidth); + else if (Val.getBitWidth() < DestBitWidth) + Val.zext(DestBitWidth); + return ConstantInt::get(DestTy, Val); + } return 0; // Can't fold. case Instruction::FPToSI: - if (const ConstantFP *FPC = dyn_cast(V)) - return ConstantInt::get(DestTy,(int64_t) FPC->getValue()); + if (const ConstantFP *FPC = dyn_cast(V)) { + APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue())); + uint32_t DestBitWidth = cast(DestTy)->getBitWidth(); + if (Val.getBitWidth() > DestBitWidth) + Val.trunc(DestBitWidth); + else if (Val.getBitWidth() < DestBitWidth) + Val.sext(DestBitWidth); + return ConstantInt::get(DestTy, Val); + } return 0; // Can't fold. case Instruction::IntToPtr: //always treated as unsigned if (V->isNullValue()) // Is it an integral null value? @@ -191,23 +206,37 @@ return 0; // Other pointer types cannot be casted case Instruction::UIToFP: if (const ConstantInt *CI = dyn_cast(V)) - return ConstantFP::get(DestTy, double(CI->getZExtValue())); + if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) + return ConstantFP::get(DestTy, CI->getValue().roundToDouble(false)); return 0; case Instruction::SIToFP: if (const ConstantInt *CI = dyn_cast(V)) - return ConstantFP::get(DestTy, double(CI->getSExtValue())); + if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) + return ConstantFP::get(DestTy, CI->getValue().roundToDouble(true)); return 0; case Instruction::ZExt: - if (const ConstantInt *CI = dyn_cast(V)) - return ConstantInt::get(DestTy, CI->getZExtValue()); + if (const ConstantInt *CI = dyn_cast(V)) { + uint32_t BitWidth = cast(DestTy)->getBitWidth(); + APInt Result(CI->getValue()); + Result.zext(BitWidth); + return ConstantInt::get(DestTy, Result); + } return 0; case Instruction::SExt: - if (const ConstantInt *CI = dyn_cast(V)) - return ConstantInt::get(DestTy, CI->getSExtValue()); + if (const ConstantInt *CI = dyn_cast(V)) { + uint32_t BitWidth = cast(DestTy)->getBitWidth(); + APInt Result(CI->getValue()); + Result.sext(BitWidth); + return ConstantInt::get(DestTy, Result); + } return 0; case Instruction::Trunc: - if (const ConstantInt *CI = dyn_cast(V)) // Can't trunc a bool - return ConstantInt::get(DestTy, CI->getZExtValue()); + if (const ConstantInt *CI = dyn_cast(V)) { + uint32_t BitWidth = cast(DestTy)->getBitWidth(); + APInt Result(CI->getValue()); + Result.trunc(BitWidth); + return ConstantInt::get(DestTy, Result); + } return 0; case Instruction::BitCast: if (SrcTy == DestTy) @@ -252,14 +281,14 @@ if (isa(V)) return UndefValue::get(DestTy); - if (const ConstantVector *CP = dyn_cast(V)) { + if (const ConstantVector *CV = dyn_cast(V)) { // This is a cast from a ConstantVector of one type to a // ConstantVector of another type. Check to see if all elements of // the input are simple. bool AllSimpleConstants = true; - for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) { - if (!isa(CP->getOperand(i)) && - !isa(CP->getOperand(i))) { + for (unsigned i = 0, e = CV->getNumOperands(); i != e; ++i) { + if (!isa(CV->getOperand(i)) && + !isa(CV->getOperand(i))) { AllSimpleConstants = false; break; } @@ -267,7 +296,7 @@ // If all of the elements are simple constants, we can fold this. if (AllSimpleConstants) - return CastConstantVector(const_cast(CP), DestPTy); + return CastConstantVector(const_cast(CV), DestPTy); } } } @@ -279,9 +308,10 @@ // Handle integral constant input. if (const ConstantInt *CI = dyn_cast(V)) { - // Integral -> Integral, must be changing sign. if (DestTy->isInteger()) - return ConstantInt::get(DestTy, CI->getZExtValue()); + // Integral -> Integral. This is a no-op because the bit widths must + // be the same. Consequently, we just fold to V. + return const_cast(V); if (DestTy->isFloatingPoint()) { if (DestTy == Type::FloatTy) @@ -350,7 +380,7 @@ const Constant *Idx) { const ConstantInt *CIdx = dyn_cast(Idx); if (!CIdx) return 0; - uint64_t idxVal = CIdx->getZExtValue(); + APInt idxVal = CIdx->getValue(); if (isa(Val)) { // Insertion of scalar constant into packed undef // Optimize away insertion of undef @@ -364,7 +394,7 @@ Ops.reserve(numOps); for (unsigned i = 0; i < numOps; ++i) { const Constant *Op = - (i == idxVal) ? Elt : UndefValue::get(Elt->getType()); + (idxVal == i) ? Elt : UndefValue::get(Elt->getType()); Ops.push_back(const_cast(Op)); } return ConstantVector::get(Ops); @@ -382,7 +412,7 @@ Ops.reserve(numOps); for (unsigned i = 0; i < numOps; ++i) { const Constant *Op = - (i == idxVal) ? Elt : Constant::getNullValue(Elt->getType()); + (idxVal == i) ? Elt : Constant::getNullValue(Elt->getType()); Ops.push_back(const_cast(Op)); } return ConstantVector::get(Ops); @@ -393,7 +423,7 @@ Ops.reserve(CVal->getNumOperands()); for (unsigned i = 0; i < CVal->getNumOperands(); ++i) { const Constant *Op = - (i == idxVal) ? Elt : cast(CVal->getOperand(i)); + (idxVal == i) ? Elt : cast(CVal->getOperand(i)); Ops.push_back(const_cast(Op)); } return ConstantVector::get(Ops); @@ -482,19 +512,19 @@ case Instruction::Mul: if (C2->isNullValue()) return const_cast(C2); // X * 0 == 0 if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->getZExtValue() == 1) + if (CI->equalsInt(1)) return const_cast(C1); // X * 1 == X break; case Instruction::UDiv: case Instruction::SDiv: if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->getZExtValue() == 1) + if (CI->equalsInt(1)) return const_cast(C1); // X / 1 == X break; case Instruction::URem: case Instruction::SRem: if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->getZExtValue() == 1) + if (CI->equalsInt(1)) return Constant::getNullValue(CI->getType()); // X % 1 == 0 break; case Instruction::And: @@ -508,7 +538,8 @@ // Functions are at least 4-byte aligned. If and'ing the address of a // function with a constant < 4, fold it to zero. if (const ConstantInt *CI = dyn_cast(C2)) - if (CI->getZExtValue() < 4 && isa(CPR)) + if (CI->getValue().ult(APInt(CI->getType()->getBitWidth(),4)) && + isa(CPR)) return Constant::getNullValue(CI->getType()); } break; @@ -554,56 +585,66 @@ // so look at directly computing the value. if (const ConstantInt *CI1 = dyn_cast(C1)) { if (const ConstantInt *CI2 = dyn_cast(C2)) { - uint64_t C1Val = CI1->getZExtValue(); - uint64_t C2Val = CI2->getZExtValue(); + using namespace APIntOps; + APInt C1V = CI1->getValue(); + APInt C2V = CI2->getValue(); switch (Opcode) { default: break; case Instruction::Add: - return ConstantInt::get(C1->getType(), C1Val + C2Val); + return ConstantInt::get(C1->getType(), C1V + C2V); case Instruction::Sub: - return ConstantInt::get(C1->getType(), C1Val - C2Val); + return ConstantInt::get(C1->getType(), C1V - C2V); case Instruction::Mul: - return ConstantInt::get(C1->getType(), C1Val * C2Val); + return ConstantInt::get(C1->getType(), C1V * C2V); case Instruction::UDiv: - if (CI2->isNullValue()) // X / 0 -> can't fold - return 0; - return ConstantInt::get(C1->getType(), C1Val / C2Val); + if (CI2->isNullValue()) + return 0; // X / 0 -> can't fold + return ConstantInt::get(C1->getType(), C1V.udiv(C2V)); case Instruction::SDiv: - if (CI2->isNullValue()) return 0; // X / 0 -> can't fold - if (CI2->isAllOnesValue() && - (((CI1->getType()->getPrimitiveSizeInBits() == 64) && - (CI1->getSExtValue() == INT64_MIN)) || - (CI1->getSExtValue() == -CI1->getSExtValue() && - CI1->getSExtValue()))) - return 0; // MIN_INT / -1 -> overflow - return ConstantInt::get(C1->getType(), - CI1->getSExtValue() / CI2->getSExtValue()); - case Instruction::URem: - if (C2->isNullValue()) return 0; // X / 0 -> can't fold - return ConstantInt::get(C1->getType(), C1Val % C2Val); + if (CI2->isNullValue()) + return 0; // X / 0 -> can't fold + return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); + if (C2V.isAllOnesValue() && C1V.isMinSignedValue()) + return 0; // MIN_INT / -1 -> overflow + return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); + case Instruction::URem: + if (C2->isNullValue()) + return 0; // X / 0 -> can't fold + return ConstantInt::get(C1->getType(), C1V.urem(C2V)); case Instruction::SRem: - if (CI2->isNullValue()) return 0; // X % 0 -> can't fold - if (CI2->isAllOnesValue() && - (((CI1->getType()->getPrimitiveSizeInBits() == 64) && - (CI1->getSExtValue() == INT64_MIN)) || - (CI1->getSExtValue() == -CI1->getSExtValue()))) - return 0; // MIN_INT % -1 -> overflow - return ConstantInt::get(C1->getType(), - CI1->getSExtValue() % CI2->getSExtValue()); + if (CI2->isNullValue()) + return 0; // X % 0 -> can't fold + if (C2V.isAllOnesValue() && C1V.isMinSignedValue()) + return 0; // MIN_INT % -1 -> overflow + return ConstantInt::get(C1->getType(), C1V.srem(C2V)); case Instruction::And: - return ConstantInt::get(C1->getType(), C1Val & C2Val); + return ConstantInt::get(C1->getType(), C1V & C2V); case Instruction::Or: - return ConstantInt::get(C1->getType(), C1Val | C2Val); + return ConstantInt::get(C1->getType(), C1V | C2V); case Instruction::Xor: - return ConstantInt::get(C1->getType(), C1Val ^ C2Val); + return ConstantInt::get(C1->getType(), C1V ^ C2V); case Instruction::Shl: - return ConstantInt::get(C1->getType(), C1Val << C2Val); + if (uint32_t shiftAmt = C2V.getZExtValue()) + if (shiftAmt <= C1V.getBitWidth()) + return ConstantInt::get(C1->getType(), C1V.shl(shiftAmt)); + else + return UndefValue::get(C1->getType()); // too big shift is undef + return const_cast(CI1); // Zero shift is identity case Instruction::LShr: - return ConstantInt::get(C1->getType(), C1Val >> C2Val); + if (uint32_t shiftAmt = C2V.getZExtValue()) + if (shiftAmt <= C1V.getBitWidth()) + return ConstantInt::get(C1->getType(), C1V.lshr(shiftAmt)); + else + return UndefValue::get(C1->getType()); // too big shift is undef + return const_cast(CI1); // Zero shift is identity case Instruction::AShr: - return ConstantInt::get(C1->getType(), - CI1->getSExtValue() >> C2Val); + if (uint32_t shiftAmt = C2V.getZExtValue()) + if (shiftAmt <= C1V.getBitWidth()) + return ConstantInt::get(C1->getType(), C1V.ashr(shiftAmt)); + else + return UndefValue::get(C1->getType()); // too big shift is undef + return const_cast(CI1); // Zero shift is identity } } } else if (const ConstantFP *CFP1 = dyn_cast(C1)) { @@ -752,15 +793,15 @@ Constant *C2 = const_cast(V2); R = dyn_cast( ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ, C1, C2)); - if (R && R->getZExtValue()) + if (R && !R->isNullValue()) return FCmpInst::FCMP_OEQ; R = dyn_cast( ConstantExpr::getFCmp(FCmpInst::FCMP_OLT, C1, C2)); - if (R && R->getZExtValue()) + if (R && !R->isNullValue()) return FCmpInst::FCMP_OLT; R = dyn_cast( ConstantExpr::getFCmp(FCmpInst::FCMP_OGT, C1, C2)); - if (R && R->getZExtValue()) + if (R && !R->isNullValue()) return FCmpInst::FCMP_OGT; // Nothing more we can do @@ -819,15 +860,15 @@ Constant *C2 = const_cast(V2); ICmpInst::Predicate pred = ICmpInst::ICMP_EQ; R = dyn_cast(ConstantExpr::getICmp(pred, C1, C2)); - if (R && R->getZExtValue()) + if (R && !R->isNullValue()) return pred; pred = isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; R = dyn_cast(ConstantExpr::getICmp(pred, C1, C2)); - if (R && R->getZExtValue()) + if (R && !R->isNullValue()) return pred; pred = isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; R = dyn_cast(ConstantExpr::getICmp(pred, C1, C2)); - if (R && R->getZExtValue()) + if (R && !R->isNullValue()) return pred; // If we couldn't figure it out, bail. @@ -1045,28 +1086,20 @@ } if (isa(C1) && isa(C2)) { - if (ICmpInst::isSignedPredicate(ICmpInst::Predicate(pred))) { - int64_t V1 = cast(C1)->getSExtValue(); - int64_t V2 = cast(C2)->getSExtValue(); - switch (pred) { - default: assert(0 && "Invalid ICmp Predicate"); return 0; - case ICmpInst::ICMP_SLT:return ConstantInt::get(Type::Int1Ty, V1 < V2); - case ICmpInst::ICMP_SGT:return ConstantInt::get(Type::Int1Ty, V1 > V2); - case ICmpInst::ICMP_SLE:return ConstantInt::get(Type::Int1Ty, V1 <= V2); - case ICmpInst::ICMP_SGE:return ConstantInt::get(Type::Int1Ty, V1 >= V2); - } - } else { - uint64_t V1 = cast(C1)->getZExtValue(); - uint64_t V2 = cast(C2)->getZExtValue(); - switch (pred) { - default: assert(0 && "Invalid ICmp Predicate"); return 0; - case ICmpInst::ICMP_EQ: return ConstantInt::get(Type::Int1Ty, V1 == V2); - case ICmpInst::ICMP_NE: return ConstantInt::get(Type::Int1Ty, V1 != V2); - case ICmpInst::ICMP_ULT:return ConstantInt::get(Type::Int1Ty, V1 < V2); - case ICmpInst::ICMP_UGT:return ConstantInt::get(Type::Int1Ty, V1 > V2); - case ICmpInst::ICMP_ULE:return ConstantInt::get(Type::Int1Ty, V1 <= V2); - case ICmpInst::ICMP_UGE:return ConstantInt::get(Type::Int1Ty, V1 >= V2); - } + APInt V1 = cast(C1)->getValue(); + APInt V2 = cast(C2)->getValue(); + switch (pred) { + default: assert(0 && "Invalid ICmp Predicate"); return 0; + case ICmpInst::ICMP_EQ: return ConstantInt::get(Type::Int1Ty, V1 == V2); + case ICmpInst::ICMP_NE: return ConstantInt::get(Type::Int1Ty, V1 != V2); + case ICmpInst::ICMP_SLT:return ConstantInt::get(Type::Int1Ty, V1.slt(V2)); + case ICmpInst::ICMP_SGT:return ConstantInt::get(Type::Int1Ty, V1.sgt(V2)); + case ICmpInst::ICMP_SLE:return ConstantInt::get(Type::Int1Ty, V1.sle(V2)); + case ICmpInst::ICMP_SGE:return ConstantInt::get(Type::Int1Ty, V1.sge(V2)); + case ICmpInst::ICMP_ULT:return ConstantInt::get(Type::Int1Ty, V1.ult(V2)); + case ICmpInst::ICMP_UGT:return ConstantInt::get(Type::Int1Ty, V1.ugt(V2)); + case ICmpInst::ICMP_ULE:return ConstantInt::get(Type::Int1Ty, V1.ule(V2)); + case ICmpInst::ICMP_UGE:return ConstantInt::get(Type::Int1Ty, V1.uge(V2)); } } else if (isa(C1) && isa(C2)) { double C1Val = cast(C1)->getValue(); From sabre at nondot.org Tue Feb 27 01:00:09 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 01:00:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Target.td Message-ID: <200702270700.l1R7098k001533@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: Target.td updated: 1.93 -> 1.94 --- Log message: Add calling convention info --- Diffs of the changes: (+6 -1) Target.td | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/Target/Target.td diff -u llvm/lib/Target/Target.td:1.93 llvm/lib/Target/Target.td:1.94 --- llvm/lib/Target/Target.td:1.93 Tue Feb 20 14:52:03 2007 +++ llvm/lib/Target/Target.td Tue Feb 27 00:59:52 2007 @@ -355,6 +355,11 @@ } //===----------------------------------------------------------------------===// -// Pull in the common support for DAG isel generation +// Pull in the common support for calling conventions. +// +include "TargetCallingConv.td" + +//===----------------------------------------------------------------------===// +// Pull in the common support for DAG isel generation. // include "TargetSelectionDAG.td" From sabre at nondot.org Tue Feb 27 01:00:11 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 01:00:11 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86CallingConv.td Message-ID: <200702270700.l1R70BF5001539@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86CallingConv.td updated: 1.4 -> 1.5 --- Log message: Add calling convention info --- Diffs of the changes: (+5 -1) X86CallingConv.td | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86CallingConv.td diff -u llvm/lib/Target/X86/X86CallingConv.td:1.4 llvm/lib/Target/X86/X86CallingConv.td:1.5 --- llvm/lib/Target/X86/X86CallingConv.td:1.4 Mon Feb 26 23:57:32 2007 +++ llvm/lib/Target/X86/X86CallingConv.td Tue Feb 27 00:59:52 2007 @@ -71,7 +71,11 @@ CCDelegateTo ]>; - +// This is the return-value convention used for the entire X86 backend. +def RetCC_X86 : CallingConv<[ + CCMatchIf<"Subtarget->is64Bit()", CCDelegateTo>, + CCDelegateTo +]>; //===----------------------------------------------------------------------===// // Argument Calling Conventions From reid at x10sys.com Tue Feb 27 01:35:35 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 01:35:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702270735.l1R7ZZkM002097@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.51 -> 1.52 --- Log message: Get rid of extraneous // in file comment. --- Diffs of the changes: (+1 -1) APInt.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.51 llvm/lib/Support/APInt.cpp:1.52 --- llvm/lib/Support/APInt.cpp:1.51 Mon Feb 26 19:28:10 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 27 01:35:18 2007 @@ -3,7 +3,7 @@ // The LLVM Compiler Infrastructure // // This file was developed by Sheng Zhou and Reid Spencer and is distributed -// under the // University of Illinois Open Source License. See LICENSE.TXT +// under the University of Illinois Open Source License. See LICENSE.TXT // for details. // //===----------------------------------------------------------------------===// From reid at x10sys.com Tue Feb 27 01:58:09 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 01:58:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp Message-ID: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Constants.cpp updated: 1.222 -> 1.223 --- Log message: Correct the implelmentation of ConstantInt::getAllOnesValue() for bit widths > 64 bits. --- Diffs of the changes: (+1 -1) Constants.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.222 llvm/lib/VMCore/Constants.cpp:1.223 --- llvm/lib/VMCore/Constants.cpp:1.222 Mon Feb 26 21:05:06 2007 +++ llvm/lib/VMCore/Constants.cpp Tue Feb 27 01:57:53 2007 @@ -118,7 +118,7 @@ if (ITy->getBitWidth() == 1) return ConstantInt::getTrue(); else - return ConstantInt::get(Ty, int64_t(-1)); + return ConstantInt::get(Ty, APInt::getAllOnesValue(ITy->getBitWidth())); return 0; } From reid at x10sys.com Tue Feb 27 02:35:14 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 02:35:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp Message-ID: <200702270835.l1R8ZE8e012095@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AsmWriter.cpp updated: 1.261 -> 1.262 --- Log message: Allow the AsmWriter to print out arbitrary precision integers. --- Diffs of the changes: (+1 -1) AsmWriter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/VMCore/AsmWriter.cpp diff -u llvm/lib/VMCore/AsmWriter.cpp:1.261 llvm/lib/VMCore/AsmWriter.cpp:1.262 --- llvm/lib/VMCore/AsmWriter.cpp:1.261 Wed Feb 14 20:26:10 2007 +++ llvm/lib/VMCore/AsmWriter.cpp Tue Feb 27 02:34:09 2007 @@ -464,7 +464,7 @@ if (CI->getType() == Type::Int1Ty) Out << (CI->getZExtValue() ? "true" : "false"); else - Out << CI->getSExtValue(); + Out << CI->getValue().toString(10,/*wantSigned=*/true); } else if (const ConstantFP *CFP = dyn_cast(CV)) { // We would like to output the FP constant value in exponential notation, // but we cannot do this if doing so will lose precision. Check here to From jlaskey at apple.com Tue Feb 27 05:56:01 2007 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 27 Feb 2007 05:56:01 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h PPCRegisterInfo.cpp PPCRegisterInfo.h Message-ID: <200702271156.l1RBu1T5019959@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCMachineFunctionInfo.h updated: 1.4 -> 1.5 PPCRegisterInfo.cpp updated: 1.113 -> 1.114 PPCRegisterInfo.h updated: 1.30 -> 1.31 --- Log message: Duplicate use of LR, take 2. --- Diffs of the changes: (+42 -26) PPCMachineFunctionInfo.h | 7 +++++ PPCRegisterInfo.cpp | 60 ++++++++++++++++++++++++++--------------------- PPCRegisterInfo.h | 1 3 files changed, 42 insertions(+), 26 deletions(-) Index: llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h diff -u llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.4 llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.5 --- llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h:1.4 Mon Feb 26 20:55:29 2007 +++ llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.h Tue Feb 27 05:55:44 2007 @@ -26,6 +26,10 @@ /// stored. Also used as an anchor for instructions that need to be altered /// when using frame pointers (dyna_add, dyna_sub.) int FramePointerSaveIndex; + + /// UsesLR - Indicates whether LR is used in the current function. + /// + bool UsesLR; public: PPCFunctionInfo(MachineFunction& MF) @@ -34,6 +38,9 @@ int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } + + void setUsesLR(bool U) { UsesLR = U; } + bool usesLR() { return UsesLR; } }; Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.113 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.114 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.113 Mon Feb 26 20:55:29 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Tue Feb 27 05:55:45 2007 @@ -538,8 +538,8 @@ /// usesLR - Returns if the link registers (LR) has been used in the function. /// bool PPCRegisterInfo::usesLR(MachineFunction &MF) const { - const bool *PhysRegsUsed = MF.getUsedPhysregs(); - return PhysRegsUsed[getRARegister()]; + PPCFunctionInfo *FI = MF.getInfo(); + return FI->usesLR(); } void PPCRegisterInfo:: @@ -874,6 +874,15 @@ MFI->setStackSize(FrameSize); } +void PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF) + const { + // Save and clear the LR state. + PPCFunctionInfo *FI = MF.getInfo(); + unsigned LR = getRARegister(); + FI->setUsesLR(MF.isPhysRegUsed(LR)); + MF.changePhyRegUsed(LR, false); +} + void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const { MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB MachineBasicBlock::iterator MBBI = MBB.begin(); @@ -899,9 +908,6 @@ determineFrameLayout(MF); unsigned FrameSize = MFI->getStackSize(); - // Skip if a leaf routine. - if (!FrameSize) return; - int NegFrameSize = -FrameSize; // Get processor type. @@ -911,7 +917,7 @@ // Check if the link register (LR) has been used. bool UsesLR = MFI->hasCalls() || usesLR(MF); // Do we have a frame pointer for this function? - bool HasFP = hasFP(MF); + bool HasFP = hasFP(MF) && FrameSize; int LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, IsMachoABI); int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI); @@ -940,6 +946,9 @@ .addReg(PPC::R0).addImm(LROffset).addReg(PPC::R1); } + // Skip if a leaf routine. + if (!FrameSize) return; + // Get stack alignments. unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); unsigned MaxAlign = MFI->getMaxAlignment(); @@ -1065,8 +1074,6 @@ // Get the number of bytes allocated from the FrameInfo. unsigned FrameSize = MFI->getStackSize(); - if (!FrameSize) return; - // Get processor type. bool IsPPC64 = Subtarget.isPPC64(); // Get operating system @@ -1074,31 +1081,32 @@ // Check if the link register (LR) has been used. bool UsesLR = MFI->hasCalls() || usesLR(MF); // Do we have a frame pointer for this function? - bool HasFP = hasFP(MF); + bool HasFP = hasFP(MF) && FrameSize; int LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, IsMachoABI); int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, IsMachoABI); - // The loaded (or persistent) stack pointer value is offset by the 'stwu' - // on entry to the function. Add this offset back now. - if (!Subtarget.isPPC64()) { - if (isInt16(FrameSize) && TargetAlign >= MaxAlign && - !MFI->hasVarSizedObjects()) { - BuildMI(MBB, MBBI, TII.get(PPC::ADDI), PPC::R1) - .addReg(PPC::R1).addImm(FrameSize); - } else { - BuildMI(MBB, MBBI, TII.get(PPC::LWZ),PPC::R1).addImm(0).addReg(PPC::R1); - } - } else { - if (isInt16(FrameSize) && TargetAlign >= MaxAlign && - !MFI->hasVarSizedObjects()) { - BuildMI(MBB, MBBI, TII.get(PPC::ADDI8), PPC::X1) - .addReg(PPC::X1).addImm(FrameSize); + if (FrameSize) { + // The loaded (or persistent) stack pointer value is offset by the 'stwu' + // on entry to the function. Add this offset back now. + if (!Subtarget.isPPC64()) { + if (isInt16(FrameSize) && TargetAlign >= MaxAlign && + !MFI->hasVarSizedObjects()) { + BuildMI(MBB, MBBI, TII.get(PPC::ADDI), PPC::R1) + .addReg(PPC::R1).addImm(FrameSize); + } else { + BuildMI(MBB, MBBI, TII.get(PPC::LWZ),PPC::R1).addImm(0).addReg(PPC::R1); + } } else { - BuildMI(MBB, MBBI, TII.get(PPC::LD), PPC::X1).addImm(0).addReg(PPC::X1); + if (isInt16(FrameSize) && TargetAlign >= MaxAlign && + !MFI->hasVarSizedObjects()) { + BuildMI(MBB, MBBI, TII.get(PPC::ADDI8), PPC::X1) + .addReg(PPC::X1).addImm(FrameSize); + } else { + BuildMI(MBB, MBBI, TII.get(PPC::LD), PPC::X1).addImm(0).addReg(PPC::X1); + } } } - if (IsPPC64) { if (UsesLR) Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.h diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.30 llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.31 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.30 Mon Feb 26 20:55:29 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.h Tue Feb 27 05:55:45 2007 @@ -82,6 +82,7 @@ /// frame size. void determineFrameLayout(MachineFunction &MF) const; + void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const; void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; From dpatel at apple.com Tue Feb 27 09:00:59 2007 From: dpatel at apple.com (Devang Patel) Date: Tue, 27 Feb 2007 09:00:59 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp Message-ID: <200702271500.l1RF0x8J023120@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/IPA: CallGraphSCCPass.cpp updated: 1.18 -> 1.19 --- Log message: Make getPassManagerType() const. --- Diffs of the changes: (+1 -1) CallGraphSCCPass.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.18 llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.19 --- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.18 Thu Feb 1 16:38:33 2007 +++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp Tue Feb 27 09:00:39 2007 @@ -66,7 +66,7 @@ return FP; } - virtual PassManagerType getPassManagerType() { + virtual PassManagerType getPassManagerType() const { return PMT_CallGraphPassManager; } }; From dpatel at apple.com Tue Feb 27 09:01:00 2007 From: dpatel at apple.com (Devang Patel) Date: Tue, 27 Feb 2007 09:01:00 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/PassManagers.h Message-ID: <200702271501.l1RF10dd023125@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: PassManagers.h updated: 1.9 -> 1.10 --- Log message: Make getPassManagerType() const. --- Diffs of the changes: (+2 -2) PassManagers.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/include/llvm/PassManagers.h diff -u llvm/include/llvm/PassManagers.h:1.9 llvm/include/llvm/PassManagers.h:1.10 --- llvm/include/llvm/PassManagers.h:1.9 Sat Feb 17 17:14:24 2007 +++ llvm/include/llvm/PassManagers.h Tue Feb 27 09:00:39 2007 @@ -250,7 +250,7 @@ return PassVector.size(); } - virtual PassManagerType getPassManagerType() { + virtual PassManagerType getPassManagerType() const { assert ( 0 && "Invalid use of getPassManagerType"); return PMT_Unknown; } @@ -322,7 +322,7 @@ return FP; } - virtual PassManagerType getPassManagerType() { + virtual PassManagerType getPassManagerType() const { return PMT_FunctionPassManager; } }; From dpatel at apple.com Tue Feb 27 09:01:01 2007 From: dpatel at apple.com (Devang Patel) Date: Tue, 27 Feb 2007 09:01:01 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/LoopPass.h Message-ID: <200702271501.l1RF11og023128@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis: LoopPass.h updated: 1.6 -> 1.7 --- Log message: Make getPassManagerType() const. --- Diffs of the changes: (+1 -1) LoopPass.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/Analysis/LoopPass.h diff -u llvm/include/llvm/Analysis/LoopPass.h:1.6 llvm/include/llvm/Analysis/LoopPass.h:1.7 --- llvm/include/llvm/Analysis/LoopPass.h:1.6 Fri Feb 23 11:53:16 2007 +++ llvm/include/llvm/Analysis/LoopPass.h Tue Feb 27 09:00:39 2007 @@ -81,7 +81,7 @@ return FP; } - virtual PassManagerType getPassManagerType() { + virtual PassManagerType getPassManagerType() const { return PMT_LoopPassManager; } From dpatel at apple.com Tue Feb 27 09:01:03 2007 From: dpatel at apple.com (Devang Patel) Date: Tue, 27 Feb 2007 09:01:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/PassManager.cpp Message-ID: <200702271501.l1RF13w3023140@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: PassManager.cpp updated: 1.137 -> 1.138 --- Log message: Make getPassManagerType() const. --- Diffs of the changes: (+4 -2) PassManager.cpp | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/VMCore/PassManager.cpp diff -u llvm/lib/VMCore/PassManager.cpp:1.137 llvm/lib/VMCore/PassManager.cpp:1.138 --- llvm/lib/VMCore/PassManager.cpp:1.137 Sat Feb 17 17:14:24 2007 +++ llvm/lib/VMCore/PassManager.cpp Tue Feb 27 09:00:39 2007 @@ -98,7 +98,7 @@ return BP; } - virtual PassManagerType getPassManagerType() { + virtual PassManagerType getPassManagerType() const { return PMT_BasicBlockPassManager; } }; @@ -210,7 +210,9 @@ return MP; } - virtual PassManagerType getPassManagerType() { return PMT_ModulePassManager; } + virtual PassManagerType getPassManagerType() const { + return PMT_ModulePassManager; + } }; //===----------------------------------------------------------------------===// From nicolas.geoffray at lip6.fr Tue Feb 27 04:44:59 2007 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Feb 2007 04:44:59 -0600 Subject: [llvm-commits] CVS: llvm/CREDITS.TXT Message-ID: <200702271044.l1RAixCV018553@zion.cs.uiuc.edu> Changes in directory llvm: CREDITS.TXT updated: 1.69 -> 1.70 --- Log message: Added myself --- Diffs of the changes: (+5 -0) CREDITS.TXT | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/CREDITS.TXT diff -u llvm/CREDITS.TXT:1.69 llvm/CREDITS.TXT:1.70 --- llvm/CREDITS.TXT:1.69 Thu Feb 15 16:26:28 2007 +++ llvm/CREDITS.TXT Tue Feb 27 04:44:42 2007 @@ -78,6 +78,11 @@ D: Dynamic trace optimizer D: FreeBSD/X86 compatibility fixes, the llvm-nm tool +N: Nicolas Geoffray +E: nicolas.geoffray at lip6.fr +W: http://www-src.lip6.fr/homepages/Nicolas.Geoffray/ +D: PPC backend fixes for Linux + N: Louis Gerbarg D: Portions of the PowerPC backend From nicolas.geoffray at lip6.fr Tue Feb 27 07:01:36 2007 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Feb 2007 07:01:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp PPCISelLowering.h PPCInstr64Bit.td PPCInstrInfo.td Message-ID: <200702271301.l1RD1aX3020972@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.cpp updated: 1.257 -> 1.258 PPCISelLowering.h updated: 1.59 -> 1.60 PPCInstr64Bit.td updated: 1.40 -> 1.41 PPCInstrInfo.td updated: 1.275 -> 1.276 --- Log message: Differentiate between the MachO and the ELF ABI the CALL instruction. --- Diffs of the changes: (+12 -12) PPCISelLowering.cpp | 5 +++-- PPCISelLowering.h | 2 +- PPCInstr64Bit.td | 5 ++--- PPCInstrInfo.td | 12 ++++++------ 4 files changed, 12 insertions(+), 12 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.257 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.258 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.257 Mon Feb 26 13:44:02 2007 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Tue Feb 27 07:01:19 2007 @@ -326,7 +326,8 @@ case PPCISD::SHL: return "PPCISD::SHL"; case PPCISD::EXTSW_32: return "PPCISD::EXTSW_32"; case PPCISD::STD_32: return "PPCISD::STD_32"; - case PPCISD::CALL: return "PPCISD::CALL"; + case PPCISD::CALL_ELF: return "PPCISD::CALL_ELF"; + case PPCISD::CALL_Macho: return "PPCISD::CALL_Macho"; case PPCISD::MTCTR: return "PPCISD::MTCTR"; case PPCISD::BCTRL_Macho: return "PPCISD::BCTRL_Macho"; case PPCISD::BCTRL_ELF: return "PPCISD::BCTRL_ELF"; @@ -1510,7 +1511,7 @@ NodeTys.push_back(MVT::Flag); // Returns a flag for retval copy to use. SmallVector Ops; - unsigned CallOpc = PPCISD::CALL; + unsigned CallOpc = isMachoABI? PPCISD::CALL_Macho : PPCISD::CALL_ELF; // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol Index: llvm/lib/Target/PowerPC/PPCISelLowering.h diff -u llvm/lib/Target/PowerPC/PPCISelLowering.h:1.59 llvm/lib/Target/PowerPC/PPCISelLowering.h:1.60 --- llvm/lib/Target/PowerPC/PPCISelLowering.h:1.59 Sat Feb 24 23:34:32 2007 +++ llvm/lib/Target/PowerPC/PPCISelLowering.h Tue Feb 27 07:01:19 2007 @@ -82,7 +82,7 @@ STD_32, /// CALL - A direct function call. - CALL, + CALL_Macho, CALL_ELF, /// CHAIN,FLAG = MTCTR(VAL, CHAIN[, INFLAG]) - Directly corresponds to a /// MTCTR instruction. Index: llvm/lib/Target/PowerPC/PPCInstr64Bit.td diff -u llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.40 llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.41 --- llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.40 Sun Feb 25 13:20:53 2007 +++ llvm/lib/Target/PowerPC/PPCInstr64Bit.td Tue Feb 27 07:01:19 2007 @@ -102,7 +102,7 @@ def BLA8_ELF : IForm<18, 1, 1, (ops aaddr:$func, variable_ops), - "bla $func", BrB, [/*(PPCcall_ELF (i64 imm:$func))*/]>; + "bla $func", BrB, [(PPCcall_ELF (i64 imm:$func))]>; } @@ -111,12 +111,11 @@ (BL8_Macho tglobaladdr:$dst)>; def : Pat<(PPCcall_Macho (i64 texternalsym:$dst)), (BL8_Macho texternalsym:$dst)>; -/* + def : Pat<(PPCcall_ELF (i64 tglobaladdr:$dst)), (BL8_ELF tglobaladdr:$dst)>; def : Pat<(PPCcall_ELF (i64 texternalsym:$dst)), (BL8_ELF texternalsym:$dst)>; -*/ //===----------------------------------------------------------------------===// // 64-bit SPR manipulation instrs. Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.275 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.276 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.275 Mon Feb 26 13:44:02 2007 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Tue Feb 27 07:01:19 2007 @@ -81,9 +81,9 @@ [SDNPHasChain, SDNPOutFlag]>; def SDT_PPCCall : SDTypeProfile<0, -1, [SDTCisInt<0>]>; -def PPCcall_Macho : SDNode<"PPCISD::CALL", SDT_PPCCall, +def PPCcall_Macho : SDNode<"PPCISD::CALL_Macho", SDT_PPCCall, [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; -def PPCcall_ELF : SDNode<"PPCISD::CALL", SDT_PPCCall, +def PPCcall_ELF : SDNode<"PPCISD::CALL_ELF", SDT_PPCCall, [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; def PPCmtctr : SDNode<"PPCISD::MTCTR", SDT_PPCCall, [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; @@ -407,11 +407,11 @@ def BLA_ELF : IForm<18, 1, 1, (ops aaddr:$func, variable_ops), "bla $func", BrB, - [/*(PPCcall_ELF (i32 imm:$func))*/]>; + [(PPCcall_ELF (i32 imm:$func))]>; def BCTRL_ELF : XLForm_2_ext<19, 528, 20, 0, 1, (ops variable_ops), "bctrl", BrB, - [/*(PPCbctrl_ELF)*/]>; + [(PPCbctrl_ELF)]>; } // DCB* instructions. @@ -1101,10 +1101,10 @@ (BL_Macho tglobaladdr:$dst)>; def : Pat<(PPCcall_Macho (i32 texternalsym:$dst)), (BL_Macho texternalsym:$dst)>; -/*def : Pat<(PPCcall_ELF (i32 tglobaladdr:$dst)), +def : Pat<(PPCcall_ELF (i32 tglobaladdr:$dst)), (BL_ELF tglobaladdr:$dst)>; def : Pat<(PPCcall_ELF (i32 texternalsym:$dst)), - (BL_ELF texternalsym:$dst)>;*/ + (BL_ELF texternalsym:$dst)>; // Hi and Lo for Darwin Global Addresses. def : Pat<(PPChi tglobaladdr:$in, 0), (LIS tglobaladdr:$in)>; From nicolas.geoffray at lip6.fr Tue Feb 27 07:10:58 2007 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Feb 2007 07:10:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp Message-ID: <200702271310.l1RDAwuE021146@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCHazardRecognizers.cpp updated: 1.19 -> 1.20 --- Log message: Fix parenthesis for BCTRL_{ELF|Macho} test. --- Diffs of the changes: (+1 -1) PPCHazardRecognizers.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp diff -u llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp:1.19 llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp:1.20 --- llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp:1.19 Sat Feb 24 23:34:32 2007 +++ llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp Tue Feb 27 07:10:41 2007 @@ -157,7 +157,7 @@ } // Do not allow MTCTR and BCTRL to be in the same dispatch group. - if (HasCTRSet && Opcode == PPC::BCTRL_Macho || Opcode == PPC::BCTRL_ELF) + if (HasCTRSet && (Opcode == PPC::BCTRL_Macho || Opcode == PPC::BCTRL_ELF)) return NoopHazard; // If this is a load following a store, make sure it's not to the same or From clattner at apple.com Tue Feb 27 11:08:26 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 09:08:26 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp In-Reply-To: <200702270624.l1R6O7dJ000934@zion.cs.uiuc.edu> References: <200702270624.l1R6O7dJ000934@zion.cs.uiuc.edu> Message-ID: <2C85D3EC-77BE-4746-AA46-DE89BBAB2261@apple.com> On Feb 26, 2007, at 10:24 PM, Reid Spencer wrote: > case Instruction::FPToUI: > - if (const ConstantFP *FPC = dyn_cast(V)) > - return ConstantInt::get(DestTy,(uint64_t) FPC->getValue()); > + if (const ConstantFP *FPC = dyn_cast(V)) { > + APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue())); > + uint32_t DestBitWidth = cast(DestTy)- > >getBitWidth(); > + if (Val.getBitWidth() > DestBitWidth) > + Val.trunc(DestBitWidth); This seems like a poor choice of API. RoundDoubleToAPInt should take a result bitwidth. Without this, this appears like it could make a "large" APInt, then truncate it down to a small one when converting from double, which is very inefficient. > @@ -191,23 +206,37 @@ > return 0; // Other pointer types cannot be > casted > case Instruction::UIToFP: > if (const ConstantInt *CI = dyn_cast(V)) > - return ConstantFP::get(DestTy, double(CI->getZExtValue())); > + if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) > + return ConstantFP::get(DestTy, CI->getValue().roundToDouble > (false)); Why the check for APINT_BITS_PER_WORD here? APINT_BITS_PER_WORD is an implementation detail of APInt, not a part of its public interface. Also, please split the roundToDouble method into two methods which don't take a bool. > return 0; > case Instruction::SIToFP: > if (const ConstantInt *CI = dyn_cast(V)) > - return ConstantFP::get(DestTy, double(CI->getSExtValue())); > + if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) > + return ConstantFP::get(DestTy, CI->getValue().roundToDouble > (true)); > return 0; Likewise. > > @@ -382,7 +412,7 @@ > Ops.reserve(numOps); > for (unsigned i = 0; i < numOps; ++i) { > const Constant *Op = > - (i == idxVal) ? Elt : Constant::getNullValue(Elt->getType()); > + (idxVal == i) ? Elt : Constant::getNullValue(Elt->getType()); This sort of change makes the diff more noisy, and there is no apparent reason for doing it. Generally, the mutating value (i) is on the LHS, why do this (in many places)? > @@ -554,56 +585,66 @@ > case Instruction::SDiv: > + if (CI2->isNullValue()) > + return 0; // X / 0 -> can't fold > + return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); > + if (C2V.isAllOnesValue() && C1V.isMinSignedValue()) > + return 0; // MIN_INT / -1 -> overflow > + return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); This isn't right, remove the first return. > case Instruction::Shl: > - return ConstantInt::get(C1->getType(), C1Val << C2Val); > + if (uint32_t shiftAmt = C2V.getZExtValue()) > + if (shiftAmt <= C1V.getBitWidth()) This should be <, not <=, likewise for other shifts. -Chris From clattner at apple.com Tue Feb 27 11:10:17 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 09:10:17 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp In-Reply-To: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> References: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> Message-ID: > Index: llvm/lib/VMCore/Constants.cpp > diff -u llvm/lib/VMCore/Constants.cpp:1.222 llvm/lib/VMCore/ > Constants.cpp:1.223 > --- llvm/lib/VMCore/Constants.cpp:1.222 Mon Feb 26 21:05:06 2007 > +++ llvm/lib/VMCore/Constants.cpp Tue Feb 27 01:57:53 2007 > @@ -118,7 +118,7 @@ > if (ITy->getBitWidth() == 1) > return ConstantInt::getTrue(); > else > - return ConstantInt::get(Ty, int64_t(-1)); > + return ConstantInt::get(Ty, APInt::getAllOnesValue(ITy- > >getBitWidth())); > return 0; > } The special case for 'i1' can be removed, right? -Chris From clattner at apple.com Tue Feb 27 11:12:26 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 09:12:26 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp In-Reply-To: <200702270835.l1R8ZE8e012095@zion.cs.uiuc.edu> References: <200702270835.l1R8ZE8e012095@zion.cs.uiuc.edu> Message-ID: > > Index: llvm/lib/VMCore/AsmWriter.cpp > diff -u llvm/lib/VMCore/AsmWriter.cpp:1.261 llvm/lib/VMCore/ > AsmWriter.cpp:1.262 > --- llvm/lib/VMCore/AsmWriter.cpp:1.261 Wed Feb 14 20:26:10 2007 > +++ llvm/lib/VMCore/AsmWriter.cpp Tue Feb 27 02:34:09 2007 > @@ -464,7 +464,7 @@ > if (CI->getType() == Type::Int1Ty) > Out << (CI->getZExtValue() ? "true" : "false"); > else > - Out << CI->getSExtValue(); > + Out << CI->getValue().toString(10,/*wantSigned=*/true); Please change the method to something like "toStringSigned(10)", which will allow the comment to be dropped. Obviously if it's convenient internally, you can make the two "toString*" methods call the same helper. If there are other API's like this that take a bool, please change them as well. Does the .ll files parser support apint's yet? -Chris From sabre at nondot.org Tue Feb 27 11:21:26 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 11:21:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/README-SSE.txt Message-ID: <200702271721.l1RHLQRp025823@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: README-SSE.txt updated: 1.14 -> 1.15 --- Log message: a note --- Diffs of the changes: (+42 -0) README-SSE.txt | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+) Index: llvm/lib/Target/X86/README-SSE.txt diff -u llvm/lib/Target/X86/README-SSE.txt:1.14 llvm/lib/Target/X86/README-SSE.txt:1.15 --- llvm/lib/Target/X86/README-SSE.txt:1.14 Thu Dec 14 23:50:39 2006 +++ llvm/lib/Target/X86/README-SSE.txt Tue Feb 27 11:21:09 2007 @@ -530,3 +530,45 @@ Floating point max / min are commutable when -enable-unsafe-fp-path is specified. We should turn int_x86_sse_max_ss and X86ISD::FMIN etc. into other nodes which are selected to max / min instructions that are marked commutable. + +//===---------------------------------------------------------------------===// + +We should compile this: +#include +typedef union { + int i[4]; + float f[4]; + __m128 v; +} vector4_t; +void swizzle (const void *a, vector4_t * b, vector4_t * c) { + b->v = _mm_loadl_pi (b->v, (__m64 *) a); + c->v = _mm_loadl_pi (c->v, ((__m64 *) a) + 1); +} + +to: + +_swizzle: + movl 4(%esp), %eax + movl 8(%esp), %edx + movl 12(%esp), %ecx + movlps (%eax), %xmm0 + movlps %xmm0, (%edx) + movlps 8(%eax), %xmm0 + movlps %xmm0, (%ecx) + ret + +not: + +swizzle: + movl 8(%esp), %eax + movaps (%eax), %xmm0 + movl 4(%esp), %ecx + movlps (%ecx), %xmm0 + movaps %xmm0, (%eax) + movl 12(%esp), %eax + movaps (%eax), %xmm0 + movlps 8(%ecx), %xmm0 + movaps %xmm0, (%eax) + ret + + From nicolas.geoffray at lip6.fr Tue Feb 27 11:29:57 2007 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Feb 2007 18:29:57 +0100 Subject: [llvm-commits] llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Message-ID: <45E46A95.5000500@lip6.fr> Here's a patch that fixes linux/PPC FramePointer. It reserves the offset of the frame pointer before calculating the offsets of callee saved registers. OK to commit? -------------- next part -------------- A non-text attachment was scrubbed... Name: FramePointerLinuxPPC.patch Type: text/x-patch Size: 1667 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070227/b64409c1/attachment.bin From nicolas.geoffray at lip6.fr Tue Feb 27 11:33:20 2007 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Feb 2007 18:33:20 +0100 Subject: [llvm-commits] frameaddress intrinsincs for PPC Message-ID: <45E46B60.9090005@lip6.fr> This patch implements the frameaddress intrinsincs for PPC. OK to commit? -------------- next part -------------- A non-text attachment was scrubbed... Name: frameaddress.patch Type: text/x-patch Size: 2587 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070227/35c65b11/attachment.bin From reid at x10sys.com Tue Feb 27 11:58:50 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 11:58:50 -0600 Subject: [llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp Message-ID: <200702271758.l1RHwo5T026437@zion.cs.uiuc.edu> Changes in directory llvm-test/SingleSource/UnitTests/Integer/APInt: gptest.cpp updated: 1.5 -> 1.6 --- Log message: Add tests for signed comparisons. Add tests for truncation and extension. Attempt to test ashr. This doesn't work right because gp doesn't have the concept of a signed shift right. --- Diffs of the changes: (+78 -12) gptest.cpp | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 78 insertions(+), 12 deletions(-) Index: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.5 llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.6 --- llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.5 Sat Feb 24 14:20:46 2007 +++ llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp Tue Feb 27 11:58:33 2007 @@ -207,7 +207,6 @@ } void doShift(const APInt &v1) { - APInt mask = APInt::getAllOnesValue(v1.getBitWidth()); for (int i = 1; i <= v1.getBitWidth(); i++) { std::string cmd; cmd += "bitand(truncate(shift("; @@ -234,16 +233,78 @@ printf(" u>> %d = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str()); fflush(stdout); } + if (v1.isNegative()) + cmd = "shift(" + v1.toString(10,true) + ",-" + utostr(i) + ")-1\n"; + else + cmd = "shift(" + v1.toString(10,false) + ",-" + utostr(i) + ")\n"; + gpresult = getResult(cmd); + R1 = v1.ashr(i); + if (v1.isNegative()) + apresult = R1.toString(10,true); + else + apresult = R1.toString(10,false); + if (gpresult != apresult) { + if (v1.isNegative()) + print(v1, true, false); + else + print(v1, false, false); + printf(" s>> %d = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str()); + fflush(stdout); + } + } +} + +void doTruncExt(const APInt &v1) { + if (v1.getBitWidth() < 33) + return; + std::string cmd; + for (int i = 1; i < v1.getBitWidth(); i++) { + cmd = "bitand(" + v1.toString(10,false) + ",bitneg(0,"; + cmd += utostr(unsigned(i)) + "))\n"; + std::string gpresult = getResult(cmd); + APInt V1(v1); + V1.trunc(i); + std::string apresult = V1.toString(10,false); + if (gpresult != apresult) { + print(v1, false, false); + printf(".trunc(%d) = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str()); + fflush(stdout); + } + } + for (int i = v1.getBitWidth()+1; i < v1.getBitWidth()*2+2; ++i) { + cmd = "bitand(" + v1.toString(10,false) + ",bitneg(0,"; + cmd += utostr(unsigned(i)) + "))\n"; + std::string gpresult = getResult(cmd); + APInt V1(v1); + V1.zext(i); + std::string apresult = V1.toString(10,false); + if (gpresult != apresult) { + print(v1, false, false); + printf(".zext(%d) = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str()); + fflush(stdout); + } + cmd = "bitand(" + v1.toString(10,true) + ",bitneg(0,"; + cmd += utostr(unsigned(i)) + "))\n"; + gpresult = getResult(cmd); + APInt V2(v1); + V2.sext(i); + apresult = V2.toString(10,false); + if (gpresult != apresult) { + print(v1, true, false); + printf(".sext(%d) = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str()); + fflush(stdout); + } } } void doCompare(const APInt &v1, const std::string &op, - const APInt &v2, bool apresult) { - std::string cmd = v1.toString(10, false) + op + - v2.toString(10, false) + '\n'; + const APInt &v2, bool isSigned, bool apresult) { + std::string cmd = v1.toString(10, isSigned) + op + + v2.toString(10, isSigned) + '\n'; bool gpresult = atoi(getResult(cmd).c_str()); if (gpresult != apresult) - report(v1,v2, op, (apresult?"true":"false"), (apresult?"true":"false")); + report(v1,v2, (isSigned? " s"+op : " u"+op), + (gpresult?"true":"false"), (apresult?"true":"false")); } void test_binops(const APInt &v1, const APInt &v2) { @@ -255,13 +316,17 @@ doAnd(v1,v2); doOr(v1,v2); doXor(v1,v2); - doCompare(v1, "==", v2, v1 == v2); - doCompare(v1, "!=", v2, v1 != v2); - doCompare(v1, "< ", v2, v1.ult(v2)); - doCompare(v1, "<=", v2, v1.ule(v2)); - doCompare(v1, "> ", v2, v1.ugt(v2)); - doCompare(v1, ">=", v2, v1.uge(v2)); -} + doCompare(v1, " == ", v2, false, v1 == v2); + doCompare(v1, " != ", v2, false, v1 != v2); + doCompare(v1, " < ", v2, false, v1.ult(v2)); + doCompare(v1, " <= ", v2, false, v1.ule(v2)); + doCompare(v1, " > ", v2, false, v1.ugt(v2)); + doCompare(v1, " >= ", v2, false, v1.uge(v2)); + doCompare(v1, " < ", v2, true, v1.slt(v2)); + doCompare(v1, " <= ", v2, true, v1.sle(v2)); + doCompare(v1, " > ", v2, true, v1.sgt(v2)); + doCompare(v1, " >= ", v2, true, v1.sge(v2)); + } void Shutdown() { // Be nice and tell gp to stop @@ -327,6 +392,7 @@ doComplement(*(list[i])); doBitTest(*(list[i])); doShift(*(list[i])); + doTruncExt(*(list[i])); } } From reid at x10sys.com Tue Feb 27 12:22:48 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 12:22:48 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702271822.l1RIMmMW027540@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.24 -> 1.25 --- Log message: Allow the RoundDoubleToAPInt function to specify a width to use. --- Diffs of the changes: (+1 -1) APInt.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.24 llvm/include/llvm/ADT/APInt.h:1.25 --- llvm/include/llvm/ADT/APInt.h:1.24 Mon Feb 26 15:06:05 2007 +++ llvm/include/llvm/ADT/APInt.h Tue Feb 27 12:22:31 2007 @@ -654,7 +654,7 @@ /// RoundDoubleToAPInt - This function convert a double value to an APInt value. /// @brief Converts the given double value into a APInt. -APInt RoundDoubleToAPInt(double Double); +APInt RoundDoubleToAPInt(double Double, uint32_t width = 64); /// RoundFloatToAPInt - Converts a float value into an APInt value. /// @brief Converts a float value into a APInt. From reid at x10sys.com Tue Feb 27 12:23:57 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 12:23:57 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702271823.l1RINv6U027610@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.52 -> 1.53 --- Log message: 1. Fix three serious bugs in the comparison code. 2. Change RoundDoubleToAPInt to take a bit width parameter. Use that parameter to limit the bit width of the result. --- Diffs of the changes: (+22 -18) APInt.cpp | 40 ++++++++++++++++++++++------------------ 1 files changed, 22 insertions(+), 18 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.52 llvm/lib/Support/APInt.cpp:1.53 --- llvm/lib/Support/APInt.cpp:1.52 Tue Feb 27 01:35:18 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 27 12:23:40 2007 @@ -540,7 +540,8 @@ return pVal[0] < RHS.pVal[0]; // Otherwise, compare all words - for (int i = whichWord(n1 - 1); i >= 0; --i) { + uint32_t topWord = whichWord(std::max(n1,n2)-1); + for (int i = topWord; i >= 0; --i) { if (pVal[i] > RHS.pVal[i]) return false; if (pVal[i] < RHS.pVal[i]) @@ -558,30 +559,28 @@ } APInt lhs(*this); - APInt rhs(*this); - bool lhsNegative = false; - bool rhsNegative = false; - if (lhs[BitWidth-1]) { - // Sign bit is set so make a note of it and perform two's complement - lhsNegative = true; + APInt rhs(RHS); + bool lhsNeg = isNegative(); + bool rhsNeg = rhs.isNegative(); + if (lhsNeg) { + // Sign bit is set so perform two's complement to make it positive lhs.flip(); lhs++; } - if (rhs[BitWidth-1]) { - // Sign bit is set so make a note of it and perform two's complement - rhsNegative = true; + if (rhsNeg) { + // Sign bit is set so perform two's complement to make it positive rhs.flip(); rhs++; } // Now we have unsigned values to compare so do the comparison if necessary // based on the negativeness of the values. - if (lhsNegative) - if (rhsNegative) - return !lhs.ult(rhs); + if (lhsNeg) + if (rhsNeg) + return lhs.ugt(rhs); else return true; - else if (rhsNegative) + else if (rhsNeg) return false; else return lhs.ult(rhs); @@ -797,7 +796,7 @@ return A; } -APInt llvm::APIntOps::RoundDoubleToAPInt(double Double) { +APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, uint32_t width) { union { double D; uint64_t I; @@ -819,11 +818,16 @@ // If the exponent doesn't shift all bits out of the mantissa if (exp < 52) - return isNeg ? -APInt(64u, mantissa >> (52 - exp)) : - APInt(64u, mantissa >> (52 - exp)); + return isNeg ? -APInt(width, mantissa >> (52 - exp)) : + APInt(width, mantissa >> (52 - exp)); + + // If the client didn't provide enough bits for us to shift the mantissa into + // then the result is undefined, just return 0 + if (width <= exp - 52) + return APInt(width, 0); // Otherwise, we have to shift the mantissa bits up to the right location - APInt Tmp(exp+1, mantissa); + APInt Tmp(width, mantissa); Tmp = Tmp.shl(exp - 52); return isNeg ? -Tmp : Tmp; } From rspencer at reidspencer.com Tue Feb 27 12:37:25 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 27 Feb 2007 10:37:25 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp In-Reply-To: <2C85D3EC-77BE-4746-AA46-DE89BBAB2261@apple.com> References: <200702270624.l1R6O7dJ000934@zion.cs.uiuc.edu> <2C85D3EC-77BE-4746-AA46-DE89BBAB2261@apple.com> Message-ID: <1172601445.3004.54.camel@bashful.x10sys.com> On Tue, 2007-02-27 at 09:08 -0800, Chris Lattner wrote: > On Feb 26, 2007, at 10:24 PM, Reid Spencer wrote: > > > case Instruction::FPToUI: > > - if (const ConstantFP *FPC = dyn_cast(V)) > > - return ConstantInt::get(DestTy,(uint64_t) FPC->getValue()); > > + if (const ConstantFP *FPC = dyn_cast(V)) { > > + APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue())); > > + uint32_t DestBitWidth = cast(DestTy)- > > >getBitWidth(); > > + if (Val.getBitWidth() > DestBitWidth) > > + Val.trunc(DestBitWidth); > > This seems like a poor choice of API. RoundDoubleToAPInt should take > a result bitwidth. Without this, this appears like it could make a > "large" APInt, then truncate it down to a small one when converting > from double, which is very inefficient. Done. > > > @@ -191,23 +206,37 @@ > > return 0; // Other pointer types cannot be > > casted > > case Instruction::UIToFP: > > if (const ConstantInt *CI = dyn_cast(V)) > > - return ConstantFP::get(DestTy, double(CI->getZExtValue())); > > + if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) > > + return ConstantFP::get(DestTy, CI->getValue().roundToDouble > > (false)); > > Why the check for APINT_BITS_PER_WORD here? APINT_BITS_PER_WORD is > an implementation detail of APInt, not a part of its public > interface. Actually it is part of the public interface and it needs to be. For example, the constructor that takes an array of words (as might be used by bcreader) needs to know how many bits are in those words. This constant tells you. > Also, please split the roundToDouble method into two > methods which don't take a bool. I don't understand this comment at all. What should these methods do differently? > > > return 0; > > case Instruction::SIToFP: > > if (const ConstantInt *CI = dyn_cast(V)) > > - return ConstantFP::get(DestTy, double(CI->getSExtValue())); > > + if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) > > + return ConstantFP::get(DestTy, CI->getValue().roundToDouble > > (true)); > > return 0; > > Likewise. > > > > > @@ -382,7 +412,7 @@ > > Ops.reserve(numOps); > > for (unsigned i = 0; i < numOps; ++i) { > > const Constant *Op = > > - (i == idxVal) ? Elt : Constant::getNullValue(Elt->getType()); > > + (idxVal == i) ? Elt : Constant::getNullValue(Elt->getType()); > > This sort of change makes the diff more noisy, and there is no > apparent reason for doing it. Generally, the mutating value (i) is > on the LHS, why do this (in many places)? Becasue there is no operator==(int, APInt) but there is an APInt::operator==(int). > > > > @@ -554,56 +585,66 @@ > > case Instruction::SDiv: > > + if (CI2->isNullValue()) > > + return 0; // X / 0 -> can't fold > > + return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); > > + if (C2V.isAllOnesValue() && C1V.isMinSignedValue()) > > + return 0; // MIN_INT / -1 -> overflow > > + return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); > > This isn't right, remove the first return. Typo .. nice catch .. thanks. > > > case Instruction::Shl: > > - return ConstantInt::get(C1->getType(), C1Val << C2Val); > > + if (uint32_t shiftAmt = C2V.getZExtValue()) > > + if (shiftAmt <= C1V.getBitWidth()) > > This should be <, not <=, likewise for other shifts. Right. > -Chris > > From criswell at cs.uiuc.edu Tue Feb 27 12:52:36 2007 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue, 27 Feb 2007 12:52:36 -0600 Subject: [llvm-commits] [see] CVS: llvm-poolalloc/lib/DSA/Local.cpp Message-ID: <200702271852.l1RIqaHf029070@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/DSA: Local.cpp updated: 1.158.2.4 -> 1.158.2.4.2.1 --- Log message: The llva_save_stackp() function returns the stack pointer. It should be marked with the incomplete, unknown, and stack flags. --- Diffs of the changes: (+3 -1) Local.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm-poolalloc/lib/DSA/Local.cpp diff -u llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4 llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4.2.1 --- llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4 Mon Jan 22 15:18:48 2007 +++ llvm-poolalloc/lib/DSA/Local.cpp Tue Feb 27 12:52:19 2007 @@ -1232,11 +1232,13 @@ if (DSNode *N = RetNH.getNode()) N->setModifiedMarker()->setReadMarker(); return true; -#if 0 +#if 1 } else if (F->getName() == "llva_save_stackp") { // Create a new DSNode for the memory returned by llva_save_stackp() DSNode *N = createNode(); N->setAllocaNodeMarker(); + N->setUnknownNodeMarker(); + N->setIncompleteMarker(); // // TODO: From reid at x10sys.com Tue Feb 27 13:22:53 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 13:22:53 -0600 Subject: [llvm-commits] CVS: llvm/test/Integer/a15.ll.out a17.ll.out a31.ll.out a33.ll.out a63.ll.out a7.ll.out a9.ll.out Message-ID: <200702271922.l1RJMrhF030002@zion.cs.uiuc.edu> Changes in directory llvm/test/Integer: a15.ll.out updated: 1.4 -> 1.5 a17.ll.out updated: 1.4 -> 1.5 a31.ll.out updated: 1.4 -> 1.5 a33.ll.out updated: 1.4 -> 1.5 a63.ll.out updated: 1.4 -> 1.5 a7.ll.out updated: 1.5 -> 1.6 a9.ll.out updated: 1.4 -> 1.5 --- Log message: Shifting by the bit width now produces undef, not 0. --- Diffs of the changes: (+7 -7) a15.ll.out | 2 +- a17.ll.out | 2 +- a31.ll.out | 2 +- a33.ll.out | 2 +- a63.ll.out | 2 +- a7.ll.out | 2 +- a9.ll.out | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) Index: llvm/test/Integer/a15.ll.out diff -u llvm/test/Integer/a15.ll.out:1.4 llvm/test/Integer/a15.ll.out:1.5 --- llvm/test/Integer/a15.ll.out:1.4 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a15.ll.out Tue Feb 27 13:22:36 2007 @@ -5,7 +5,7 @@ @e = constant i15 -1 ; [#uses=0] @f = constant i15 1 ; [#uses=0] @g = constant i15 3 ; [#uses=0] - at h = constant i15 0 ; [#uses=0] + at h = constant i15 undef ; [#uses=0] @i = constant i15 -16384 ; [#uses=0] @j = constant i15 1 ; [#uses=0] @l = constant i15 -1 ; [#uses=0] Index: llvm/test/Integer/a17.ll.out diff -u llvm/test/Integer/a17.ll.out:1.4 llvm/test/Integer/a17.ll.out:1.5 --- llvm/test/Integer/a17.ll.out:1.4 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a17.ll.out Tue Feb 27 13:22:36 2007 @@ -5,7 +5,7 @@ @e = constant i17 -1 ; [#uses=0] @f = constant i17 1 ; [#uses=0] @g = constant i17 3 ; [#uses=0] - at h = constant i17 0 ; [#uses=0] + at h = constant i17 undef ; [#uses=0] @i = constant i17 -65536 ; [#uses=0] @j = constant i17 1 ; [#uses=0] @l = constant i17 -1 ; [#uses=0] Index: llvm/test/Integer/a31.ll.out diff -u llvm/test/Integer/a31.ll.out:1.4 llvm/test/Integer/a31.ll.out:1.5 --- llvm/test/Integer/a31.ll.out:1.4 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a31.ll.out Tue Feb 27 13:22:36 2007 @@ -5,7 +5,7 @@ @e = constant i31 -1 ; [#uses=0] @f = constant i31 1 ; [#uses=0] @g = constant i31 3 ; [#uses=0] - at h = constant i31 0 ; [#uses=0] + at h = constant i31 undef ; [#uses=0] @i = constant i31 -1073741824 ; [#uses=0] @j = constant i31 1 ; [#uses=0] @l = constant i31 -1 ; [#uses=0] Index: llvm/test/Integer/a33.ll.out diff -u llvm/test/Integer/a33.ll.out:1.4 llvm/test/Integer/a33.ll.out:1.5 --- llvm/test/Integer/a33.ll.out:1.4 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a33.ll.out Tue Feb 27 13:22:36 2007 @@ -5,7 +5,7 @@ @e = constant i33 -1 ; [#uses=0] @f = constant i33 1 ; [#uses=0] @g = constant i33 3 ; [#uses=0] - at h = constant i33 0 ; [#uses=0] + at h = constant i33 undef ; [#uses=0] @i = constant i33 -4294967296 ; [#uses=0] @j = constant i33 1 ; [#uses=0] @l = constant i33 -1 ; [#uses=0] Index: llvm/test/Integer/a63.ll.out diff -u llvm/test/Integer/a63.ll.out:1.4 llvm/test/Integer/a63.ll.out:1.5 --- llvm/test/Integer/a63.ll.out:1.4 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a63.ll.out Tue Feb 27 13:22:36 2007 @@ -5,7 +5,7 @@ @e = constant i63 -1 ; [#uses=0] @f = constant i63 1 ; [#uses=0] @g = constant i63 3 ; [#uses=0] - at h = constant i63 0 ; [#uses=0] + at h = constant i63 undef ; [#uses=0] @i = constant i63 -4611686018427387904 ; [#uses=0] @j = constant i63 1 ; [#uses=0] @l = constant i63 -1 ; [#uses=0] Index: llvm/test/Integer/a7.ll.out diff -u llvm/test/Integer/a7.ll.out:1.5 llvm/test/Integer/a7.ll.out:1.6 --- llvm/test/Integer/a7.ll.out:1.5 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a7.ll.out Tue Feb 27 13:22:36 2007 @@ -8,7 +8,7 @@ @g = constant i7 3 ; [#uses=0] @r = constant i7 5 ; [#uses=0] @s = constant i7 5 ; [#uses=0] - at h = constant i7 0 ; [#uses=0] + at h = constant i7 undef ; [#uses=0] @i = constant i7 -64 ; [#uses=0] @j = constant i7 1 ; [#uses=0] @l = constant i7 -1 ; [#uses=0] Index: llvm/test/Integer/a9.ll.out diff -u llvm/test/Integer/a9.ll.out:1.4 llvm/test/Integer/a9.ll.out:1.5 --- llvm/test/Integer/a9.ll.out:1.4 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a9.ll.out Tue Feb 27 13:22:36 2007 @@ -5,7 +5,7 @@ @e = constant i9 -1 ; [#uses=0] @f = constant i9 1 ; [#uses=0] @g = constant i9 3 ; [#uses=0] - at h = constant i9 0 ; [#uses=0] + at h = constant i9 undef ; [#uses=0] @i = constant i9 -256 ; [#uses=0] @j = constant i9 1 ; [#uses=0] @l = constant i9 -1 ; [#uses=0] From reid at x10sys.com Tue Feb 27 13:26:57 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 13:26:57 -0600 Subject: [llvm-commits] CVS: llvm/test/Integer/a1.ll a1.ll.out Message-ID: <200702271926.l1RJQvWr030078@zion.cs.uiuc.edu> Changes in directory llvm/test/Integer: a1.ll updated: 1.5 -> 1.6 a1.ll.out updated: 1.4 -> 1.5 --- Log message: Update for constant folding now generating undef and overflow correctly. --- Diffs of the changes: (+8 -8) a1.ll | 6 +++--- a1.ll.out | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) Index: llvm/test/Integer/a1.ll diff -u llvm/test/Integer/a1.ll:1.5 llvm/test/Integer/a1.ll:1.6 --- llvm/test/Integer/a1.ll:1.5 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a1.ll Tue Feb 27 13:26:40 2007 @@ -10,14 +10,14 @@ @f = constant i1 sub(i1 1 , i1 -1) @g = constant i1 sub(i1 1 , i1 1) - at h = constant i1 shl(i1 1 , i1 1) + at h = constant i1 shl(i1 1 , i1 1) ; undefined @i = constant i1 shl(i1 1 , i1 0) @j = constant i1 lshr(i1 1, i1 1) ; undefined @m = constant i1 ashr(i1 1, i1 1) ; undefined @n = constant i1 mul(i1 -1, i1 1) - at o = constant i1 sdiv(i1 -1, i1 1) - at p = constant i1 sdiv(i1 1 , i1 -1) + at o = constant i1 sdiv(i1 -1, i1 1) ; overflow + at p = constant i1 sdiv(i1 1 , i1 -1); overflow @q = constant i1 udiv(i1 -1, i1 1) @r = constant i1 udiv(i1 1, i1 -1) @s = constant i1 srem(i1 -1, i1 1) ; overflow Index: llvm/test/Integer/a1.ll.out diff -u llvm/test/Integer/a1.ll.out:1.4 llvm/test/Integer/a1.ll.out:1.5 --- llvm/test/Integer/a1.ll.out:1.4 Mon Feb 26 20:34:02 2007 +++ llvm/test/Integer/a1.ll.out Tue Feb 27 13:26:40 2007 @@ -5,13 +5,13 @@ @e = constant i1 false ; [#uses=0] @f = constant i1 false ; [#uses=0] @g = constant i1 false ; [#uses=0] - at h = constant i1 false ; [#uses=0] + at h = constant i1 undef ; [#uses=0] @i = constant i1 true ; [#uses=0] - at j = constant i1 false ; [#uses=0] - at m = constant i1 false ; [#uses=0] + at j = constant i1 undef ; [#uses=0] + at m = constant i1 undef ; [#uses=0] @n = constant i1 true ; [#uses=0] - at o = constant i1 true ; [#uses=0] - at p = constant i1 true ; [#uses=0] + at o = constant i1 sdiv (i1 true, i1 true) ; [#uses=0] + at p = constant i1 sdiv (i1 true, i1 true) ; [#uses=0] @q = constant i1 true ; [#uses=0] @r = constant i1 true ; [#uses=0] @s = constant i1 srem (i1 true, i1 true) ; [#uses=0] From reid at x10sys.com Tue Feb 27 13:30:11 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 13:30:11 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp Message-ID: <200702271930.l1RJUBkS030149@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ConstantFold.cpp updated: 1.140 -> 1.141 --- Log message: For PR1205: http://llvm.org/PR1205 : Implement review feedback: 1. Use new APInt::RoundDoubleToAPInt interface to specify the bit width so that we don't have to truncate or extend in constant folding. 2. Fix a pasteo in SDiv that prevented a check for overflow. 3. Fix the shift operators: undef happens when the shift amount is equal to the bitwidth. --- Diffs of the changes: (+5 -14) ConstantFold.cpp | 19 +++++-------------- 1 files changed, 5 insertions(+), 14 deletions(-) Index: llvm/lib/VMCore/ConstantFold.cpp diff -u llvm/lib/VMCore/ConstantFold.cpp:1.140 llvm/lib/VMCore/ConstantFold.cpp:1.141 --- llvm/lib/VMCore/ConstantFold.cpp:1.140 Tue Feb 27 00:23:51 2007 +++ llvm/lib/VMCore/ConstantFold.cpp Tue Feb 27 13:29:54 2007 @@ -176,23 +176,15 @@ return 0; // Can't fold. case Instruction::FPToUI: if (const ConstantFP *FPC = dyn_cast(V)) { - APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue())); uint32_t DestBitWidth = cast(DestTy)->getBitWidth(); - if (Val.getBitWidth() > DestBitWidth) - Val.trunc(DestBitWidth); - else if (Val.getBitWidth() < DestBitWidth) - Val.zext(DestBitWidth); + APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue(), DestBitWidth)); return ConstantInt::get(DestTy, Val); } return 0; // Can't fold. case Instruction::FPToSI: if (const ConstantFP *FPC = dyn_cast(V)) { - APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue())); uint32_t DestBitWidth = cast(DestTy)->getBitWidth(); - if (Val.getBitWidth() > DestBitWidth) - Val.trunc(DestBitWidth); - else if (Val.getBitWidth() < DestBitWidth) - Val.sext(DestBitWidth); + APInt Val(APIntOps::RoundDoubleToAPInt(FPC->getValue(), DestBitWidth)); return ConstantInt::get(DestTy, Val); } return 0; // Can't fold. @@ -604,7 +596,6 @@ case Instruction::SDiv: if (CI2->isNullValue()) return 0; // X / 0 -> can't fold - return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); if (C2V.isAllOnesValue() && C1V.isMinSignedValue()) return 0; // MIN_INT / -1 -> overflow return ConstantInt::get(C1->getType(), C1V.sdiv(C2V)); @@ -626,21 +617,21 @@ return ConstantInt::get(C1->getType(), C1V ^ C2V); case Instruction::Shl: if (uint32_t shiftAmt = C2V.getZExtValue()) - if (shiftAmt <= C1V.getBitWidth()) + if (shiftAmt < C1V.getBitWidth()) return ConstantInt::get(C1->getType(), C1V.shl(shiftAmt)); else return UndefValue::get(C1->getType()); // too big shift is undef return const_cast(CI1); // Zero shift is identity case Instruction::LShr: if (uint32_t shiftAmt = C2V.getZExtValue()) - if (shiftAmt <= C1V.getBitWidth()) + if (shiftAmt < C1V.getBitWidth()) return ConstantInt::get(C1->getType(), C1V.lshr(shiftAmt)); else return UndefValue::get(C1->getType()); // too big shift is undef return const_cast(CI1); // Zero shift is identity case Instruction::AShr: if (uint32_t shiftAmt = C2V.getZExtValue()) - if (shiftAmt <= C1V.getBitWidth()) + if (shiftAmt < C1V.getBitWidth()) return ConstantInt::get(C1->getType(), C1V.ashr(shiftAmt)); else return UndefValue::get(C1->getType()); // too big shift is undef From reid at x10sys.com Tue Feb 27 13:31:26 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 13:31:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702271931.l1RJVQna030181@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.53 -> 1.54 --- Log message: Conform to single person attribution in file comment. --- Diffs of the changes: (+2 -3) APInt.cpp | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.53 llvm/lib/Support/APInt.cpp:1.54 --- llvm/lib/Support/APInt.cpp:1.53 Tue Feb 27 12:23:40 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 27 13:31:09 2007 @@ -2,9 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Sheng Zhou and Reid Spencer and is distributed -// under the University of Illinois Open Source License. See LICENSE.TXT -// for details. +// This file was developed by Sheng Zhou and is distributed under the +// University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // From rspencer at reidspencer.com Tue Feb 27 13:34:52 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 27 Feb 2007 11:34:52 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp In-Reply-To: References: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> Message-ID: <1172604892.3004.58.camel@bashful.x10sys.com> On Tue, 2007-02-27 at 09:10 -0800, Chris Lattner wrote: > > Index: llvm/lib/VMCore/Constants.cpp > > diff -u llvm/lib/VMCore/Constants.cpp:1.222 llvm/lib/VMCore/ > > Constants.cpp:1.223 > > --- llvm/lib/VMCore/Constants.cpp:1.222 Mon Feb 26 21:05:06 2007 > > +++ llvm/lib/VMCore/Constants.cpp Tue Feb 27 01:57:53 2007 > > @@ -118,7 +118,7 @@ > > if (ITy->getBitWidth() == 1) > > return ConstantInt::getTrue(); > > else > > - return ConstantInt::get(Ty, int64_t(-1)); > > + return ConstantInt::get(Ty, APInt::getAllOnesValue(ITy- > > >getBitWidth())); > > return 0; > > } > > The special case for 'i1' can be removed, right? I assumed the special case was because of this mess: > ConstantInt *ConstantInt::TheTrueVal = 0; > ConstantInt *ConstantInt::TheFalseVal = 0; > > namespace llvm { > void CleanupTrueFalse(void *) { > ConstantInt::ResetTrueFalse(); > } > } > > static ManagedCleanup TrueFalseCleanup; > > ConstantInt *ConstantInt::CreateTrueFalseVals(bool WhichOne) { > assert(TheTrueVal == 0 && TheFalseVal == 0); > TheTrueVal = get(Type::Int1Ty, 1); > TheFalseVal = get(Type::Int1Ty, 0); > > // Ensure that llvm_shutdown nulls out TheTrueVal/TheFalseVal. > TrueFalseCleanup.Register(); > > return WhichOne ? TheTrueVal : TheFalseVal; > } why do we need this? > > -Chris From reid at x10sys.com Tue Feb 27 14:13:54 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 14:13:54 -0600 Subject: [llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp Message-ID: <200702272013.l1RKDsLR030996@zion.cs.uiuc.edu> Changes in directory llvm-test/SingleSource/UnitTests/Integer/APInt: arith.cpp updated: 1.11 -> 1.12 --- Log message: Update for changes in APInt interface. --- Diffs of the changes: (+30 -24) arith.cpp | 54 ++++++++++++++++++++++++++++++------------------------ 1 files changed, 30 insertions(+), 24 deletions(-) Index: llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp:1.11 llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp:1.12 --- llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp:1.11 Tue Feb 20 14:39:34 2007 +++ llvm-test/SingleSource/UnitTests/Integer/APInt/arith.cpp Tue Feb 27 14:13:37 2007 @@ -10,6 +10,8 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/APInt.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/ManagedStatic.h" #include #include @@ -19,8 +21,12 @@ APInt y(21, 0x0fffff); void print(const APInt& X, bool wantSigned = false, bool withNL = true) { - std::string decstr = X.toString(10,wantSigned); - std::string hexstr = X.toString(16,false); + std::string decstr; + if (wantSigned) + decstr = X.toStringSigned(10); + else + decstr = X.toString(10); + std::string hexstr = X.toString(16); printf("%s (%s)", decstr.c_str(), hexstr.c_str()); if (withNL) printf("\n"); @@ -41,10 +47,10 @@ unsigned bitwidth = val.getBitWidth(); unsigned pos = rand() % bitwidth; printf("val[%u] = %d\n", pos, val[pos]); - APInt smax(APInt::getMaxValue(bitwidth, true)); - APInt umax(APInt::getMaxValue(bitwidth, false)); - APInt smin(APInt::getMinValue(bitwidth, true)); - APInt umin(APInt::getMinValue(bitwidth, false)); + APInt smax(APInt::getSignedMaxValue(bitwidth)); + APInt umax(APInt::getMaxValue(bitwidth)); + APInt smin(APInt::getSignedMinValue(bitwidth)); + APInt umin(APInt::getMinValue(bitwidth)); printf("APInt::getMinValue(%d, true) = ", bitwidth); print(smin,true); printf("APInt::getMaxValue(%d, true) = ", bitwidth); print(smax,true); printf("APInt::getMinValue(%d, false) = ", bitwidth); print(umin); @@ -104,13 +110,15 @@ x = val.byteSwap(); printf("val.byteSwap() = "); print(x); } - printf("val.roundToDouble(false) = %f\n", val.roundToDouble(false)); - printf("val.roundToDouble(true) = %f\n", val.roundToDouble(true)); + printf("val.roundToDouble() = %f\n", val.roundToDouble()); + printf("val.signedRoundToDouble() = %f\n", val.signedRoundToDouble()); printf("val.getValue() = "); if (val.getBitWidth() > 64) printf("too wide\n"); - else - printf("%lu\n", val.getValue()); + else { + printf("%lu\n", val.getZExtValue()); + printf("%ld\n", val.getSExtValue()); + } } void test_binops(const APInt &v1, const APInt &v2) { @@ -184,7 +192,7 @@ void test_multiple() { srand(0); - for (unsigned bits = 1; bits <= 256; ++bits) { + for (unsigned bits = 257; bits <= 257; ++bits) { printf("\nTEST CASE: %d BITS\n\n", bits); APInt zero(bits,0); APInt one(bits,1); @@ -199,12 +207,13 @@ } APInt two(bits,1); APInt three(bits,1); - APInt min = APInt::getMinValue(bits, true); - APInt max = APInt::getMaxValue(bits, true); + APInt min = APInt::getSignedMinValue(bits); + APInt max = APInt::getSignedMaxValue(bits); APInt mid = APIntOps::lshr(max, bits/2); APInt r1 = randomAPInt(bits); APInt r2 = randomAPInt(bits); - APInt *list[9]; + APInt r3 = randomAPInt(bits); + APInt *list[10]; list[0] = &zero; list[1] = &one; list[2] = &two; @@ -214,26 +223,23 @@ list[6] = ∣ list[7] = &r2; list[8] = &max; - for (unsigned i = 0; i < 9; ++i) { + list[9] = &r3; + for (unsigned i = 0; i < 10; ++i) { test_interface(*(list[i])); test_unops(*(list[i])); } - for (unsigned i = 0; i < 9; ++i) { - for (unsigned j = 0; j < 9; ++j) { + for (unsigned i = 0; i < 10; ++i) { + for (unsigned j = 0; j < 10; ++j) { test_binops(*(list[i]), *(list[j])); } } } } -int main() +int main(int argc, char** argv) { - APInt X(48, 100); - APInt Y(48, 10); - APInt Q(1,0); - APInt R(1,0); - APInt::divide(X, 1, Y, 1, &Q, &R); + cl::ParseCommandLineOptions(argc, argv, "APInt arithmetic test\n"); test_multiple(); + llvm_shutdown(); return 0; } - From reid at x10sys.com Tue Feb 27 14:24:49 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 14:24:49 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702272024.l1RKOn9h031222@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.25 -> 1.26 --- Log message: Improve APInt interface: 1. Add unsigned and signed versions of methods so a "bool" argument doesn't need to be passed in. 2. Make the various getMin/getMax functions all be inline since they are so simple. 3. Simplify sdiv and srem code. --- Diffs of the changes: (+67 -22) APInt.h | 89 ++++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 67 insertions(+), 22 deletions(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.25 llvm/include/llvm/ADT/APInt.h:1.26 --- llvm/include/llvm/ADT/APInt.h:1.25 Tue Feb 27 12:22:31 2007 +++ llvm/include/llvm/ADT/APInt.h Tue Feb 27 14:24:31 2007 @@ -59,7 +59,6 @@ /// /// @brief Class for arbitrary precision integers. class APInt { -public: uint32_t BitWidth; ///< The number of bits in this APInt. @@ -374,8 +373,8 @@ /// Signed divide this APInt by APInt RHS. /// @brief Signed division function for APInt. inline APInt sdiv(const APInt& RHS) const { - bool isNegativeLHS = (*this)[BitWidth - 1]; - bool isNegativeRHS = RHS[RHS.BitWidth - 1]; + bool isNegativeLHS = isNegative(); + bool isNegativeRHS = RHS.isNegative(); APInt Result = APIntOps::udiv( isNegativeLHS ? -(*this) : (*this), isNegativeRHS ? -RHS : RHS); return isNegativeLHS != isNegativeRHS ? -Result : Result; @@ -388,8 +387,8 @@ /// Signed remainder operation on APInt. /// @brief Function for signed remainder operation. inline APInt srem(const APInt& RHS) const { - bool isNegativeLHS = (*this)[BitWidth - 1]; - bool isNegativeRHS = RHS[RHS.BitWidth - 1]; + bool isNegativeLHS = isNegative(); + bool isNegativeRHS = RHS.isNegative(); APInt Result = APIntOps::urem( isNegativeLHS ? -(*this) : (*this), isNegativeRHS ? -RHS : RHS); return isNegativeLHS ? -Result : Result; @@ -470,24 +469,37 @@ return int64_t(pVal[0]); } - /// @returns the largest value for an APInt of the specified bit-width and - /// if isSign == true, it should be largest signed value, otherwise largest - /// unsigned value. - /// @brief Gets max value of the APInt with bitwidth <= 64. - static APInt getMaxValue(uint32_t numBits, bool isSigned); - - /// @returns the smallest value for an APInt of the given bit-width and - /// if isSign == true, it should be smallest signed value, otherwise zero. - /// @brief Gets min value of the APInt with bitwidth <= 64. - static APInt getMinValue(uint32_t numBits, bool isSigned); + /// @brief Gets maximum unsigned value of APInt for specific bit width. + static APInt getMaxValue(uint32_t numBits) { + return APInt(numBits, 0).set(); + } + + /// @brief Gets maximum signed value of APInt for a specific bit width. + static APInt getSignedMaxValue(uint32_t numBits) { + return APInt(numBits, 0).set().clear(numBits - 1); + } + + /// @brief Gets minimum unsigned value of APInt for a specific bit width. + static APInt getMinValue(uint32_t numBits) { + return APInt(numBits, 0); + } + + /// @brief Gets minimum signed value of APInt for a specific bit width. + static APInt getSignedMinValue(uint32_t numBits) { + return APInt(numBits, 0).set(numBits - 1); + } /// @returns the all-ones value for an APInt of the specified bit-width. /// @brief Get the all-ones value. - static APInt getAllOnesValue(uint32_t numBits); + static APInt getAllOnesValue(uint32_t numBits) { + return APInt(numBits, 0).set(); + } /// @returns the '0' value for an APInt of the specified bit-width. /// @brief Get the '0' value. - static APInt getNullValue(uint32_t numBits); + static APInt getNullValue(uint32_t numBits) { + return APInt(numBits, 0); + } /// The hash value is computed as the sum of the words and the bit width. /// @returns A hash value computed from the sum of the APInt words. @@ -536,8 +548,25 @@ isNegative() && countPopulation() == 1; } - /// @returns a character interpretation of the APInt. - std::string toString(uint8_t radix = 10, bool wantSigned = true) const; + /// This is used internally to convert an APInt to a string. + /// @brief Converts an APInt to a std::string + std::string toString(uint8_t radix, bool wantSigned) const; + + /// Considers the APInt to be unsigned and converts it into a string in the + /// radix given. The radix can be 2, 8, 10 or 16. + /// @returns a character interpretation of the APInt + /// @brief Convert unsigned APInt to string representation. + inline std::string toString(uint8_t radix = 10) const { + return toString(radix, false); + } + + /// Considers the APInt to be unsigned and converts it into a string in the + /// radix given. The radix can be 2, 8, 10 or 16. + /// @returns a character interpretation of the APInt + /// @brief Convert unsigned APInt to string representation. + inline std::string toStringSigned(uint8_t radix = 10) const { + return toString(radix, true); + } /// Get an APInt with the same BitWidth as this APInt, just zero mask /// the low bits and right shift to the least significant bit. @@ -603,8 +632,17 @@ } /// @brief Converts this APInt to a double value. - double roundToDouble(bool isSigned = false) const; + double roundToDouble(bool isSigned) const; + + /// @brief Converts this unsigned APInt to a double value. + double roundToDouble() const { + return roundToDouble(false); + } + /// @brief Converts this signed APInt to a double value. + double signedRoundToDouble() const { + return roundToDouble(true); + } }; namespace APIntOps { @@ -642,9 +680,16 @@ /// @brief Compute GCD of two APInt values. APInt GreatestCommonDivisor(const APInt& Val1, const APInt& Val2); +/// Treats the APInt as an unsigned value for conversion purposes. +/// @brief Converts the given APInt to a double value. +inline double RoundAPIntToDouble(const APInt& APIVal) { + return APIVal.roundToDouble(); +} + +/// Treats the APInt as a signed value for conversion purposes. /// @brief Converts the given APInt to a double value. -inline double RoundAPIntToDouble(const APInt& APIVal, bool isSigned = false) { - return APIVal.roundToDouble(isSigned); +inline double RoundSignedAPIntToDouble(const APInt& APIVal) { + return APIVal.signedRoundToDouble(); } /// @brief Converts the given APInt to a float vlalue. From reid at x10sys.com Tue Feb 27 14:24:49 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 14:24:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702272024.l1RKOnCA031228@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.54 -> 1.55 --- Log message: Improve APInt interface: 1. Add unsigned and signed versions of methods so a "bool" argument doesn't need to be passed in. 2. Make the various getMin/getMax functions all be inline since they are so simple. 3. Simplify sdiv and srem code. --- Diffs of the changes: (+1 -34) APInt.cpp | 35 +---------------------------------- 1 files changed, 1 insertion(+), 34 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.54 llvm/lib/Support/APInt.cpp:1.55 --- llvm/lib/Support/APInt.cpp:1.54 Tue Feb 27 13:31:09 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 27 14:24:31 2007 @@ -654,39 +654,6 @@ return *this; } -/// getMaxValue - This function returns the largest value -/// for an APInt of the specified bit-width and if isSign == true, -/// it should be largest signed value, otherwise unsigned value. -APInt APInt::getMaxValue(uint32_t numBits, bool isSign) { - APInt Result(numBits, 0); - Result.set(); - if (isSign) - Result.clear(numBits - 1); - return Result; -} - -/// getMinValue - This function returns the smallest value for -/// an APInt of the given bit-width and if isSign == true, -/// it should be smallest signed value, otherwise zero. -APInt APInt::getMinValue(uint32_t numBits, bool isSign) { - APInt Result(numBits, 0); - if (isSign) - Result.set(numBits - 1); - return Result; -} - -/// getAllOnesValue - This function returns an all-ones value for -/// an APInt of the specified bit-width. -APInt APInt::getAllOnesValue(uint32_t numBits) { - return getMaxValue(numBits, false); -} - -/// getNullValue - This function creates an '0' value for an -/// APInt of the specified bit-width. -APInt APInt::getNullValue(uint32_t numBits) { - return getMinValue(numBits, false); -} - uint64_t APInt::getHashValue() const { // Put the bit width into the low order bits. uint64_t hash = BitWidth; @@ -1734,6 +1701,6 @@ else for (unsigned i = getNumWords(); i > 0; i--) { cerr << pVal[i-1] << " "; } - cerr << " (" << this->toString(10, false) << ")\n" << std::setbase(10); + cerr << " (" << this->toString(10) << ")\n" << std::setbase(10); } #endif From reid at x10sys.com Tue Feb 27 14:25:41 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 14:25:41 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp ConstantFold.cpp Message-ID: <200702272025.l1RKPfxO031255@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AsmWriter.cpp updated: 1.262 -> 1.263 ConstantFold.cpp updated: 1.141 -> 1.142 --- Log message: Adjust to changes in the APInt interface. --- Diffs of the changes: (+5 -5) AsmWriter.cpp | 2 +- ConstantFold.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) Index: llvm/lib/VMCore/AsmWriter.cpp diff -u llvm/lib/VMCore/AsmWriter.cpp:1.262 llvm/lib/VMCore/AsmWriter.cpp:1.263 --- llvm/lib/VMCore/AsmWriter.cpp:1.262 Tue Feb 27 02:34:09 2007 +++ llvm/lib/VMCore/AsmWriter.cpp Tue Feb 27 14:25:25 2007 @@ -464,7 +464,7 @@ if (CI->getType() == Type::Int1Ty) Out << (CI->getZExtValue() ? "true" : "false"); else - Out << CI->getValue().toString(10,/*wantSigned=*/true); + Out << CI->getValue().toStringSigned(10); } else if (const ConstantFP *CFP = dyn_cast(CV)) { // We would like to output the FP constant value in exponential notation, // but we cannot do this if doing so will lose precision. Check here to Index: llvm/lib/VMCore/ConstantFold.cpp diff -u llvm/lib/VMCore/ConstantFold.cpp:1.141 llvm/lib/VMCore/ConstantFold.cpp:1.142 --- llvm/lib/VMCore/ConstantFold.cpp:1.141 Tue Feb 27 13:29:54 2007 +++ llvm/lib/VMCore/ConstantFold.cpp Tue Feb 27 14:25:25 2007 @@ -198,13 +198,13 @@ return 0; // Other pointer types cannot be casted case Instruction::UIToFP: if (const ConstantInt *CI = dyn_cast(V)) - if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) - return ConstantFP::get(DestTy, CI->getValue().roundToDouble(false)); + if (CI->getType()->getBitWidth() <= 64) + return ConstantFP::get(DestTy, CI->getValue().roundToDouble()); return 0; case Instruction::SIToFP: if (const ConstantInt *CI = dyn_cast(V)) - if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) - return ConstantFP::get(DestTy, CI->getValue().roundToDouble(true)); + if (CI->getType()->getBitWidth() <= 64) + return ConstantFP::get(DestTy, CI->getValue().signedRoundToDouble()); return 0; case Instruction::ZExt: if (const ConstantInt *CI = dyn_cast(V)) { From sabre at nondot.org Tue Feb 27 14:43:54 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 14:43:54 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CodeGenTarget.cpp Record.cpp Record.h TableGen.cpp Message-ID: <200702272043.l1RKhsth031592@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CodeGenTarget.cpp updated: 1.82 -> 1.83 Record.cpp updated: 1.55 -> 1.56 Record.h updated: 1.59 -> 1.60 TableGen.cpp updated: 1.47 -> 1.48 --- Log message: initial support for calling convention generation, still unfinished. --- Diffs of the changes: (+18 -7) CodeGenTarget.cpp | 8 ++------ Record.cpp | 7 +++++++ Record.h | 2 ++ TableGen.cpp | 8 +++++++- 4 files changed, 18 insertions(+), 7 deletions(-) Index: llvm/utils/TableGen/CodeGenTarget.cpp diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.82 llvm/utils/TableGen/CodeGenTarget.cpp:1.83 --- llvm/utils/TableGen/CodeGenTarget.cpp:1.82 Fri Jan 26 11:29:20 2007 +++ llvm/utils/TableGen/CodeGenTarget.cpp Tue Feb 27 14:43:37 2007 @@ -604,9 +604,7 @@ // Parse the list of argument types. ListInit *TypeList = R->getValueAsListInit("Types"); for (unsigned i = 0, e = TypeList->getSize(); i != e; ++i) { - DefInit *DI = dynamic_cast(TypeList->getElement(i)); - assert(DI && "Invalid list type!"); - Record *TyEl = DI->getDef(); + Record *TyEl = TypeList->getElementAsRecord(i); assert(TyEl->isSubClassOf("LLVMType") && "Expected a type!"); ArgTypes.push_back(TyEl->getValueAsString("TypeVal")); @@ -620,9 +618,7 @@ // Parse the intrinsic properties. ListInit *PropList = R->getValueAsListInit("Properties"); for (unsigned i = 0, e = PropList->getSize(); i != e; ++i) { - DefInit *DI = dynamic_cast(PropList->getElement(i)); - assert(DI && "Invalid list type!"); - Record *Property = DI->getDef(); + Record *Property = PropList->getElementAsRecord(i); assert(Property->isSubClassOf("IntrinsicProperty") && "Expected a property!"); Index: llvm/utils/TableGen/Record.cpp diff -u llvm/utils/TableGen/Record.cpp:1.55 llvm/utils/TableGen/Record.cpp:1.56 --- llvm/utils/TableGen/Record.cpp:1.55 Thu Dec 7 16:21:48 2006 +++ llvm/utils/TableGen/Record.cpp Tue Feb 27 14:43:37 2007 @@ -337,6 +337,13 @@ return new ListInit(Vals); } +Record *ListInit::getElementAsRecord(unsigned i) const { + assert(i < Values.size() && "List element index out of range!"); + DefInit *DI = dynamic_cast(Values[i]); + if (DI == 0) throw "Expected record in list!"; + return DI->getDef(); +} + Init *ListInit::resolveReferences(Record &R, const RecordVal *RV) { std::vector Resolved; Resolved.reserve(getSize()); Index: llvm/utils/TableGen/Record.h diff -u llvm/utils/TableGen/Record.h:1.59 llvm/utils/TableGen/Record.h:1.60 --- llvm/utils/TableGen/Record.h:1.59 Thu Dec 7 16:21:48 2006 +++ llvm/utils/TableGen/Record.h Tue Feb 27 14:43:37 2007 @@ -626,6 +626,8 @@ return Values[i]; } + Record *getElementAsRecord(unsigned i) const; + Init *convertInitListSlice(const std::vector &Elements); virtual Init *convertInitializerTo(RecTy *Ty) { Index: llvm/utils/TableGen/TableGen.cpp diff -u llvm/utils/TableGen/TableGen.cpp:1.47 llvm/utils/TableGen/TableGen.cpp:1.48 --- llvm/utils/TableGen/TableGen.cpp:1.47 Thu Dec 7 16:21:48 2006 +++ llvm/utils/TableGen/TableGen.cpp Tue Feb 27 14:43:37 2007 @@ -20,6 +20,7 @@ #include "llvm/Support/Streams.h" #include "llvm/System/Signals.h" #include "llvm/Support/FileUtilities.h" +#include "CallingConvEmitter.h" #include "CodeEmitterGen.h" #include "RegisterInfoEmitter.h" #include "InstrInfoEmitter.h" @@ -38,6 +39,7 @@ GenEmitter, GenRegisterEnums, GenRegister, GenRegisterHeader, GenInstrEnums, GenInstrs, GenAsmWriter, + GenCallingConv, GenDAGISel, GenSubtarget, GenIntrinsic, @@ -61,6 +63,8 @@ "Generate enum values for instructions"), clEnumValN(GenInstrs, "gen-instr-desc", "Generate instruction descriptions"), + clEnumValN(GenCallingConv, "gen-callingconv", + "Generate calling convention descriptions"), clEnumValN(GenAsmWriter, "gen-asm-writer", "Generate assembly writer"), clEnumValN(GenDAGISel, "gen-dag-isel", @@ -138,7 +142,9 @@ case GenInstrs: InstrInfoEmitter(Records).run(*Out); break; - + case GenCallingConv: + CallingConvEmitter(Records).run(*Out); + break; case GenAsmWriter: AsmWriterEmitter(Records).run(*Out); break; From sabre at nondot.org Tue Feb 27 14:44:29 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 14:44:29 -0600 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200702272044.l1RKiTtD031686@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.426 -> 1.427 --- Log message: target for generating CC info --- Diffs of the changes: (+5 -0) Makefile.rules | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.426 llvm/Makefile.rules:1.427 --- llvm/Makefile.rules:1.426 Fri Feb 9 11:09:14 2007 +++ llvm/Makefile.rules Tue Feb 27 14:44:12 2007 @@ -1275,6 +1275,11 @@ $(Echo) "Building $( Changes in directory llvm/lib/Target/X86: Makefile updated: 1.31 -> 1.32 --- Log message: build cc info --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/Makefile diff -u llvm/lib/Target/X86/Makefile:1.31 llvm/lib/Target/X86/Makefile:1.32 --- llvm/lib/Target/X86/Makefile:1.31 Fri Oct 27 19:48:27 2006 +++ llvm/lib/Target/X86/Makefile Tue Feb 27 14:44:31 2007 @@ -15,6 +15,6 @@ X86GenRegisterInfo.inc X86GenInstrNames.inc \ X86GenInstrInfo.inc X86GenAsmWriter.inc \ X86GenAsmWriter1.inc X86GenDAGISel.inc \ - X86GenSubtarget.inc + X86GenCallingConv.inc X86GenSubtarget.inc include $(LEVEL)/Makefile.common From sabre at nondot.org Tue Feb 27 14:45:19 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 14:45:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetCallingConv.td Message-ID: <200702272045.l1RKjJk8031777@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetCallingConv.td updated: 1.1 -> 1.2 --- Log message: implement CCMatchIfCC in terms of CCMatchIf --- Diffs of the changes: (+4 -4) TargetCallingConv.td | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Target/TargetCallingConv.td diff -u llvm/lib/Target/TargetCallingConv.td:1.1 llvm/lib/Target/TargetCallingConv.td:1.2 --- llvm/lib/Target/TargetCallingConv.td:1.1 Mon Feb 26 23:57:32 2007 +++ llvm/lib/Target/TargetCallingConv.td Tue Feb 27 14:45:02 2007 @@ -23,7 +23,8 @@ /// CCMatchType - If the current argument is one of the specified types, apply /// Action A. -class CCMatchType VTs, CCAction A> : CCPredicateAction { +class CCMatchType vts, CCAction A> : CCPredicateAction { + list VTs = vts; } /// CCMatchIf - If the predicate matches, apply A. @@ -32,9 +33,8 @@ } /// CCMatchIfCC - Match of the current calling convention is 'CC'. -class CCMatchIfCC : CCPredicateAction { - string CallingConv = CC; -} +class CCMatchIfCC + : CCMatchIf {} /// CCAssignToReg - This action matches if there is a register in the specified /// list that is still available. If so, it assigns the value to the first From reid at x10sys.com Tue Feb 27 14:47:01 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 14:47:01 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/PowerPC/calls.ll Message-ID: <200702272047.l1RKl1eM031810@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/PowerPC: calls.ll updated: 1.4 -> 1.5 --- Log message: This test passes on x86/Linux now. --- Diffs of the changes: (+0 -1) calls.ll | 1 - 1 files changed, 1 deletion(-) Index: llvm/test/CodeGen/PowerPC/calls.ll diff -u llvm/test/CodeGen/PowerPC/calls.ll:1.4 llvm/test/CodeGen/PowerPC/calls.ll:1.5 --- llvm/test/CodeGen/PowerPC/calls.ll:1.4 Mon Feb 26 20:45:12 2007 +++ llvm/test/CodeGen/PowerPC/calls.ll Tue Feb 27 14:46:44 2007 @@ -3,7 +3,6 @@ ; RUN: llvm-upgrade < %s | llvm-as | llc -march=ppc32 | grep 'bl ' | wc -l | grep 2 && ; RUN: llvm-upgrade < %s | llvm-as | llc -march=ppc32 | grep 'bctrl' | wc -l | grep 1 && ; RUN: llvm-upgrade < %s | llvm-as | llc -march=ppc32 | grep 'bla ' | wc -l | grep 1 -; XFAIL: [0-9x]86-pc-linux.* declare void %foo() From reid at x10sys.com Tue Feb 27 14:48:36 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 14:48:36 -0600 Subject: [llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp Message-ID: <200702272048.l1RKmaLA031843@zion.cs.uiuc.edu> Changes in directory llvm-test/SingleSource/UnitTests/Integer/APInt: gptest.cpp updated: 1.6 -> 1.7 --- Log message: Adjust to changes in the APInt interface. --- Diffs of the changes: (+7 -3) gptest.cpp | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) Index: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.6 llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.7 --- llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.6 Tue Feb 27 11:58:33 2007 +++ llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp Tue Feb 27 14:48:20 2007 @@ -23,7 +23,11 @@ static int input = 0, output = 0; void print(const APInt& X, bool wantSigned = false, bool withNL = true) { - std::string decstr = X.toString(10,wantSigned); + std::string decstr; + if (wantSigned) + decstr = X.toStringSigned(10); + else + decstr = X.toString(10); printf("%s", decstr.c_str()); if (withNL) printf("\n"); @@ -367,8 +371,8 @@ APInt one(bits,1); APInt two(bits,2); APInt three(bits,3); - APInt min = APInt::getMinValue(bits, true); - APInt max = APInt::getMaxValue(bits, true); + APInt min = APInt::getSignedMinValue(bits); + APInt max = APInt::getSignedMaxValue(bits); APInt mid = APIntOps::lshr(max, bits/2); APInt r1 = randomAPInt(bits); APInt r2 = randomAPInt(bits); From rspencer at reidspencer.com Tue Feb 27 14:51:49 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 27 Feb 2007 12:51:49 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp In-Reply-To: <1172604892.3004.58.camel@bashful.x10sys.com> References: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> <1172604892.3004.58.camel@bashful.x10sys.com> Message-ID: <1172609509.3004.61.camel@bashful.x10sys.com> Chris, Can't we just change this part of ConstantInt: /// getTrue/getFalse - Return the singleton true/false values. static inline ConstantInt *getTrue() { if (TheTrueVal) return TheTrueVal; return CreateTrueFalseVals(true); } static inline ConstantInt *getFalse() { if (TheFalseVal) return TheFalseVal; return CreateTrueFalseVals(false); } into: /// getTrue/getFalse - Return the singleton true/false values. static inline ConstantInt *getTrue() { return get(Type::Int1Ty, 1); } static inline ConstantInt *getFalse() { return get(Type::Int1Ty, 0); } and get rid of all the special handling of true/false values? Or have we provided this simply as an optimization on frequently obtained integer values? Reid. On Tue, 2007-02-27 at 11:34 -0800, Reid Spencer wrote: > On Tue, 2007-02-27 at 09:10 -0800, Chris Lattner wrote: > > > Index: llvm/lib/VMCore/Constants.cpp > > > diff -u llvm/lib/VMCore/Constants.cpp:1.222 llvm/lib/VMCore/ > > > Constants.cpp:1.223 > > > --- llvm/lib/VMCore/Constants.cpp:1.222 Mon Feb 26 21:05:06 2007 > > > +++ llvm/lib/VMCore/Constants.cpp Tue Feb 27 01:57:53 2007 > > > @@ -118,7 +118,7 @@ > > > if (ITy->getBitWidth() == 1) > > > return ConstantInt::getTrue(); > > > else > > > - return ConstantInt::get(Ty, int64_t(-1)); > > > + return ConstantInt::get(Ty, APInt::getAllOnesValue(ITy- > > > >getBitWidth())); > > > return 0; > > > } > > > > The special case for 'i1' can be removed, right? > > I assumed the special case was because of this mess: > > > ConstantInt *ConstantInt::TheTrueVal = 0; > > ConstantInt *ConstantInt::TheFalseVal = 0; > > > > namespace llvm { > > void CleanupTrueFalse(void *) { > > ConstantInt::ResetTrueFalse(); > > } > > } > > > > static ManagedCleanup TrueFalseCleanup; > > > > ConstantInt *ConstantInt::CreateTrueFalseVals(bool WhichOne) { > > assert(TheTrueVal == 0 && TheFalseVal == 0); > > TheTrueVal = get(Type::Int1Ty, 1); > > TheFalseVal = get(Type::Int1Ty, 0); > > > > // Ensure that llvm_shutdown nulls out TheTrueVal/TheFalseVal. > > TrueFalseCleanup.Register(); > > > > return WhichOne ? TheTrueVal : TheFalseVal; > > } > > why do we need this? > > > > > -Chris > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From evan.cheng at apple.com Tue Feb 27 15:07:13 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:07:13 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/MachineInstr.h Message-ID: <200702272107.l1RL7Dng032253@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: MachineInstr.h updated: 1.213 -> 1.214 --- Log message: Pass IsImp, IsKill, and IsDead to ChangeToRegister. --- Diffs of the changes: (+5 -4) MachineInstr.h | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) Index: llvm/include/llvm/CodeGen/MachineInstr.h diff -u llvm/include/llvm/CodeGen/MachineInstr.h:1.213 llvm/include/llvm/CodeGen/MachineInstr.h:1.214 --- llvm/include/llvm/CodeGen/MachineInstr.h:1.213 Thu Feb 22 19:03:39 2007 +++ llvm/include/llvm/CodeGen/MachineInstr.h Tue Feb 27 15:06:57 2007 @@ -280,13 +280,14 @@ /// ChangeToRegister - Replace this operand with a new register operand of /// the specified value. If an operand is known to be an register already, /// the setReg method should be used. - void ChangeToRegister(unsigned Reg, bool isDef) { + void ChangeToRegister(unsigned Reg, bool isDef, bool isImp = false, + bool isKill = false, bool isDead = false) { opType = MO_Register; contents.RegNo = Reg; IsDef = isDef; - IsImp = false; - IsKill = false; - IsDead = false; + IsImp = isImp; + IsKill = isKill; + IsDead = isDead; } friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop) { From evan.cheng at apple.com Tue Feb 27 15:08:24 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:08:24 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/MRegisterInfo.h Message-ID: <200702272108.l1RL8ODD032309@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: MRegisterInfo.h updated: 1.97 -> 1.98 --- Log message: Let MRegisterInfo owns RegScavenger. --- Diffs of the changes: (+10 -9) MRegisterInfo.h | 19 ++++++++++--------- 1 files changed, 10 insertions(+), 9 deletions(-) Index: llvm/include/llvm/Target/MRegisterInfo.h diff -u llvm/include/llvm/Target/MRegisterInfo.h:1.97 llvm/include/llvm/Target/MRegisterInfo.h:1.98 --- llvm/include/llvm/Target/MRegisterInfo.h:1.97 Thu Feb 22 19:07:04 2007 +++ llvm/include/llvm/Target/MRegisterInfo.h Tue Feb 27 15:08:07 2007 @@ -23,14 +23,15 @@ namespace llvm { -class Type; +class BitVector; +class CalleeSavedInfo; class MachineFunction; class MachineInstr; class MachineLocation; class MachineMove; +class RegScavenger; class TargetRegisterClass; -class CalleeSavedInfo; -class BitVector; +class Type; /// TargetRegisterDesc - This record contains all of the information known about /// a particular register. The AliasSet field (if not null) contains a pointer @@ -213,6 +214,12 @@ virtual ~MRegisterInfo(); public: + /// getRegScavenger - Returns pointer to an instance of register scavenger it + /// the specific target is making use of one. + virtual RegScavenger *getRegScavenger() const { + return NULL; + } + enum { // Define some target independent constants /// NoRegister - This physical register is not a real target register. It /// is useful as a sentinal. @@ -391,12 +398,6 @@ return false; } - /// requiresRegisterScavenging - returns true if the target requires (and - /// can make use of) the register scavenger. - virtual bool requiresRegisterScavenging() const { - return false; - } - /// hasFP - Return true if the specified function should have a dedicated frame /// pointer register. For most targets this is true only if the function has /// variable sized allocas or if frame pointer elimination is disabled. From evan.cheng at apple.com Tue Feb 27 15:09:28 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:09:28 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/RegisterScavenging.h Message-ID: <200702272109.l1RL9Sxe032344@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: RegisterScavenging.h updated: 1.2 -> 1.3 --- Log message: RegScavenger interface change to make it more flexible. --- Diffs of the changes: (+32 -4) RegisterScavenging.h | 36 ++++++++++++++++++++++++++++++++---- 1 files changed, 32 insertions(+), 4 deletions(-) Index: llvm/include/llvm/CodeGen/RegisterScavenging.h diff -u llvm/include/llvm/CodeGen/RegisterScavenging.h:1.2 llvm/include/llvm/CodeGen/RegisterScavenging.h:1.3 --- llvm/include/llvm/CodeGen/RegisterScavenging.h:1.2 Mon Feb 26 19:58:48 2007 +++ llvm/include/llvm/CodeGen/RegisterScavenging.h Tue Feb 27 15:09:11 2007 @@ -27,16 +27,34 @@ class RegScavenger { MachineBasicBlock *MBB; MachineBasicBlock::iterator MBBI; - bool MBBIInited; unsigned NumPhysRegs; + /// Initialized - All states are initialized and ready to go! + bool Initialized; + /// RegStates - The current state of all the physical registers immediately /// before MBBI. One bit per physical register. If bit is set that means it's /// available, unset means the register is currently being used. BitVector RegStates; public: - RegScavenger(MachineBasicBlock *mbb); + RegScavenger() + : MBB(NULL), Initialized(false) {}; + + RegScavenger(MachineBasicBlock *mbb) + : MBB(mbb), Initialized(false) {}; + + /// Init - Initialize the states. + /// + void init(); + + /// Reset - Discard previous states and re-initialize the states given for + /// the specific basic block. + void reset(MachineBasicBlock *mbb) { + MBB = mbb; + clear(); + init(); + } /// forward / backward - Move the internal MBB iterator and update register /// states. @@ -45,8 +63,12 @@ /// forward / backward - Move the internal MBB iterator and update register /// states until it has reached but not processed the specific iterator. - void forward(MachineBasicBlock::iterator I); - void backward(MachineBasicBlock::iterator I); + void forward(MachineBasicBlock::iterator I) { + while (MBBI != I) forward(); + } + void backward(MachineBasicBlock::iterator I) { + while (MBBI != I) backward(); + } /// isReserved - Returns true if a register is reserved. It is never "unused". bool isReserved(unsigned Reg) const { return ReservedRegs[Reg]; } @@ -69,10 +91,16 @@ bool ExCalleeSaved = false) const; private: + /// clear - Clear states. + /// + void clear(); + /// CalleeSavedrRegs - A bitvector of callee saved registers for the target. + /// BitVector CalleeSavedRegs; /// ReservedRegs - A bitvector of reserved registers. + /// BitVector ReservedRegs; }; From evan.cheng at apple.com Tue Feb 27 15:10:05 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:10:05 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegisterScavenging.cpp Message-ID: <200702272110.l1RLA5bY032383@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegisterScavenging.cpp updated: 1.4 -> 1.5 --- Log message: RegScavenger interface change to make it more flexible. --- Diffs of the changes: (+18 -16) RegisterScavenging.cpp | 34 ++++++++++++++++++---------------- 1 files changed, 18 insertions(+), 16 deletions(-) Index: llvm/lib/CodeGen/RegisterScavenging.cpp diff -u llvm/lib/CodeGen/RegisterScavenging.cpp:1.4 llvm/lib/CodeGen/RegisterScavenging.cpp:1.5 --- llvm/lib/CodeGen/RegisterScavenging.cpp:1.4 Mon Feb 26 19:58:04 2007 +++ llvm/lib/CodeGen/RegisterScavenging.cpp Tue Feb 27 15:09:48 2007 @@ -25,12 +25,12 @@ #include "llvm/ADT/STLExtras.h" using namespace llvm; -RegScavenger::RegScavenger(MachineBasicBlock *mbb) - : MBB(mbb), MBBIInited(false) { +void RegScavenger::init() { const MachineFunction &MF = *MBB->getParent(); const TargetMachine &TM = MF.getTarget(); const MRegisterInfo *RegInfo = TM.getRegisterInfo(); + MBBI = MBB->begin(); NumPhysRegs = RegInfo->getNumRegs(); RegStates.resize(NumPhysRegs, true); @@ -50,15 +50,16 @@ for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), E = MBB->livein_end(); I != E; ++I) setUsed(*I); + + Initialized = true; } void RegScavenger::forward() { assert(MBBI != MBB->end() && "Already at the end of the basic block!"); // Move ptr forward. - if (!MBBIInited) { - MBBI = MBB->begin(); - MBBIInited = true; - } else + if (!Initialized) + init(); + else MBBI = next(MBBI); MachineInstr *MI = MBBI; @@ -133,16 +134,6 @@ setUsed(ChangedRegs); } -void RegScavenger::forward(MachineBasicBlock::iterator I) { - while (MBBI != I) - forward(); -} - -void RegScavenger::backward(MachineBasicBlock::iterator I) { - while (MBBI != I) - backward(); -} - /// CreateRegClassMask - Set the bits that represent the registers in the /// TargetRegisterClass. static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) { @@ -167,3 +158,14 @@ int Reg = RegStatesCopy.find_first(); return (Reg == -1) ? 0 : Reg; } + +void RegScavenger::clear() { + if (MBB) { + MBBI = MBB->end(); + MBB = NULL; + } + + NumPhysRegs = 0; + Initialized = false; + RegStates.clear(); +} From evan.cheng at apple.com Tue Feb 27 15:10:49 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:10:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/PrologEpilogInserter.cpp Message-ID: <200702272110.l1RLAnX8032408@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: PrologEpilogInserter.cpp updated: 1.70 -> 1.71 --- Log message: Let MRegisterInfo now owns RegScavenger. --- Diffs of the changes: (+3 -3) PrologEpilogInserter.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/PrologEpilogInserter.cpp diff -u llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.70 llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.71 --- llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.70 Mon Feb 26 19:58:04 2007 +++ llvm/lib/CodeGen/PrologEpilogInserter.cpp Tue Feb 27 15:10:33 2007 @@ -442,9 +442,10 @@ const TargetMachine &TM = Fn.getTarget(); assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!"); const MRegisterInfo &MRI = *TM.getRegisterInfo(); + RegScavenger *RS = MRI.getRegScavenger(); for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) { - RegScavenger RS(BB); + if (RS) RS->reset(BB); for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) { for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) if (I->getOperand(i).isFrameIndex()) { @@ -454,8 +455,7 @@ break; } // Update register states. - if (MRI.requiresRegisterScavenging()) - RS.forward(I); + if (RS) RS->forward(I); } } } From evan.cheng at apple.com Tue Feb 27 15:12:54 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:12:54 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp ARMRegisterInfo.h Message-ID: <200702272112.l1RLCsMG032484@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.72 -> 1.73 ARMRegisterInfo.h updated: 1.12 -> 1.13 --- Log message: Let MRegisterInfo now owns RegScavenger; eliminateFrameIndex must preserve register kill info. --- Diffs of the changes: (+51 -30) ARMRegisterInfo.cpp | 70 +++++++++++++++++++++++++++++++--------------------- ARMRegisterInfo.h | 11 +++++--- 2 files changed, 51 insertions(+), 30 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.72 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.73 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.72 Fri Feb 23 15:53:48 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Tue Feb 27 15:12:35 2007 @@ -25,6 +25,7 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineLocation.h" +#include "llvm/CodeGen/RegisterScavenging.h" #include "llvm/Target/TargetFrameInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" @@ -84,6 +85,15 @@ : ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP), TII(tii), STI(sti), FramePtr(STI.useThumbBacktraces() ? ARM::R7 : ARM::R11) { + RS = new RegScavenger(); +} + +ARMRegisterInfo::~ARMRegisterInfo() { + delete RS; +} + +RegScavenger *ARMRegisterInfo::getRegScavenger() const { + return EnableScavenging ? RS : NULL; } bool ARMRegisterInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB, @@ -328,10 +338,6 @@ return NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects(); } -bool ARMRegisterInfo::requiresRegisterScavenging() const { - return EnableScavenging; -} - /// emitARMRegPlusImmediate - Emits a series of instructions to materialize /// a destreg = basereg + immediate in ARM code. static @@ -356,7 +362,7 @@ // Build the new ADD / SUB. BuildMI(MBB, MBBI, TII.get(isSub ? ARM::SUBri : ARM::ADDri), DestReg) - .addReg(BaseReg).addImm(SOImmVal); + .addReg(BaseReg, false, false, true).addImm(SOImmVal); BaseReg = DestReg; } } @@ -423,28 +429,29 @@ if (DestReg == ARM::SP) { assert(BaseReg == ARM::SP && "Unexpected!"); LdReg = ARM::R3; - BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R3); + BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::R12) + .addReg(ARM::R3, false, false, true); } if (NumBytes <= 255 && NumBytes >= 0) BuildMI(MBB, MBBI, TII.get(ARM::tMOVri8), LdReg).addImm(NumBytes); else if (NumBytes < 0 && NumBytes >= -255) { BuildMI(MBB, MBBI, TII.get(ARM::tMOVri8), LdReg).addImm(NumBytes); - BuildMI(MBB, MBBI, TII.get(ARM::tNEG), LdReg).addReg(LdReg); + BuildMI(MBB, MBBI, TII.get(ARM::tNEG), LdReg) + .addReg(LdReg, false, false, true); } else emitLoadConstPool(MBB, MBBI, LdReg, NumBytes, TII); // Emit add / sub. int Opc = (isSub) ? ARM::tSUBrr : (isHigh ? ARM::tADDhirr : ARM::tADDrr); const MachineInstrBuilder MIB = BuildMI(MBB, MBBI, TII.get(Opc), DestReg); - if (DestReg == ARM::SP) - MIB.addReg(BaseReg).addReg(LdReg); - else if (isSub) - MIB.addReg(BaseReg).addReg(LdReg); + if (DestReg == ARM::SP || isSub) + MIB.addReg(BaseReg).addReg(LdReg, false, false, true); else - MIB.addReg(LdReg).addReg(BaseReg); + MIB.addReg(LdReg).addReg(BaseReg, false, false, true); if (DestReg == ARM::SP) - BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::R3).addReg(ARM::R12); + BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::R3) + .addReg(ARM::R12, false, false, true); } /// emitThumbRegPlusImmediate - Emits a series of instructions to materialize @@ -510,9 +517,10 @@ unsigned ThisVal = (Bytes > Chunk) ? Chunk : Bytes; Bytes -= ThisVal; BuildMI(MBB, MBBI, TII.get(isSub ? ARM::tSUBi3 : ARM::tADDi3), DestReg) - .addReg(BaseReg).addImm(ThisVal); + .addReg(BaseReg, false, false, true).addImm(ThisVal); } else { - BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), DestReg).addReg(BaseReg); + BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), DestReg) + .addReg(BaseReg, false, false, true); } BaseReg = DestReg; } @@ -526,7 +534,9 @@ if (isTwoAddr) BuildMI(MBB, MBBI, TII.get(Opc), DestReg).addReg(DestReg).addImm(ThisVal); else { - BuildMI(MBB, MBBI, TII.get(Opc), DestReg).addReg(BaseReg).addImm(ThisVal); + bool isKill = BaseReg != ARM::SP; + BuildMI(MBB, MBBI, TII.get(Opc), DestReg) + .addReg(BaseReg, false, false, isKill).addImm(ThisVal); BaseReg = DestReg; if (Opc == ARM::tADDrSPi) { @@ -543,7 +553,8 @@ } if (ExtraOpc) - BuildMI(MBB, MBBI, TII.get(ExtraOpc), DestReg).addReg(DestReg) + BuildMI(MBB, MBBI, TII.get(ExtraOpc), DestReg) + .addReg(DestReg, false, false, true) .addImm(((unsigned)NumBytes) & 3); } @@ -601,7 +612,8 @@ if (Imm > 0) emitThumbRegPlusImmediate(MBB, MBBI, DestReg, DestReg, Imm, TII); if (isSub) - BuildMI(MBB, MBBI, TII.get(ARM::tNEG), DestReg).addReg(DestReg); + BuildMI(MBB, MBBI, TII.get(ARM::tNEG), DestReg) + .addReg(DestReg, false, false, true); } void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{ @@ -722,7 +734,7 @@ // r0 = add r0, sp emitThumbConstant(MBB, II, DestReg, Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tADDhirr)); - MI.getOperand(i).ChangeToRegister(DestReg, false); + MI.getOperand(i).ChangeToRegister(DestReg, false, false, true); MI.getOperand(i+1).ChangeToRegister(FrameReg, false); } return; @@ -831,11 +843,11 @@ } else emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tLDR)); - MI.getOperand(i).ChangeToRegister(TmpReg, false); + MI.getOperand(i).ChangeToRegister(TmpReg, false, false, true); if (UseRR) MI.addRegOperand(FrameReg, false); // Use [reg, reg] addrmode. else - MI.addRegOperand(0, false); // tLDR has an extra register operand. + MI.addRegOperand(0, false); // tLDR has an extra register operand. } else if (TII.isStore(Opcode)) { // FIXME! This is horrific!!! We need register scavenging. // Our temporary workaround has marked r3 unavailable. Of course, r3 is @@ -849,11 +861,13 @@ unsigned TmpReg = ARM::R3; bool UseRR = false; if (ValReg == ARM::R3) { - BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R2); + BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12) + .addReg(ARM::R2, false, false, true); TmpReg = ARM::R2; } if (TmpReg == ARM::R3 && AFI->isR3IsLiveIn()) - BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R3); + BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12) + .addReg(ARM::R3, false, false, true); if (Opcode == ARM::tSpill) { if (FrameReg == ARM::SP) emitThumbRegPlusImmInReg(MBB, II, TmpReg, FrameReg,Offset,false,TII); @@ -864,7 +878,7 @@ } else emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg, Offset, TII); MI.setInstrDescriptor(TII.get(ARM::tSTR)); - MI.getOperand(i).ChangeToRegister(TmpReg, false); + MI.getOperand(i).ChangeToRegister(TmpReg, false, false, true); if (UseRR) MI.addRegOperand(FrameReg, false); // Use [reg, reg] addrmode. else @@ -872,9 +886,11 @@ MachineBasicBlock::iterator NII = next(II); if (ValReg == ARM::R3) - BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R2).addReg(ARM::R12); + BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R2) + .addReg(ARM::R12, false, false, true); if (TmpReg == ARM::R3 && AFI->isR3IsLiveIn()) - BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R3).addReg(ARM::R12); + BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R3) + .addReg(ARM::R12, false, false, true); } else assert(false && "Unexpected opcode!"); } else { @@ -884,7 +900,7 @@ // out of 'Offset'. emitARMRegPlusImmediate(MBB, II, ARM::R12, FrameReg, isSub ? -Offset : Offset, TII); - MI.getOperand(i).ChangeToRegister(ARM::R12, false); + MI.getOperand(i).ChangeToRegister(ARM::R12, false, false, true); } } Index: llvm/lib/Target/ARM/ARMRegisterInfo.h diff -u llvm/lib/Target/ARM/ARMRegisterInfo.h:1.12 llvm/lib/Target/ARM/ARMRegisterInfo.h:1.13 --- llvm/lib/Target/ARM/ARMRegisterInfo.h:1.12 Thu Feb 22 19:09:11 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.h Tue Feb 27 15:12:35 2007 @@ -19,20 +19,27 @@ #include "ARMGenRegisterInfo.h.inc" namespace llvm { - class TargetInstrInfo; class ARMSubtarget; + class TargetInstrInfo; class Type; struct ARMRegisterInfo : public ARMGenRegisterInfo { const TargetInstrInfo &TII; const ARMSubtarget &STI; private: + /// RS - An instance of the register scavenger. + RegScavenger *RS; + /// FramePtr - ARM physical register used as frame ptr. unsigned FramePtr; public: ARMRegisterInfo(const TargetInstrInfo &tii, const ARMSubtarget &STI); + ~ARMRegisterInfo(); + + RegScavenger *getRegScavenger() const; + /// getRegisterNumbering - Given the enum value for some register, e.g. /// ARM::LR, return the number that it corresponds to (e.g. 14). static unsigned getRegisterNumbering(unsigned RegEnum); @@ -69,8 +76,6 @@ BitVector getReservedRegs(const MachineFunction &MF) const; - bool requiresRegisterScavenging() const; - bool hasFP(const MachineFunction &MF) const; void eliminateCallFramePseudoInstr(MachineFunction &MF, From evan.cheng at apple.com Tue Feb 27 15:44:25 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:44:25 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CodeGenTarget.cpp Record.cpp Record.h TableGen.cpp Message-ID: <200702272144.l1RLiP3g000569@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CodeGenTarget.cpp updated: 1.83 -> 1.84 Record.cpp updated: 1.56 -> 1.57 Record.h updated: 1.60 -> 1.61 TableGen.cpp updated: 1.48 -> 1.49 --- Log message: Backing out CodeGenTarget.cpp updated: 1.82 -> 1.83 Record.cpp updated: 1.55 -> 1.56 Record.h updated: 1.59 -> 1.60 TableGen.cpp updated: 1.47 -> 1.48 It's missing CallingConvEmitter.h --- Diffs of the changes: (+7 -18) CodeGenTarget.cpp | 8 ++++++-- Record.cpp | 7 ------- Record.h | 2 -- TableGen.cpp | 8 +------- 4 files changed, 7 insertions(+), 18 deletions(-) Index: llvm/utils/TableGen/CodeGenTarget.cpp diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.83 llvm/utils/TableGen/CodeGenTarget.cpp:1.84 --- llvm/utils/TableGen/CodeGenTarget.cpp:1.83 Tue Feb 27 14:43:37 2007 +++ llvm/utils/TableGen/CodeGenTarget.cpp Tue Feb 27 15:44:08 2007 @@ -604,7 +604,9 @@ // Parse the list of argument types. ListInit *TypeList = R->getValueAsListInit("Types"); for (unsigned i = 0, e = TypeList->getSize(); i != e; ++i) { - Record *TyEl = TypeList->getElementAsRecord(i); + DefInit *DI = dynamic_cast(TypeList->getElement(i)); + assert(DI && "Invalid list type!"); + Record *TyEl = DI->getDef(); assert(TyEl->isSubClassOf("LLVMType") && "Expected a type!"); ArgTypes.push_back(TyEl->getValueAsString("TypeVal")); @@ -618,7 +620,9 @@ // Parse the intrinsic properties. ListInit *PropList = R->getValueAsListInit("Properties"); for (unsigned i = 0, e = PropList->getSize(); i != e; ++i) { - Record *Property = PropList->getElementAsRecord(i); + DefInit *DI = dynamic_cast(PropList->getElement(i)); + assert(DI && "Invalid list type!"); + Record *Property = DI->getDef(); assert(Property->isSubClassOf("IntrinsicProperty") && "Expected a property!"); Index: llvm/utils/TableGen/Record.cpp diff -u llvm/utils/TableGen/Record.cpp:1.56 llvm/utils/TableGen/Record.cpp:1.57 --- llvm/utils/TableGen/Record.cpp:1.56 Tue Feb 27 14:43:37 2007 +++ llvm/utils/TableGen/Record.cpp Tue Feb 27 15:44:08 2007 @@ -337,13 +337,6 @@ return new ListInit(Vals); } -Record *ListInit::getElementAsRecord(unsigned i) const { - assert(i < Values.size() && "List element index out of range!"); - DefInit *DI = dynamic_cast(Values[i]); - if (DI == 0) throw "Expected record in list!"; - return DI->getDef(); -} - Init *ListInit::resolveReferences(Record &R, const RecordVal *RV) { std::vector Resolved; Resolved.reserve(getSize()); Index: llvm/utils/TableGen/Record.h diff -u llvm/utils/TableGen/Record.h:1.60 llvm/utils/TableGen/Record.h:1.61 --- llvm/utils/TableGen/Record.h:1.60 Tue Feb 27 14:43:37 2007 +++ llvm/utils/TableGen/Record.h Tue Feb 27 15:44:08 2007 @@ -626,8 +626,6 @@ return Values[i]; } - Record *getElementAsRecord(unsigned i) const; - Init *convertInitListSlice(const std::vector &Elements); virtual Init *convertInitializerTo(RecTy *Ty) { Index: llvm/utils/TableGen/TableGen.cpp diff -u llvm/utils/TableGen/TableGen.cpp:1.48 llvm/utils/TableGen/TableGen.cpp:1.49 --- llvm/utils/TableGen/TableGen.cpp:1.48 Tue Feb 27 14:43:37 2007 +++ llvm/utils/TableGen/TableGen.cpp Tue Feb 27 15:44:08 2007 @@ -20,7 +20,6 @@ #include "llvm/Support/Streams.h" #include "llvm/System/Signals.h" #include "llvm/Support/FileUtilities.h" -#include "CallingConvEmitter.h" #include "CodeEmitterGen.h" #include "RegisterInfoEmitter.h" #include "InstrInfoEmitter.h" @@ -39,7 +38,6 @@ GenEmitter, GenRegisterEnums, GenRegister, GenRegisterHeader, GenInstrEnums, GenInstrs, GenAsmWriter, - GenCallingConv, GenDAGISel, GenSubtarget, GenIntrinsic, @@ -63,8 +61,6 @@ "Generate enum values for instructions"), clEnumValN(GenInstrs, "gen-instr-desc", "Generate instruction descriptions"), - clEnumValN(GenCallingConv, "gen-callingconv", - "Generate calling convention descriptions"), clEnumValN(GenAsmWriter, "gen-asm-writer", "Generate assembly writer"), clEnumValN(GenDAGISel, "gen-dag-isel", @@ -142,9 +138,7 @@ case GenInstrs: InstrInfoEmitter(Records).run(*Out); break; - case GenCallingConv: - CallingConvEmitter(Records).run(*Out); - break; + case GenAsmWriter: AsmWriterEmitter(Records).run(*Out); break; From evan.cheng at apple.com Tue Feb 27 15:47:39 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 15:47:39 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/Makefile Message-ID: <200702272147.l1RLldjI000632@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: Makefile updated: 1.32 -> 1.33 --- Log message: Back out previous commit temporarily. --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/Makefile diff -u llvm/lib/Target/X86/Makefile:1.32 llvm/lib/Target/X86/Makefile:1.33 --- llvm/lib/Target/X86/Makefile:1.32 Tue Feb 27 14:44:31 2007 +++ llvm/lib/Target/X86/Makefile Tue Feb 27 15:47:22 2007 @@ -15,6 +15,6 @@ X86GenRegisterInfo.inc X86GenInstrNames.inc \ X86GenInstrInfo.inc X86GenAsmWriter.inc \ X86GenAsmWriter1.inc X86GenDAGISel.inc \ - X86GenCallingConv.inc X86GenSubtarget.inc + X86GenSubtarget.inc include $(LEVEL)/Makefile.common From reid at x10sys.com Tue Feb 27 15:59:47 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 15:59:47 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702272159.l1RLxlmx000884@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.55 -> 1.56 --- Log message: Implement countLeadingOnes() and getMinSignedBits(). This helps to minimize the bit width of negative numbers by computing the minimum bit width for a negative value. E.g. 0x1800000000000000 could be just 0x8000000000000000 --- Diffs of the changes: (+34 -1) APInt.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 files changed, 34 insertions(+), 1 deletion(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.55 llvm/lib/Support/APInt.cpp:1.56 --- llvm/lib/Support/APInt.cpp:1.55 Tue Feb 27 14:24:31 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 27 15:59:26 2007 @@ -702,6 +702,38 @@ return Count; } +static uint32_t countLeadingOnes_64(uint64_t V, uint32_t skip) { + uint32_t Count = 0; + if (skip) + V <<= skip; + while (V && (V & (1ULL << 63))) { + Count++; + V <<= 1; + } + return Count; +} + +uint32_t APInt::countLeadingOnes() const { + if (isSingleWord()) + return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth); + + uint32_t highWordBits = BitWidth % APINT_BITS_PER_WORD; + uint32_t shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits); + int i = getNumWords() - 1; + uint32_t Count = countLeadingOnes_64(pVal[i], shift); + if (Count == highWordBits) { + for (i--; i >= 0; --i) { + if (pVal[i] == -1ULL) + Count += APINT_BITS_PER_WORD; + else { + Count += countLeadingOnes_64(pVal[i], 0); + break; + } + } + } + return Count; +} + uint32_t APInt::countTrailingZeros() const { if (isSingleWord()) return CountTrailingZeros_64(VAL); @@ -1701,6 +1733,7 @@ else for (unsigned i = getNumWords(); i > 0; i--) { cerr << pVal[i-1] << " "; } - cerr << " (" << this->toString(10) << ")\n" << std::setbase(10); + cerr << " U(" << this->toString(10) << ") S(" << this->toStringSigned(10) + << ")\n" << std::setbase(10); } #endif From reid at x10sys.com Tue Feb 27 15:59:47 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 15:59:47 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702272159.l1RLxlNI000879@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.26 -> 1.27 --- Log message: Implement countLeadingOnes() and getMinSignedBits(). This helps to minimize the bit width of negative numbers by computing the minimum bit width for a negative value. E.g. 0x1800000000000000 could be just 0x8000000000000000 --- Diffs of the changes: (+14 -1) APInt.h | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletion(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.26 llvm/include/llvm/ADT/APInt.h:1.27 --- llvm/include/llvm/ADT/APInt.h:1.26 Tue Feb 27 14:24:31 2007 +++ llvm/include/llvm/ADT/APInt.h Tue Feb 27 15:59:26 2007 @@ -446,6 +446,12 @@ return BitWidth - countLeadingZeros(); } + inline uint32_t getMinSignedBits() const { + if (isNegative()) + return BitWidth - countLeadingOnes() + 1; + return getActiveBits(); + } + /// This method attempts to return the value of this APInt as a zero extended /// uint64_t. The bitwidth must be <= 64 or the value must fit within a /// uint64_t. Otherwise an assertion will result. @@ -587,9 +593,16 @@ /// @returns getNumWords() * APINT_BITS_PER_WORD if the value is zero. /// @returns the number of zeros from the most significant bit to the first /// one bits. - /// @brief Count the number of trailing one bits. + /// @brief Count the number of leading one bits. uint32_t countLeadingZeros() const; + /// countLeadingOnes - This function counts the number of contiguous 1 bits + /// in the high order bits. The count stops when the first 0 bit is reached. + /// @returns 0 if the high order bit is not set + /// @returns the number of 1 bits from the most significant to the least + /// @brief Count the number of leading one bits. + uint32_t countLeadingOnes() const; + /// countTrailingZeros - This function is an APInt version of the /// countTrailingZoers_{32,64} functions in MathExtras.h. It counts /// the number of zeros from the least significant bit to the first one bit. From sabre at nondot.org Tue Feb 27 16:06:08 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 16:06:08 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CallingConvEmitter.h CallingConvEmitter.cpp Message-ID: <200702272206.l1RM68Nm001078@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CallingConvEmitter.h added (r1.1) CallingConvEmitter.cpp added (r1.1) --- Log message: --- Diffs of the changes: (+166 -0) CallingConvEmitter.cpp | 128 +++++++++++++++++++++++++++++++++++++++++++++++++ CallingConvEmitter.h | 38 ++++++++++++++ 2 files changed, 166 insertions(+) Index: llvm/utils/TableGen/CallingConvEmitter.h diff -c /dev/null llvm/utils/TableGen/CallingConvEmitter.h:1.1 *** /dev/null Tue Feb 27 16:06:01 2007 --- llvm/utils/TableGen/CallingConvEmitter.h Tue Feb 27 16:05:51 2007 *************** *** 0 **** --- 1,38 ---- + //===- CallingConvEmitter.h - Generate calling conventions ------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Chris Lattner and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This tablegen backend is responsible for emitting descriptions of the calling + // conventions supported by this target. + // + //===----------------------------------------------------------------------===// + + #ifndef CALLINGCONV_EMITTER_H + #define CALLINGCONV_EMITTER_H + + #include "TableGenBackend.h" + #include + #include + #include + + namespace llvm { + class CallingConvEmitter : public TableGenBackend { + RecordKeeper &Records; + public: + CallingConvEmitter(RecordKeeper &R) : Records(R) {} + + // run - Output the asmwriter, returning true on failure. + void run(std::ostream &o); + + private: + void EmitCallingConv(Record *CC, std::ostream &O); + void EmitAction(Record *Action, unsigned Indent, std::ostream &O); + unsigned Counter; + }; + } + #endif Index: llvm/utils/TableGen/CallingConvEmitter.cpp diff -c /dev/null llvm/utils/TableGen/CallingConvEmitter.cpp:1.1 *** /dev/null Tue Feb 27 16:06:08 2007 --- llvm/utils/TableGen/CallingConvEmitter.cpp Tue Feb 27 16:05:51 2007 *************** *** 0 **** --- 1,128 ---- + //===- CallingConvEmitter.cpp - Generate calling conventions --------------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Chris Lattner and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This tablegen backend is responsible for emitting descriptions of the calling + // conventions supported by this target. + // + //===----------------------------------------------------------------------===// + + #include "CallingConvEmitter.h" + #include "Record.h" + #include "CodeGenTarget.h" + using namespace llvm; + + void CallingConvEmitter::run(std::ostream &O) { + EmitSourceFileHeader("Calling Convention Implementation Fragment", O); + + std::vector CCs = Records.getAllDerivedDefinitions("CallingConv"); + + // Emit prototypes for all of the CC's so that they can forward ref each + // other. + for (unsigned i = 0, e = CCs.size(); i != e; ++i) { + O << "static bool " << CCs[i]->getName() + << "(unsigned ValNo, MVT::ValueType ValVT, MVT::ValueType LocVT,\n" + << std::string(CCs[i]->getName().size()+13, ' ') + << "CCValAssign::LocInfo LocInfo, unsigned ArgFlags, CCState &State);\n"; + } + + // Emit each calling convention description in full. + for (unsigned i = 0, e = CCs.size(); i != e; ++i) + EmitCallingConv(CCs[i], O); + } + + + void CallingConvEmitter::EmitCallingConv(Record *CC, std::ostream &O) { + ListInit *CCActions = CC->getValueAsListInit("Actions"); + Counter = 0; + + O << "\n\nstatic bool " << CC->getName() + << "(unsigned ValNo, MVT::ValueType ValVT, MVT::ValueType LocVT,\n" + << std::string(CC->getName().size()+13, ' ') + << "CCValAssign::LocInfo LocInfo, " + << "unsigned ArgFlags, CCState &State) {\n"; + + // Emit all of the actions, in order. + for (unsigned i = 0, e = CCActions->getSize(); i != e; ++i) { + O << "\n"; + EmitAction(CCActions->getElementAsRecord(i), 2, O); + } + + O << "\n return true; // CC didn't match.\n"; + O << "}\n"; + } + + void CallingConvEmitter::EmitAction(Record *Action, + unsigned Indent, std::ostream &O) { + std::string IndentStr = std::string(Indent, ' '); + + if (Action->isSubClassOf("CCPredicateAction")) { + O << IndentStr << "if ("; + + if (Action->isSubClassOf("CCMatchType")) { + ListInit *VTs = Action->getValueAsListInit("VTs"); + for (unsigned i = 0, e = VTs->getSize(); i != e; ++i) { + Record *VT = VTs->getElementAsRecord(i); + if (i != 0) O << " || \n " << IndentStr; + O << "LocVT == " << getEnumName(getValueType(VT)); + } + + } else if (Action->isSubClassOf("CCMatchIf")) { + O << Action->getValueAsString("Predicate"); + } else { + Action->dump(); + throw "Unknown CCPredicateAction!"; + } + + O << ") {\n"; + EmitAction(Action->getValueAsDef("SubAction"), Indent+2, O); + O << IndentStr << "}\n"; + } else { + if (Action->isSubClassOf("CCDelegateTo")) { + Record *CC = Action->getValueAsDef("CC"); + O << IndentStr << "if (!" << CC->getName() + << "(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))\n" + << IndentStr << " return false;\n"; + } else if (Action->isSubClassOf("CCAssignToReg")) { + ListInit *RegList = Action->getValueAsListInit("RegList"); + if (RegList->getSize() == 1) { + O << IndentStr << "if (unsigned Reg = State.AllocateReg("; + O << getQualifiedName(RegList->getElementAsRecord(0)) << ")) {\n"; + } else { + O << IndentStr << "static const unsigned RegList" << ++Counter + << "[] = {\n"; + O << IndentStr << " "; + for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) { + if (i != 0) O << ", "; + O << getQualifiedName(RegList->getElementAsRecord(i)); + } + O << "\n" << IndentStr << "};\n"; + O << IndentStr << "if (unsigned Reg = State.AllocateReg(RegList" + << Counter << ", " << RegList->getSize() << ")) {\n"; + } + O << IndentStr << " State.addLoc(CCValAssign::getReg(ValNo, ValVT, " + << "Reg, LocVT, LocInfo));\n"; + O << IndentStr << " return false;\n"; + O << IndentStr << "}\n"; + } else if (Action->isSubClassOf("CCAssignToStack")) { + int Size = Action->getValueAsInt("Size"); + int Align = Action->getValueAsInt("Align"); + + O << IndentStr << "unsigned Offset" << ++Counter + << " = State.AllocateStack(" << Size << ", " << Align << ");\n"; + O << IndentStr << "State.addLoc(CCValAssign::getMem(ValNo, ArgVT, Offset" + << Counter << ", LocVT, LocInfo));\n"; + O << IndentStr << "return false;\n"; + } else if (Action->isSubClassOf("CCPromoteToType")) { + + } else { + Action->dump(); + throw "Unknown CCAction!"; + } + } + } \ No newline at end of file From sabre at nondot.org Tue Feb 27 16:08:44 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 16:08:44 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CallingConvEmitter.cpp CodeGenTarget.cpp Record.cpp Record.h TableGen.cpp Message-ID: <200702272208.l1RM8i66001314@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CallingConvEmitter.cpp updated: 1.1 -> 1.2 CodeGenTarget.cpp updated: 1.84 -> 1.85 Record.cpp updated: 1.57 -> 1.58 Record.h updated: 1.61 -> 1.62 TableGen.cpp updated: 1.49 -> 1.50 --- Log message: reapply --- Diffs of the changes: (+20 -8) CallingConvEmitter.cpp | 3 ++- CodeGenTarget.cpp | 8 ++------ Record.cpp | 7 +++++++ Record.h | 2 ++ TableGen.cpp | 8 +++++++- 5 files changed, 20 insertions(+), 8 deletions(-) Index: llvm/utils/TableGen/CallingConvEmitter.cpp diff -u llvm/utils/TableGen/CallingConvEmitter.cpp:1.1 llvm/utils/TableGen/CallingConvEmitter.cpp:1.2 --- llvm/utils/TableGen/CallingConvEmitter.cpp:1.1 Tue Feb 27 16:05:51 2007 +++ llvm/utils/TableGen/CallingConvEmitter.cpp Tue Feb 27 16:08:27 2007 @@ -125,4 +125,5 @@ throw "Unknown CCAction!"; } } -} \ No newline at end of file +} + Index: llvm/utils/TableGen/CodeGenTarget.cpp diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.84 llvm/utils/TableGen/CodeGenTarget.cpp:1.85 --- llvm/utils/TableGen/CodeGenTarget.cpp:1.84 Tue Feb 27 15:44:08 2007 +++ llvm/utils/TableGen/CodeGenTarget.cpp Tue Feb 27 16:08:27 2007 @@ -604,9 +604,7 @@ // Parse the list of argument types. ListInit *TypeList = R->getValueAsListInit("Types"); for (unsigned i = 0, e = TypeList->getSize(); i != e; ++i) { - DefInit *DI = dynamic_cast(TypeList->getElement(i)); - assert(DI && "Invalid list type!"); - Record *TyEl = DI->getDef(); + Record *TyEl = TypeList->getElementAsRecord(i); assert(TyEl->isSubClassOf("LLVMType") && "Expected a type!"); ArgTypes.push_back(TyEl->getValueAsString("TypeVal")); @@ -620,9 +618,7 @@ // Parse the intrinsic properties. ListInit *PropList = R->getValueAsListInit("Properties"); for (unsigned i = 0, e = PropList->getSize(); i != e; ++i) { - DefInit *DI = dynamic_cast(PropList->getElement(i)); - assert(DI && "Invalid list type!"); - Record *Property = DI->getDef(); + Record *Property = PropList->getElementAsRecord(i); assert(Property->isSubClassOf("IntrinsicProperty") && "Expected a property!"); Index: llvm/utils/TableGen/Record.cpp diff -u llvm/utils/TableGen/Record.cpp:1.57 llvm/utils/TableGen/Record.cpp:1.58 --- llvm/utils/TableGen/Record.cpp:1.57 Tue Feb 27 15:44:08 2007 +++ llvm/utils/TableGen/Record.cpp Tue Feb 27 16:08:27 2007 @@ -337,6 +337,13 @@ return new ListInit(Vals); } +Record *ListInit::getElementAsRecord(unsigned i) const { + assert(i < Values.size() && "List element index out of range!"); + DefInit *DI = dynamic_cast(Values[i]); + if (DI == 0) throw "Expected record in list!"; + return DI->getDef(); +} + Init *ListInit::resolveReferences(Record &R, const RecordVal *RV) { std::vector Resolved; Resolved.reserve(getSize()); Index: llvm/utils/TableGen/Record.h diff -u llvm/utils/TableGen/Record.h:1.61 llvm/utils/TableGen/Record.h:1.62 --- llvm/utils/TableGen/Record.h:1.61 Tue Feb 27 15:44:08 2007 +++ llvm/utils/TableGen/Record.h Tue Feb 27 16:08:27 2007 @@ -626,6 +626,8 @@ return Values[i]; } + Record *getElementAsRecord(unsigned i) const; + Init *convertInitListSlice(const std::vector &Elements); virtual Init *convertInitializerTo(RecTy *Ty) { Index: llvm/utils/TableGen/TableGen.cpp diff -u llvm/utils/TableGen/TableGen.cpp:1.49 llvm/utils/TableGen/TableGen.cpp:1.50 --- llvm/utils/TableGen/TableGen.cpp:1.49 Tue Feb 27 15:44:08 2007 +++ llvm/utils/TableGen/TableGen.cpp Tue Feb 27 16:08:27 2007 @@ -20,6 +20,7 @@ #include "llvm/Support/Streams.h" #include "llvm/System/Signals.h" #include "llvm/Support/FileUtilities.h" +#include "CallingConvEmitter.h" #include "CodeEmitterGen.h" #include "RegisterInfoEmitter.h" #include "InstrInfoEmitter.h" @@ -38,6 +39,7 @@ GenEmitter, GenRegisterEnums, GenRegister, GenRegisterHeader, GenInstrEnums, GenInstrs, GenAsmWriter, + GenCallingConv, GenDAGISel, GenSubtarget, GenIntrinsic, @@ -61,6 +63,8 @@ "Generate enum values for instructions"), clEnumValN(GenInstrs, "gen-instr-desc", "Generate instruction descriptions"), + clEnumValN(GenCallingConv, "gen-callingconv", + "Generate calling convention descriptions"), clEnumValN(GenAsmWriter, "gen-asm-writer", "Generate assembly writer"), clEnumValN(GenDAGISel, "gen-dag-isel", @@ -138,7 +142,9 @@ case GenInstrs: InstrInfoEmitter(Records).run(*Out); break; - + case GenCallingConv: + CallingConvEmitter(Records).run(*Out); + break; case GenAsmWriter: AsmWriterEmitter(Records).run(*Out); break; From evan.cheng at apple.com Tue Feb 27 16:11:09 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 16:11:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegisterScavenging.cpp Message-ID: <200702272211.l1RMB92j001416@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegisterScavenging.cpp updated: 1.5 -> 1.6 --- Log message: Oops. --- Diffs of the changes: (+4 -1) RegisterScavenging.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/RegisterScavenging.cpp diff -u llvm/lib/CodeGen/RegisterScavenging.cpp:1.5 llvm/lib/CodeGen/RegisterScavenging.cpp:1.6 --- llvm/lib/CodeGen/RegisterScavenging.cpp:1.5 Tue Feb 27 15:09:48 2007 +++ llvm/lib/CodeGen/RegisterScavenging.cpp Tue Feb 27 16:10:52 2007 @@ -25,7 +25,10 @@ #include "llvm/ADT/STLExtras.h" using namespace llvm; -void RegScavenger::init() { +void RegScavenger::init(MachineBasicBlock *mbb) { + if (mbb) + MBB = mbb; + const MachineFunction &MF = *MBB->getParent(); const TargetMachine &TM = MF.getTarget(); const MRegisterInfo *RegInfo = TM.getRegisterInfo(); From evan.cheng at apple.com Tue Feb 27 16:11:11 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 16:11:11 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/RegisterScavenging.h Message-ID: <200702272211.l1RMBBZi001421@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: RegisterScavenging.h updated: 1.3 -> 1.4 --- Log message: Oops. --- Diffs of the changes: (+2 -3) RegisterScavenging.h | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/include/llvm/CodeGen/RegisterScavenging.h diff -u llvm/include/llvm/CodeGen/RegisterScavenging.h:1.3 llvm/include/llvm/CodeGen/RegisterScavenging.h:1.4 --- llvm/include/llvm/CodeGen/RegisterScavenging.h:1.3 Tue Feb 27 15:09:11 2007 +++ llvm/include/llvm/CodeGen/RegisterScavenging.h Tue Feb 27 16:10:52 2007 @@ -46,14 +46,13 @@ /// Init - Initialize the states. /// - void init(); + void init(MachineBasicBlock *mbb = NULL); /// Reset - Discard previous states and re-initialize the states given for /// the specific basic block. void reset(MachineBasicBlock *mbb) { - MBB = mbb; clear(); - init(); + init(mbb); } /// forward / backward - Move the internal MBB iterator and update register From sabre at nondot.org Tue Feb 27 16:12:35 2007 From: sabre at nondot.org (Chris Lattner) Date: Tue, 27 Feb 2007 16:12:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/Makefile Message-ID: <200702272212.l1RMCZ0d001489@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: Makefile updated: 1.33 -> 1.34 --- Log message: reenable generation of CC info --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/Makefile diff -u llvm/lib/Target/X86/Makefile:1.33 llvm/lib/Target/X86/Makefile:1.34 --- llvm/lib/Target/X86/Makefile:1.33 Tue Feb 27 15:47:22 2007 +++ llvm/lib/Target/X86/Makefile Tue Feb 27 16:12:19 2007 @@ -15,6 +15,6 @@ X86GenRegisterInfo.inc X86GenInstrNames.inc \ X86GenInstrInfo.inc X86GenAsmWriter.inc \ X86GenAsmWriter1.inc X86GenDAGISel.inc \ - X86GenSubtarget.inc + X86GenCallingConv.inc X86GenSubtarget.inc include $(LEVEL)/Makefile.common From clattner at apple.com Tue Feb 27 16:14:57 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 14:14:57 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp In-Reply-To: <1172604892.3004.58.camel@bashful.x10sys.com> References: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> <1172604892.3004.58.camel@bashful.x10sys.com> Message-ID: <47638406-E423-4C78-A6A5-670B34BB549F@apple.com> On Feb 27, 2007, at 11:34 AM, Reid Spencer wrote: > On Tue, 2007-02-27 at 09:10 -0800, Chris Lattner wrote: >>> Index: llvm/lib/VMCore/Constants.cpp >>> diff -u llvm/lib/VMCore/Constants.cpp:1.222 llvm/lib/VMCore/ >>> Constants.cpp:1.223 >>> --- llvm/lib/VMCore/Constants.cpp:1.222 Mon Feb 26 21:05:06 2007 >>> +++ llvm/lib/VMCore/Constants.cpp Tue Feb 27 01:57:53 2007 >>> @@ -118,7 +118,7 @@ >>> if (ITy->getBitWidth() == 1) >>> return ConstantInt::getTrue(); >>> else >>> - return ConstantInt::get(Ty, int64_t(-1)); >>> + return ConstantInt::get(Ty, APInt::getAllOnesValue(ITy- >>>> getBitWidth())); >>> return 0; >>> } >> >> The special case for 'i1' can be removed, right? > > I assumed the special case was because of this mess: > Nope, it's not needed, ConstantInt::get(Type::Int1Ty, x) works. >> ConstantInt *ConstantInt::TheTrueVal = 0; >> ConstantInt *ConstantInt::TheFalseVal = 0; >> >> namespace llvm { >> void CleanupTrueFalse(void *) { >> ConstantInt::ResetTrueFalse(); >> } >> } >> >> static ManagedCleanup TrueFalseCleanup; >> >> ConstantInt *ConstantInt::CreateTrueFalseVals(bool WhichOne) { >> assert(TheTrueVal == 0 && TheFalseVal == 0); >> TheTrueVal = get(Type::Int1Ty, 1); >> TheFalseVal = get(Type::Int1Ty, 0); >> >> // Ensure that llvm_shutdown nulls out TheTrueVal/TheFalseVal. >> TrueFalseCleanup.Register(); >> >> return WhichOne ? TheTrueVal : TheFalseVal; >> } > > why do we need this? This is needed to make ConstantInt::getTrue() / getFalse() efficient. -Chris From clattner at apple.com Tue Feb 27 16:17:50 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 14:17:50 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp In-Reply-To: <1172601445.3004.54.camel@bashful.x10sys.com> References: <200702270624.l1R6O7dJ000934@zion.cs.uiuc.edu> <2C85D3EC-77BE-4746-AA46-DE89BBAB2261@apple.com> <1172601445.3004.54.camel@bashful.x10sys.com> Message-ID: <102CD72B-3F40-444B-86A2-DEE42EAF2017@apple.com> >> This seems like a poor choice of API. RoundDoubleToAPInt should take >> a result bitwidth. Without this, this appears like it could make a >> "large" APInt, then truncate it down to a small one when converting >> from double, which is very inefficient. > > Done. Thanks, but why the default argument? >>> case Instruction::UIToFP: >>> if (const ConstantInt *CI = dyn_cast(V)) >>> - return ConstantFP::get(DestTy, double(CI->getZExtValue())); >>> + if (CI->getType()->getBitWidth() <= >>> APInt::APINT_BITS_PER_WORD) >>> + return ConstantFP::get(DestTy, CI->getValue().roundToDouble >>> (false)); >> >> Why the check for APINT_BITS_PER_WORD here? APINT_BITS_PER_WORD is >> an implementation detail of APInt, not a part of its public >> interface. > > Actually it is part of the public interface and it needs to be. For > example, the constructor that takes an array of words (as might be > used > by bcreader) needs to know how many bits are in those words. This > constant tells you. The the interface takes a pointer to uint32_t or uint64_t, it doesn't matter what the internal size is, it has to work with that array. Additionally, why are you checking this here? What does APINT_BITS_PER_WORD have to do with whether or not this operation can be constant folded? >> Also, please split the roundToDouble method into two >> methods which don't take a bool. > > I don't understand this comment at all. What should these methods do > differently? I'm just saying that instead of: APInt::doFoo(x, bool), we should have APInt::doFooSigned(x) and APInt::doFooUnsigned(x). This is an interface change, not a functionality change. >>> >>> @@ -382,7 +412,7 @@ >>> Ops.reserve(numOps); >>> for (unsigned i = 0; i < numOps; ++i) { >>> const Constant *Op = >>> - (i == idxVal) ? Elt : Constant::getNullValue(Elt->getType >>> ()); >>> + (idxVal == i) ? Elt : Constant::getNullValue(Elt->getType >>> ()); >> >> This sort of change makes the diff more noisy, and there is no >> apparent reason for doing it. Generally, the mutating value (i) is >> on the LHS, why do this (in many places)? > > Becasue there is no operator==(int, APInt) but there is an > APInt::operator==(int). Okay, can you add the other one? -Chris From clattner at apple.com Tue Feb 27 16:19:36 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 14:19:36 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp ConstantFold.cpp In-Reply-To: <200702272025.l1RKPfxO031255@zion.cs.uiuc.edu> References: <200702272025.l1RKPfxO031255@zion.cs.uiuc.edu> Message-ID: <1041318F-3ECE-44D5-ADC9-BC0A697D6744@apple.com> > @@ -464,7 +464,7 @@ > if (CI->getType() == Type::Int1Ty) > Out << (CI->getZExtValue() ? "true" : "false"); > else > - Out << CI->getValue().toString(10,/*wantSigned=*/true); > + Out << CI->getValue().toStringSigned(10); Thanks! > case Instruction::UIToFP: > if (const ConstantInt *CI = dyn_cast(V)) > - if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) > - return ConstantFP::get(DestTy, CI->getValue().roundToDouble > (false)); > + if (CI->getType()->getBitWidth() <= 64) > + return ConstantFP::get(DestTy, CI->getValue().roundToDouble > ()); > return 0; > case Instruction::SIToFP: > if (const ConstantInt *CI = dyn_cast(V)) > - if (CI->getType()->getBitWidth() <= APInt::APINT_BITS_PER_WORD) > - return ConstantFP::get(DestTy, CI->getValue().roundToDouble > (true)); > + if (CI->getType()->getBitWidth() <= 64) > + return ConstantFP::get(DestTy, CI->getValue > ().signedRoundToDouble()); > return 0; Okay, I'm still not seeing why "64 and less" can be constant folded, but larger things can't... -Chris From clattner at apple.com Tue Feb 27 16:20:48 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 14:20:48 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp In-Reply-To: <1172609509.3004.61.camel@bashful.x10sys.com> References: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> <1172604892.3004.58.camel@bashful.x10sys.com> <1172609509.3004.61.camel@bashful.x10sys.com> Message-ID: <5B9B2824-3146-4E22-BE33-0545E4B4F293@apple.com> On Feb 27, 2007, at 12:51 PM, Reid Spencer wrote: > Can't we just change this part of ConstantInt: > > /// getTrue/getFalse - Return the singleton true/false values. > static inline ConstantInt *getTrue() { > if (TheTrueVal) return TheTrueVal; > return CreateTrueFalseVals(true); > } > static inline ConstantInt *getFalse() { > if (TheFalseVal) return TheFalseVal; > return CreateTrueFalseVals(false); > } > > into: > /// getTrue/getFalse - Return the singleton true/false values. > static inline ConstantInt *getTrue() { > return get(Type::Int1Ty, 1); > } > static inline ConstantInt *getFalse() { > return get(Type::Int1Ty, 0); > } > > and get rid of all the special handling of true/false values? Or > have we > provided this simply as an optimization on frequently obtained integer > values? Yes we could. I would like to do that, but we should do (compile time) timings to see if it is a significant perf hit. -Chris From evan.cheng at apple.com Tue Feb 27 16:59:01 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 16:59:01 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/RegisterScavenging.h Message-ID: <200702272259.l1RMx1dt002205@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: RegisterScavenging.h updated: 1.4 -> 1.5 --- Log message: Some more code clean up. --- Diffs of the changes: (+6 -5) RegisterScavenging.h | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) Index: llvm/include/llvm/CodeGen/RegisterScavenging.h diff -u llvm/include/llvm/CodeGen/RegisterScavenging.h:1.4 llvm/include/llvm/CodeGen/RegisterScavenging.h:1.5 --- llvm/include/llvm/CodeGen/RegisterScavenging.h:1.4 Tue Feb 27 16:10:52 2007 +++ llvm/include/llvm/CodeGen/RegisterScavenging.h Tue Feb 27 16:58:43 2007 @@ -29,8 +29,9 @@ MachineBasicBlock::iterator MBBI; unsigned NumPhysRegs; - /// Initialized - All states are initialized and ready to go! - bool Initialized; + /// Tracking - True if RegScavenger is currently tracking the liveness of + /// registers. + bool Tracking; /// RegStates - The current state of all the physical registers immediately /// before MBBI. One bit per physical register. If bit is set that means it's @@ -39,14 +40,14 @@ public: RegScavenger() - : MBB(NULL), Initialized(false) {}; + : MBB(NULL), NumPhysRegs(0), Tracking(false) {}; RegScavenger(MachineBasicBlock *mbb) - : MBB(mbb), Initialized(false) {}; + : MBB(mbb), NumPhysRegs(0), Tracking(false) {}; /// Init - Initialize the states. /// - void init(MachineBasicBlock *mbb = NULL); + void init(MachineBasicBlock *mbb); /// Reset - Discard previous states and re-initialize the states given for /// the specific basic block. From evan.cheng at apple.com Tue Feb 27 16:59:02 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 16:59:02 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegisterScavenging.cpp Message-ID: <200702272259.l1RMx2uk002210@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegisterScavenging.cpp updated: 1.6 -> 1.7 --- Log message: Some more code clean up. --- Diffs of the changes: (+29 -23) RegisterScavenging.cpp | 52 +++++++++++++++++++++++++++---------------------- 1 files changed, 29 insertions(+), 23 deletions(-) Index: llvm/lib/CodeGen/RegisterScavenging.cpp diff -u llvm/lib/CodeGen/RegisterScavenging.cpp:1.6 llvm/lib/CodeGen/RegisterScavenging.cpp:1.7 --- llvm/lib/CodeGen/RegisterScavenging.cpp:1.6 Tue Feb 27 16:10:52 2007 +++ llvm/lib/CodeGen/RegisterScavenging.cpp Tue Feb 27 16:58:43 2007 @@ -26,44 +26,50 @@ using namespace llvm; void RegScavenger::init(MachineBasicBlock *mbb) { - if (mbb) - MBB = mbb; - - const MachineFunction &MF = *MBB->getParent(); + const MachineFunction &MF = *mbb->getParent(); const TargetMachine &TM = MF.getTarget(); const MRegisterInfo *RegInfo = TM.getRegisterInfo(); - MBBI = MBB->begin(); - NumPhysRegs = RegInfo->getNumRegs(); - RegStates.resize(NumPhysRegs, true); + assert((NumPhysRegs == 0 || NumPhysRegs == RegInfo->getNumRegs()) && + "Target changed?"); + + if (!MBB) { + NumPhysRegs = RegInfo->getNumRegs(); + ReservedRegs = RegInfo->getReservedRegs(MF); + RegStates.resize(NumPhysRegs); + + // Create callee-saved registers bitvector. + CalleeSavedRegs.resize(NumPhysRegs); + const unsigned *CSRegs = RegInfo->getCalleeSavedRegs(); + if (CSRegs != NULL) + for (unsigned i = 0; CSRegs[i]; ++i) + CalleeSavedRegs.set(CSRegs[i]); + } + + MBB = mbb; + + // All registers started out unused. + RegStates.set(); // Create reserved registers bitvector. - ReservedRegs = RegInfo->getReservedRegs(MF); RegStates ^= ReservedRegs; - // Create callee-saved registers bitvector. - CalleeSavedRegs.resize(NumPhysRegs); - const unsigned *CSRegs = RegInfo->getCalleeSavedRegs(); - if (CSRegs != NULL) - for (unsigned i = 0; CSRegs[i]; ++i) - CalleeSavedRegs.set(CSRegs[i]); - // Live-in registers are in use. if (!MBB->livein_empty()) for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), E = MBB->livein_end(); I != E; ++I) setUsed(*I); - - Initialized = true; } void RegScavenger::forward() { - assert(MBBI != MBB->end() && "Already at the end of the basic block!"); // Move ptr forward. - if (!Initialized) - init(); - else + if (!Tracking) { + MBBI = MBB->begin(); + Tracking = true; + } else { + assert(MBBI != MBB->end() && "Already at the end of the basic block!"); MBBI = next(MBBI); + } MachineInstr *MI = MBBI; // Process uses first. @@ -102,6 +108,7 @@ } void RegScavenger::backward() { + assert(Tracking && "Not tracking states!"); assert(MBBI != MBB->begin() && "Already at start of basic block!"); // Move ptr backward. MBBI = prior(MBBI); @@ -168,7 +175,6 @@ MBB = NULL; } - NumPhysRegs = 0; - Initialized = false; + Tracking = false; RegStates.clear(); } From evan.cheng at apple.com Tue Feb 27 17:04:12 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 17:04:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.td Message-ID: <200702272304.l1RN4Ch2002312@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.td updated: 1.10 -> 1.11 --- Log message: Minor tweak. Allocate r0 to r3 in reverse order, r3 is least likely to be livein to a function. --- Diffs of the changes: (+5 -5) ARMRegisterInfo.td | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.td diff -u llvm/lib/Target/ARM/ARMRegisterInfo.td:1.10 llvm/lib/Target/ARM/ARMRegisterInfo.td:1.11 --- llvm/lib/Target/ARM/ARMRegisterInfo.td:1.10 Mon Jan 29 16:23:02 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.td Tue Feb 27 17:03:55 2007 @@ -101,31 +101,31 @@ let MethodBodies = [{ // FP is R11, R9 is available. static const unsigned ARM_GPR_AO_1[] = { - ARM::R0, ARM::R1, ARM::R2, ARM::R3, + ARM::R3, ARM::R2, ARM::R1, ARM::R0, ARM::R4, ARM::R5, ARM::R6, ARM::R7, ARM::R8, ARM::R9, ARM::R10, ARM::LR, ARM::R11 }; // FP is R11, R9 is not available. static const unsigned ARM_GPR_AO_2[] = { - ARM::R0, ARM::R1, ARM::R2, ARM::R3, + ARM::R3, ARM::R2, ARM::R1, ARM::R0, ARM::R4, ARM::R5, ARM::R6, ARM::R7, ARM::R8, ARM::R10, ARM::LR, ARM::R11 }; // FP is R7, R9 is available. static const unsigned ARM_GPR_AO_3[] = { - ARM::R0, ARM::R1, ARM::R2, ARM::R3, + ARM::R3, ARM::R2, ARM::R1, ARM::R0, ARM::R4, ARM::R5, ARM::R6, ARM::R8, ARM::R9, ARM::R10,ARM::R11, ARM::LR, ARM::R7 }; // FP is R7, R9 is not available. static const unsigned ARM_GPR_AO_4[] = { - ARM::R0, ARM::R1, ARM::R2, ARM::R3, + ARM::R3, ARM::R2, ARM::R1, ARM::R0, ARM::R4, ARM::R5, ARM::R6, ARM::R8, ARM::R10,ARM::R11, ARM::LR, ARM::R7 }; // FP is R7, only low registers available. static const unsigned THUMB_GPR_AO[] = { - ARM::R0, ARM::R1, ARM::R2, + ARM::R2, ARM::R1, ARM::R0, ARM::R4, ARM::R5, ARM::R6, ARM::R7 }; GPRClass::iterator From rspencer at reidspencer.com Tue Feb 27 17:25:52 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 27 Feb 2007 15:25:52 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp In-Reply-To: <5B9B2824-3146-4E22-BE33-0545E4B4F293@apple.com> References: <200702270758.l1R7w9o4002473@zion.cs.uiuc.edu> <1172604892.3004.58.camel@bashful.x10sys.com> <1172609509.3004.61.camel@bashful.x10sys.com> <5B9B2824-3146-4E22-BE33-0545E4B4F293@apple.com> Message-ID: <1172618752.3004.65.camel@bashful.x10sys.com> On Tue, 2007-02-27 at 14:20 -0800, Chris Lattner wrote: > On Feb 27, 2007, at 12:51 PM, Reid Spencer wrote: > > Can't we just change this part of ConstantInt: .. snip .. > > > > into: .. snip .. > Yes we could. I would like to do that, but we should do (compile > time) timings to see if it is a significant perf hit. It's basically a DenseMap lookup versus returning a global value. Its going to be slower, but I doubt it makes much difference in the overall scheme of things. In any event, I'm going to leave it as is since we know it will make it slower. The only question is whether cleaning up the extra globals is worth the performance hit. Reid. From reid at x10sys.com Tue Feb 27 17:27:43 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 17:27:43 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp Message-ID: <200702272327.l1RNRh7U002714@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Constants.cpp updated: 1.223 -> 1.224 --- Log message: Remove some redundancy. --- Diffs of the changes: (+1 -4) Constants.cpp | 5 +---- 1 files changed, 1 insertion(+), 4 deletions(-) Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.223 llvm/lib/VMCore/Constants.cpp:1.224 --- llvm/lib/VMCore/Constants.cpp:1.223 Tue Feb 27 01:57:53 2007 +++ llvm/lib/VMCore/Constants.cpp Tue Feb 27 17:27:26 2007 @@ -115,10 +115,7 @@ // Static constructor to create an integral constant with all bits set ConstantInt *ConstantInt::getAllOnesValue(const Type *Ty) { if (const IntegerType* ITy = dyn_cast(Ty)) - if (ITy->getBitWidth() == 1) - return ConstantInt::getTrue(); - else - return ConstantInt::get(Ty, APInt::getAllOnesValue(ITy->getBitWidth())); + return ConstantInt::get(Ty, APInt::getAllOnesValue(ITy->getBitWidth())); return 0; } From reid at x10sys.com Tue Feb 27 17:33:20 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 17:33:20 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp Message-ID: <200702272333.l1RNXKuf002821@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ConstantFold.cpp updated: 1.142 -> 1.143 --- Log message: Pull out the stops. --- Diffs of the changes: (+2 -4) ConstantFold.cpp | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/lib/VMCore/ConstantFold.cpp diff -u llvm/lib/VMCore/ConstantFold.cpp:1.142 llvm/lib/VMCore/ConstantFold.cpp:1.143 --- llvm/lib/VMCore/ConstantFold.cpp:1.142 Tue Feb 27 14:25:25 2007 +++ llvm/lib/VMCore/ConstantFold.cpp Tue Feb 27 17:33:03 2007 @@ -198,13 +198,11 @@ return 0; // Other pointer types cannot be casted case Instruction::UIToFP: if (const ConstantInt *CI = dyn_cast(V)) - if (CI->getType()->getBitWidth() <= 64) - return ConstantFP::get(DestTy, CI->getValue().roundToDouble()); + return ConstantFP::get(DestTy, CI->getValue().roundToDouble()); return 0; case Instruction::SIToFP: if (const ConstantInt *CI = dyn_cast(V)) - if (CI->getType()->getBitWidth() <= 64) - return ConstantFP::get(DestTy, CI->getValue().signedRoundToDouble()); + return ConstantFP::get(DestTy, CI->getValue().signedRoundToDouble()); return 0; case Instruction::ZExt: if (const ConstantInt *CI = dyn_cast(V)) { From rspencer at reidspencer.com Tue Feb 27 17:35:20 2007 From: rspencer at reidspencer.com (Reid Spencer) Date: Tue, 27 Feb 2007 15:35:20 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp In-Reply-To: <102CD72B-3F40-444B-86A2-DEE42EAF2017@apple.com> References: <200702270624.l1R6O7dJ000934@zion.cs.uiuc.edu> <2C85D3EC-77BE-4746-AA46-DE89BBAB2261@apple.com> <1172601445.3004.54.camel@bashful.x10sys.com> <102CD72B-3F40-444B-86A2-DEE42EAF2017@apple.com> Message-ID: <1172619320.3004.73.camel@bashful.x10sys.com> On Tue, 2007-02-27 at 14:17 -0800, Chris Lattner wrote: > >> This seems like a poor choice of API. RoundDoubleToAPInt should take > >> a result bitwidth. Without this, this appears like it could make a > >> "large" APInt, then truncate it down to a small one when converting > >> from double, which is very inefficient. > > > > Done. > > Thanks, but why the default argument? For compatibility with existing code that didn't have that parameter. Call me lazy but I didn't feel like messing with all the test cases that use this. > > >>> case Instruction::UIToFP: > >>> if (const ConstantInt *CI = dyn_cast(V)) > >>> - return ConstantFP::get(DestTy, double(CI->getZExtValue())); > >>> + if (CI->getType()->getBitWidth() <= > >>> APInt::APINT_BITS_PER_WORD) > >>> + return ConstantFP::get(DestTy, CI->getValue().roundToDouble > >>> (false)); > >> > >> Why the check for APINT_BITS_PER_WORD here? APINT_BITS_PER_WORD is > >> an implementation detail of APInt, not a part of its public > >> interface. > > > > Actually it is part of the public interface and it needs to be. For > > example, the constructor that takes an array of words (as might be > > used > > by bcreader) needs to know how many bits are in those words. This > > constant tells you. > > The the interface takes a pointer to uint32_t or uint64_t, it doesn't > matter what the internal size is, it has to work with that array. I have since made a bunch of things in the APInt interface private, including these enum values. > > Additionally, why are you checking this here? What does > APINT_BITS_PER_WORD have to do with whether or not this operation can > be constant folded? It doesn't. Don't know what I was thinking when I wrote that. > > >> Also, please split the roundToDouble method into two > >> methods which don't take a bool. > > > > I don't understand this comment at all. What should these methods do > > differently? > > I'm just saying that instead of: APInt::doFoo(x, bool), we should > have APInt::doFooSigned(x) and APInt::doFooUnsigned(x). This is an > interface change, not a functionality change. Did it several hours ago. > > >>> > >>> @@ -382,7 +412,7 @@ > >>> Ops.reserve(numOps); > >>> for (unsigned i = 0; i < numOps; ++i) { > >>> const Constant *Op = > >>> - (i == idxVal) ? Elt : Constant::getNullValue(Elt->getType > >>> ()); > >>> + (idxVal == i) ? Elt : Constant::getNullValue(Elt->getType > >>> ()); > >> > >> This sort of change makes the diff more noisy, and there is no > >> apparent reason for doing it. Generally, the mutating value (i) is > >> on the LHS, why do this (in many places)? > > > > Becasue there is no operator==(int, APInt) but there is an > > APInt::operator==(int). > > Okay, can you add the other one? You have two options: 1. Overload global operator== (bad practice in my books) 2. Deal with calls like: APIntOps::operator==(i, idxVal) which is uglier than just reversing the operands. What's the big deal about reversing the order of the operands? > > -Chris > > From clattner at apple.com Tue Feb 27 17:43:17 2007 From: clattner at apple.com (Chris Lattner) Date: Tue, 27 Feb 2007 15:43:17 -0800 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFold.cpp In-Reply-To: <1172619320.3004.73.camel@bashful.x10sys.com> References: <200702270624.l1R6O7dJ000934@zion.cs.uiuc.edu> <2C85D3EC-77BE-4746-AA46-DE89BBAB2261@apple.com> <1172601445.3004.54.camel@bashful.x10sys.com> <102CD72B-3F40-444B-86A2-DEE42EAF2017@apple.com> <1172619320.3004.73.camel@bashful.x10sys.com> Message-ID: On Feb 27, 2007, at 3:35 PM, Reid Spencer wrote: > On Tue, 2007-02-27 at 14:17 -0800, Chris Lattner wrote: >>>> This seems like a poor choice of API. RoundDoubleToAPInt should >>>> take >>>> a result bitwidth. Without this, this appears like it could make a >>>> "large" APInt, then truncate it down to a small one when converting >>>> from double, which is very inefficient. >>> >>> Done. >> >> Thanks, but why the default argument? > > For compatibility with existing code that didn't have that parameter. > Call me lazy but I didn't feel like messing with all the test cases > that > use this. The test cases are temporary, right? When they go, the default will go? If you want, I can file a bug so that we don't forget this. >> >> The the interface takes a pointer to uint32_t or uint64_t, it doesn't >> matter what the internal size is, it has to work with that array. > > I have since made a bunch of things in the APInt interface private, > including these enum values. Thanks! >> >> Additionally, why are you checking this here? What does >> APINT_BITS_PER_WORD have to do with whether or not this operation can >> be constant folded? > > It doesn't. Don't know what I was thinking when I wrote that. ok >> I'm just saying that instead of: APInt::doFoo(x, bool), we should >> have APInt::doFooSigned(x) and APInt::doFooUnsigned(x). This is an >> interface change, not a functionality change. > > Did it several hours ago. thanks >> >>>>> >>>>> @@ -382,7 +412,7 @@ >>>>> Ops.reserve(numOps); >>>>> for (unsigned i = 0; i < numOps; ++i) { >>>>> const Constant *Op = >>>>> - (i == idxVal) ? Elt : Constant::getNullValue(Elt->getType >>>>> ()); >>>>> + (idxVal == i) ? Elt : Constant::getNullValue(Elt->getType >>>>> ()); >>>> >>>> This sort of change makes the diff more noisy, and there is no >>>> apparent reason for doing it. Generally, the mutating value (i) is >>>> on the LHS, why do this (in many places)? >>> >>> Becasue there is no operator==(int, APInt) but there is an >>> APInt::operator==(int). >> >> Okay, can you add the other one? > > You have two options: > > 1. Overload global operator== (bad practice in my books) > 2. Deal with calls like: APIntOps::operator==(i, idxVal) which is > uglier > than > just reversing the operands. > > What's the big deal about reversing the order of the operands? What's the problem with #1? It's already overloaded for many other things, as is global operator<< (for printing). -Chris From asl at math.spbu.ru Tue Feb 27 17:50:02 2007 From: asl at math.spbu.ru (Anton Korobeynikov) Date: Wed, 28 Feb 2007 02:50:02 +0300 Subject: [llvm-commits] LowerSwitch improvement patch for review Message-ID: <1172620203.8563.3.camel@asl.dorms.spbu.ru> Hello, Everyone. Please review attached patch for LowerSwitch. Actually, it just "merges" adjacent cases with same destination in one big "case cluster". During emiting comparison tree such clusters result to range comparisons. This is pretty cheap but useful transformation. The same technique is planned for SDISel variant of switch lowering. -- With best regards, Anton Korobeynikov. Faculty of Mathematics & Mechanics, Saint Petersburg State University. -------------- next part -------------- A non-text attachment was scrubbed... Name: ls.diff Type: text/x-patch Size: 8184 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20070228/b89c64d1/attachment.bin From reid at x10sys.com Tue Feb 27 17:47:50 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 17:47:50 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702272347.l1RNloRO003231@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.27 -> 1.28 --- Log message: Add some syntactic sugar. --- Diffs of the changes: (+31 -0) APInt.h | 31 +++++++++++++++++++++++++++++++ 1 files changed, 31 insertions(+) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.27 llvm/include/llvm/ADT/APInt.h:1.28 --- llvm/include/llvm/ADT/APInt.h:1.27 Tue Feb 27 15:59:26 2007 +++ llvm/include/llvm/ADT/APInt.h Tue Feb 27 17:47:33 2007 @@ -446,6 +446,29 @@ return BitWidth - countLeadingZeros(); } + /// This function returns the number of active words in the value of this + /// APInt. This is used in conjunction with getActiveData to extract the raw + /// value of the APInt. + inline uint32_t getActiveWords() const { + return whichWord(getActiveBits()-1); + } + + /// This function returns a pointer to the internal storage of the APInt. + /// This is useful for writing out the APInt in binary form without any + /// conversions. + inline const uint64_t* getRawData() const { + if (isSingleWord()) + return &VAL; + return &pVal[0]; + } + + /// Computes the minimum bit width for this APInt while considering it to be + /// a signed (and probably negative) value. If the value is not negative, + /// this function returns the same value as getActiveBits(). Otherwise, it + /// returns the smallest bit width that will retain the negative value. For + /// example, -1 can be written as 0b1 or 0xFFFFFFFFFF. 0b1 is shorter and so + /// for -1, this function will always return 1. + /// @brief Get the minimum bit size for this signed APInt inline uint32_t getMinSignedBits() const { if (isNegative()) return BitWidth - countLeadingOnes() + 1; @@ -658,6 +681,14 @@ } }; +inline bool operator==(uint64_t V1, const APInt& V2) { + return V2 == V1; +} + +inline bool operator!=(uint64_t V1, const APInt& V2) { + return V2 != V1; +} + namespace APIntOps { /// @brief Check if the specified APInt has a N-bits integer value. From reid at x10sys.com Tue Feb 27 17:49:24 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 17:49:24 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702272349.l1RNnOfv003303@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.56 -> 1.57 --- Log message: Join two lines that can be joined. --- Diffs of the changes: (+1 -2) APInt.cpp | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.56 llvm/lib/Support/APInt.cpp:1.57 --- llvm/lib/Support/APInt.cpp:1.56 Tue Feb 27 15:59:26 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 27 17:49:07 2007 @@ -42,8 +42,7 @@ return result; } -APInt::APInt(uint32_t numBits, uint64_t val) - : BitWidth(numBits), VAL(0) { +APInt::APInt(uint32_t numBits, uint64_t val) : BitWidth(numBits), VAL(0) { assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small"); assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large"); if (isSingleWord()) From evan.cheng at apple.com Tue Feb 27 18:17:10 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:17:10 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/MRegisterInfo.h Message-ID: <200702280017.l1S0HAYQ003775@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: MRegisterInfo.h updated: 1.98 -> 1.99 --- Log message: MRegisterInfo disowns RegScavenger. It's immutable. --- Diffs of the changes: (+8 -7) MRegisterInfo.h | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) Index: llvm/include/llvm/Target/MRegisterInfo.h diff -u llvm/include/llvm/Target/MRegisterInfo.h:1.98 llvm/include/llvm/Target/MRegisterInfo.h:1.99 --- llvm/include/llvm/Target/MRegisterInfo.h:1.98 Tue Feb 27 15:08:07 2007 +++ llvm/include/llvm/Target/MRegisterInfo.h Tue Feb 27 18:16:54 2007 @@ -214,12 +214,6 @@ virtual ~MRegisterInfo(); public: - /// getRegScavenger - Returns pointer to an instance of register scavenger it - /// the specific target is making use of one. - virtual RegScavenger *getRegScavenger() const { - return NULL; - } - enum { // Define some target independent constants /// NoRegister - This physical register is not a real target register. It /// is useful as a sentinal. @@ -398,6 +392,12 @@ return false; } + /// requiresRegisterScavenging - returns true if the target requires (and + /// can make use of) the register scavenger. + virtual bool requiresRegisterScavenging() const { + return false; + } + /// hasFP - Return true if the specified function should have a dedicated frame /// pointer register. For most targets this is true only if the function has /// variable sized allocas or if frame pointer elimination is disabled. @@ -452,7 +452,8 @@ /// finished product. The return value is the number of instructions /// added to (negative if removed from) the basic block. /// - virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI) const = 0; + virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI, + RegScavenger *RS = NULL) const = 0; /// emitProlog/emitEpilog - These methods insert prolog and epilog code into /// the function. The return value is the number of instructions From evan.cheng at apple.com Tue Feb 27 18:17:53 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:17:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/PrologEpilogInserter.cpp Message-ID: <200702280017.l1S0Hr4b003804@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: PrologEpilogInserter.cpp updated: 1.71 -> 1.72 --- Log message: MRegisterInfo disowns RegScavenger. It's immutable. --- Diffs of the changes: (+2 -2) PrologEpilogInserter.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/PrologEpilogInserter.cpp diff -u llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.71 llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.72 --- llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.71 Tue Feb 27 15:10:33 2007 +++ llvm/lib/CodeGen/PrologEpilogInserter.cpp Tue Feb 27 18:17:36 2007 @@ -442,7 +442,7 @@ const TargetMachine &TM = Fn.getTarget(); assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!"); const MRegisterInfo &MRI = *TM.getRegisterInfo(); - RegScavenger *RS = MRI.getRegScavenger(); + RegScavenger *RS = MRI.requiresRegisterScavenging() ? new RegScavenger():NULL; for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) { if (RS) RS->reset(BB); @@ -451,7 +451,7 @@ if (I->getOperand(i).isFrameIndex()) { // If this instruction has a FrameIndex operand, we need to use that // target machine register info object to eliminate it. - MRI.eliminateFrameIndex(I); + MRI.eliminateFrameIndex(I, RS); break; } // Update register states. From evan.cheng at apple.com Tue Feb 27 18:18:48 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:18:48 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp AlphaRegisterInfo.h Message-ID: <200702280018.l1S0ImLD003843@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaRegisterInfo.cpp updated: 1.62 -> 1.63 AlphaRegisterInfo.h updated: 1.21 -> 1.22 --- Log message: PEI now passes a RegScavenger ptr to eliminateFrameIndex. --- Diffs of the changes: (+4 -3) AlphaRegisterInfo.cpp | 4 ++-- AlphaRegisterInfo.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp diff -u llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.62 llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.63 --- llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.62 Thu Feb 22 19:10:03 2007 +++ llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp Tue Feb 27 18:18:31 2007 @@ -245,8 +245,8 @@ //variable locals //<- SP -void -AlphaRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const { +void AlphaRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS) const { unsigned i = 0; MachineInstr &MI = *II; MachineBasicBlock &MBB = *MI.getParent(); Index: llvm/lib/Target/Alpha/AlphaRegisterInfo.h diff -u llvm/lib/Target/Alpha/AlphaRegisterInfo.h:1.21 llvm/lib/Target/Alpha/AlphaRegisterInfo.h:1.22 --- llvm/lib/Target/Alpha/AlphaRegisterInfo.h:1.21 Wed Feb 21 16:54:50 2007 +++ llvm/lib/Target/Alpha/AlphaRegisterInfo.h Tue Feb 27 18:18:31 2007 @@ -57,7 +57,8 @@ MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const; - void eliminateFrameIndex(MachineBasicBlock::iterator II) const; + void eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS = NULL) const; //void processFunctionBeforeFrameFinalized(MachineFunction &MF) const; From evan.cheng at apple.com Tue Feb 27 18:19:09 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:19:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64RegisterInfo.cpp IA64RegisterInfo.h Message-ID: <200702280019.l1S0J9wb003864@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64RegisterInfo.cpp updated: 1.33 -> 1.34 IA64RegisterInfo.h updated: 1.15 -> 1.16 --- Log message: PEI now passes a RegScavenger ptr to eliminateFrameIndex. --- Diffs of the changes: (+4 -2) IA64RegisterInfo.cpp | 3 ++- IA64RegisterInfo.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/Target/IA64/IA64RegisterInfo.cpp diff -u llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.33 llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.34 --- llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.33 Thu Feb 22 19:10:03 2007 +++ llvm/lib/Target/IA64/IA64RegisterInfo.cpp Tue Feb 27 18:18:52 2007 @@ -167,7 +167,8 @@ MBB.erase(I); } -void IA64RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II)const{ +void IA64RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS)const{ unsigned i = 0; MachineInstr &MI = *II; MachineBasicBlock &MBB = *MI.getParent(); Index: llvm/lib/Target/IA64/IA64RegisterInfo.h diff -u llvm/lib/Target/IA64/IA64RegisterInfo.h:1.15 llvm/lib/Target/IA64/IA64RegisterInfo.h:1.16 --- llvm/lib/Target/IA64/IA64RegisterInfo.h:1.15 Wed Feb 21 16:54:50 2007 +++ llvm/lib/Target/IA64/IA64RegisterInfo.h Tue Feb 27 18:18:52 2007 @@ -56,7 +56,8 @@ MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const; - void eliminateFrameIndex(MachineBasicBlock::iterator MI) const; + void eliminateFrameIndex(MachineBasicBlock::iterator MI, + RegScavenger *RS = NULL) const; void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; From evan.cheng at apple.com Tue Feb 27 18:19:43 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:19:43 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp PPCRegisterInfo.h Message-ID: <200702280019.l1S0JhwZ003892@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCRegisterInfo.cpp updated: 1.114 -> 1.115 PPCRegisterInfo.h updated: 1.31 -> 1.32 --- Log message: PEI now passes a RegScavenger ptr to eliminateFrameIndex. --- Diffs of the changes: (+4 -3) PPCRegisterInfo.cpp | 4 ++-- PPCRegisterInfo.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.114 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.115 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.114 Tue Feb 27 05:55:45 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Tue Feb 27 18:19:26 2007 @@ -623,8 +623,8 @@ MBB.erase(II); } -void -PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const { +void PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS) const { // Get the instruction. MachineInstr &MI = *II; // Get the instruction's basic block. Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.h diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.31 llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.32 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.31 Tue Feb 27 05:55:45 2007 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.h Tue Feb 27 18:19:26 2007 @@ -76,7 +76,8 @@ bool usesLR(MachineFunction &MF) const; void lowerDynamicAlloc(MachineBasicBlock::iterator II) const; - void eliminateFrameIndex(MachineBasicBlock::iterator II) const; + void eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS = NULL) const; /// determineFrameLayout - Determine the size of the frame and maximum call /// frame size. From evan.cheng at apple.com Tue Feb 27 18:20:19 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:20:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Sparc/SparcRegisterInfo.cpp SparcRegisterInfo.h Message-ID: <200702280020.l1S0KJjD003922@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Sparc: SparcRegisterInfo.cpp updated: 1.56 -> 1.57 SparcRegisterInfo.h updated: 1.21 -> 1.22 --- Log message: PEI now passes a RegScavenger ptr to eliminateFrameIndex. --- Diffs of the changes: (+4 -3) SparcRegisterInfo.cpp | 4 ++-- SparcRegisterInfo.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/lib/Target/Sparc/SparcRegisterInfo.cpp diff -u llvm/lib/Target/Sparc/SparcRegisterInfo.cpp:1.56 llvm/lib/Target/Sparc/SparcRegisterInfo.cpp:1.57 --- llvm/lib/Target/Sparc/SparcRegisterInfo.cpp:1.56 Thu Feb 22 19:10:04 2007 +++ llvm/lib/Target/Sparc/SparcRegisterInfo.cpp Tue Feb 27 18:20:02 2007 @@ -155,8 +155,8 @@ MBB.erase(I); } -void -SparcRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const { +void SparcRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS) const { unsigned i = 0; MachineInstr &MI = *II; while (!MI.getOperand(i).isFrameIndex()) { Index: llvm/lib/Target/Sparc/SparcRegisterInfo.h diff -u llvm/lib/Target/Sparc/SparcRegisterInfo.h:1.21 llvm/lib/Target/Sparc/SparcRegisterInfo.h:1.22 --- llvm/lib/Target/Sparc/SparcRegisterInfo.h:1.21 Wed Feb 21 16:54:50 2007 +++ llvm/lib/Target/Sparc/SparcRegisterInfo.h Tue Feb 27 18:20:02 2007 @@ -60,7 +60,8 @@ MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const; - void eliminateFrameIndex(MachineBasicBlock::iterator II) const; + void eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS = NULL) const; void processFunctionBeforeFrameFinalized(MachineFunction &MF) const; From evan.cheng at apple.com Tue Feb 27 18:20:43 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:20:43 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.cpp X86RegisterInfo.h Message-ID: <200702280020.l1S0KhQq003945@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86RegisterInfo.cpp updated: 1.205 -> 1.206 X86RegisterInfo.h updated: 1.49 -> 1.50 --- Log message: PEI now passes a RegScavenger ptr to eliminateFrameIndex. --- Diffs of the changes: (+4 -2) X86RegisterInfo.cpp | 3 ++- X86RegisterInfo.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/Target/X86/X86RegisterInfo.cpp diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.205 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.206 --- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.205 Thu Feb 22 19:10:04 2007 +++ llvm/lib/Target/X86/X86RegisterInfo.cpp Tue Feb 27 18:20:26 2007 @@ -968,7 +968,8 @@ MBB.erase(I); } -void X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{ +void X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS) const{ unsigned i = 0; MachineInstr &MI = *II; MachineFunction &MF = *MI.getParent()->getParent(); Index: llvm/lib/Target/X86/X86RegisterInfo.h diff -u llvm/lib/Target/X86/X86RegisterInfo.h:1.49 llvm/lib/Target/X86/X86RegisterInfo.h:1.50 --- llvm/lib/Target/X86/X86RegisterInfo.h:1.49 Wed Feb 21 16:54:50 2007 +++ llvm/lib/Target/X86/X86RegisterInfo.h Tue Feb 27 18:20:26 2007 @@ -90,7 +90,8 @@ MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const; - void eliminateFrameIndex(MachineBasicBlock::iterator MI) const; + void eliminateFrameIndex(MachineBasicBlock::iterator MI, + RegScavenger *RS = NULL) const; void processFunctionBeforeFrameFinalized(MachineFunction &MF) const; From evan.cheng at apple.com Tue Feb 27 18:21:33 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:21:33 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.h Message-ID: <200702280021.l1S0LXVP003977@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.h updated: 1.13 -> 1.14 --- Log message: PEI now passes a RegScavenger ptr to eliminateFrameIndex. --- Diffs of the changes: (+4 -3) ARMRegisterInfo.h | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.h diff -u llvm/lib/Target/ARM/ARMRegisterInfo.h:1.13 llvm/lib/Target/ARM/ARMRegisterInfo.h:1.14 --- llvm/lib/Target/ARM/ARMRegisterInfo.h:1.13 Tue Feb 27 15:12:35 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.h Tue Feb 27 18:21:17 2007 @@ -38,8 +38,6 @@ ~ARMRegisterInfo(); - RegScavenger *getRegScavenger() const; - /// getRegisterNumbering - Given the enum value for some register, e.g. /// ARM::LR, return the number that it corresponds to (e.g. 14). static unsigned getRegisterNumbering(unsigned RegEnum); @@ -76,13 +74,16 @@ BitVector getReservedRegs(const MachineFunction &MF) const; + bool requiresRegisterScavenging() const; + bool hasFP(const MachineFunction &MF) const; void eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const; - void eliminateFrameIndex(MachineBasicBlock::iterator II) const; + void eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS = NULL) const; void processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const; From evan.cheng at apple.com Tue Feb 27 18:22:15 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:22:15 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp Message-ID: <200702280022.l1S0MFOI004002@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.73 -> 1.74 --- Log message: Start making use of RegScavenger. --- Diffs of the changes: (+12 -8) ARMRegisterInfo.cpp | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.73 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.74 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.73 Tue Feb 27 15:12:35 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Tue Feb 27 18:21:58 2007 @@ -85,17 +85,13 @@ : ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP), TII(tii), STI(sti), FramePtr(STI.useThumbBacktraces() ? ARM::R7 : ARM::R11) { - RS = new RegScavenger(); + RS = (EnableScavenging) ? new RegScavenger() : NULL; } ARMRegisterInfo::~ARMRegisterInfo() { delete RS; } -RegScavenger *ARMRegisterInfo::getRegScavenger() const { - return EnableScavenging ? RS : NULL; -} - bool ARMRegisterInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector &CSI) const { @@ -330,6 +326,10 @@ return Reserved; } +bool ARMRegisterInfo::requiresRegisterScavenging() const { + return EnableScavenging; +} + /// hasFP - Return true if the specified function should have a dedicated frame /// pointer register. This is true if the function has variable sized allocas /// or if frame pointer elimination is disabled. @@ -616,7 +616,8 @@ .addReg(DestReg, false, false, true); } -void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{ +void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, + RegScavenger *RS) const{ unsigned i = 0; MachineInstr &MI = *II; MachineBasicBlock &MBB = *MI.getParent(); @@ -898,9 +899,12 @@ // If the offset we have is too large to fit into the instruction, we need // to form it with a series of ADDri's. Do this by taking 8-bit chunks // out of 'Offset'. - emitARMRegPlusImmediate(MBB, II, ARM::R12, FrameReg, + unsigned ScratchReg = RS + ? RS->FindUnusedReg(&ARM::GPRRegClass, true) : (unsigned)ARM::R12; + assert(ScratchReg != 0 && "Unable to find a free call-clobbered register!"); + emitARMRegPlusImmediate(MBB, II, ScratchReg, FrameReg, isSub ? -Offset : Offset, TII); - MI.getOperand(i).ChangeToRegister(ARM::R12, false, false, true); + MI.getOperand(i).ChangeToRegister(ScratchReg, false, false, true); } } From evan.cheng at apple.com Tue Feb 27 18:23:01 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:23:01 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.td Message-ID: <200702280023.l1S0N1QI004027@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.td updated: 1.11 -> 1.12 --- Log message: Temporary: make R12 available in ARM mode if RegScavenger is being used. --- Diffs of the changes: (+53 -12) ARMRegisterInfo.td | 65 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 53 insertions(+), 12 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.td diff -u llvm/lib/Target/ARM/ARMRegisterInfo.td:1.11 llvm/lib/Target/ARM/ARMRegisterInfo.td:1.12 --- llvm/lib/Target/ARM/ARMRegisterInfo.td:1.11 Tue Feb 27 17:03:55 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.td Tue Feb 27 18:22:44 2007 @@ -123,6 +123,32 @@ ARM::R4, ARM::R5, ARM::R6, ARM::R8, ARM::R10,ARM::R11, ARM::LR, ARM::R7 }; + + // FP is R11, R9 is available, R12 is available. + static const unsigned ARM_GPR_AO_5[] = { + ARM::R3, ARM::R2, ARM::R1, ARM::R0, + ARM::R4, ARM::R5, ARM::R6, ARM::R7, + ARM::R8, ARM::R9, ARM::R10,ARM::R12, + ARM::LR, ARM::R11 }; + // FP is R11, R9 is not available, R12 is available. + static const unsigned ARM_GPR_AO_6[] = { + ARM::R3, ARM::R2, ARM::R1, ARM::R0, + ARM::R4, ARM::R5, ARM::R6, ARM::R7, + ARM::R8, ARM::R10,ARM::R12, + ARM::LR, ARM::R11 }; + // FP is R7, R9 is available, R12 is available. + static const unsigned ARM_GPR_AO_7[] = { + ARM::R3, ARM::R2, ARM::R1, ARM::R0, + ARM::R4, ARM::R5, ARM::R6, ARM::R8, + ARM::R9, ARM::R10,ARM::R11,ARM::R12, + ARM::LR, ARM::R7 }; + // FP is R7, R9 is not available, R12 is available. + static const unsigned ARM_GPR_AO_8[] = { + ARM::R3, ARM::R2, ARM::R1, ARM::R0, + ARM::R4, ARM::R5, ARM::R6, ARM::R8, + ARM::R10,ARM::R11,ARM::R12, + ARM::LR, ARM::R7 }; + // FP is R7, only low registers available. static const unsigned THUMB_GPR_AO[] = { ARM::R2, ARM::R1, ARM::R0, @@ -131,19 +157,20 @@ GPRClass::iterator GPRClass::allocation_order_begin(const MachineFunction &MF) const { const TargetMachine &TM = MF.getTarget(); + const MRegisterInfo *RI = TM.getRegisterInfo(); const ARMSubtarget &Subtarget = TM.getSubtarget(); if (Subtarget.isThumb()) return THUMB_GPR_AO; if (Subtarget.useThumbBacktraces()) { if (Subtarget.isR9Reserved()) - return ARM_GPR_AO_4; + return RI->requiresRegisterScavenging() ? ARM_GPR_AO_8 : ARM_GPR_AO_4; else - return ARM_GPR_AO_3; + return RI->requiresRegisterScavenging() ? ARM_GPR_AO_7 : ARM_GPR_AO_3; } else { if (Subtarget.isR9Reserved()) - return ARM_GPR_AO_2; + return RI->requiresRegisterScavenging() ? ARM_GPR_AO_6 : ARM_GPR_AO_2; else - return ARM_GPR_AO_1; + return RI->requiresRegisterScavenging() ? ARM_GPR_AO_5 : ARM_GPR_AO_1; } } @@ -156,15 +183,29 @@ if (Subtarget.isThumb()) I = THUMB_GPR_AO + (sizeof(THUMB_GPR_AO)/sizeof(unsigned)); else if (Subtarget.useThumbBacktraces()) { - if (Subtarget.isR9Reserved()) - I = ARM_GPR_AO_4 + (sizeof(ARM_GPR_AO_4)/sizeof(unsigned)); - else - I = ARM_GPR_AO_3 + (sizeof(ARM_GPR_AO_3)/sizeof(unsigned)); + if (Subtarget.isR9Reserved()) { + if (RI->requiresRegisterScavenging()) + I = ARM_GPR_AO_8 + (sizeof(ARM_GPR_AO_8)/sizeof(unsigned)); + else + I = ARM_GPR_AO_4 + (sizeof(ARM_GPR_AO_4)/sizeof(unsigned)); + } else { + if (RI->requiresRegisterScavenging()) + I = ARM_GPR_AO_7 + (sizeof(ARM_GPR_AO_7)/sizeof(unsigned)); + else + I = ARM_GPR_AO_3 + (sizeof(ARM_GPR_AO_3)/sizeof(unsigned)); + } } else { - if (Subtarget.isR9Reserved()) - I = ARM_GPR_AO_2 + (sizeof(ARM_GPR_AO_2)/sizeof(unsigned)); - else - I = ARM_GPR_AO_1 + (sizeof(ARM_GPR_AO_1)/sizeof(unsigned)); + if (Subtarget.isR9Reserved()) { + if (RI->requiresRegisterScavenging()) + I = ARM_GPR_AO_6 + (sizeof(ARM_GPR_AO_6)/sizeof(unsigned)); + else + I = ARM_GPR_AO_2 + (sizeof(ARM_GPR_AO_2)/sizeof(unsigned)); + } else { + if (RI->requiresRegisterScavenging()) + I = ARM_GPR_AO_5 + (sizeof(ARM_GPR_AO_5)/sizeof(unsigned)); + else + I = ARM_GPR_AO_1 + (sizeof(ARM_GPR_AO_1)/sizeof(unsigned)); + } } // Mac OS X requires FP not to be clobbered for backtracing purpose. From evan.cheng at apple.com Tue Feb 27 18:36:50 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:36:50 -0600 Subject: [llvm-commits] CVS: llvm/test/CodeGen/ARM/shifter_operand.ll Message-ID: <200702280036.l1S0aoRO004285@zion.cs.uiuc.edu> Changes in directory llvm/test/CodeGen/ARM: shifter_operand.ll updated: 1.1 -> 1.2 --- Log message: Fix test case. --- Diffs of the changes: (+2 -2) shifter_operand.ll | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/test/CodeGen/ARM/shifter_operand.ll diff -u llvm/test/CodeGen/ARM/shifter_operand.ll:1.1 llvm/test/CodeGen/ARM/shifter_operand.ll:1.2 --- llvm/test/CodeGen/ARM/shifter_operand.ll:1.1 Fri Jan 19 03:20:23 2007 +++ llvm/test/CodeGen/ARM/shifter_operand.ll Tue Feb 27 18:36:33 2007 @@ -1,5 +1,5 @@ -; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep 'add r0, r0, r1, lsl r2' && -; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep 'bic r0, r0, r1, asr r2' +; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep add | grep lsl && +; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep bic | grep asr int %test1(int %X, int %Y, ubyte %sh) { %A = shl int %Y, ubyte %sh From evan.cheng at apple.com Tue Feb 27 18:57:55 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:57:55 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/MRegisterInfo.h Message-ID: <200702280057.l1S0vt0o004599@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: MRegisterInfo.h updated: 1.99 -> 1.100 --- Log message: Make requiresRegisterScavenging determination on a per MachineFunction basis. --- Diffs of the changes: (+1 -1) MRegisterInfo.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/Target/MRegisterInfo.h diff -u llvm/include/llvm/Target/MRegisterInfo.h:1.99 llvm/include/llvm/Target/MRegisterInfo.h:1.100 --- llvm/include/llvm/Target/MRegisterInfo.h:1.99 Tue Feb 27 18:16:54 2007 +++ llvm/include/llvm/Target/MRegisterInfo.h Tue Feb 27 18:57:39 2007 @@ -394,7 +394,7 @@ /// requiresRegisterScavenging - returns true if the target requires (and /// can make use of) the register scavenger. - virtual bool requiresRegisterScavenging() const { + virtual bool requiresRegisterScavenging(const MachineFunction &MF) const { return false; } From evan.cheng at apple.com Tue Feb 27 18:58:54 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:58:54 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/PrologEpilogInserter.cpp Message-ID: <200702280058.l1S0wsmi004634@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: PrologEpilogInserter.cpp updated: 1.72 -> 1.73 --- Log message: Make requiresRegisterScavenging determination on a per MachineFunction basis. --- Diffs of the changes: (+1 -1) PrologEpilogInserter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/PrologEpilogInserter.cpp diff -u llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.72 llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.73 --- llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.72 Tue Feb 27 18:17:36 2007 +++ llvm/lib/CodeGen/PrologEpilogInserter.cpp Tue Feb 27 18:58:37 2007 @@ -442,7 +442,7 @@ const TargetMachine &TM = Fn.getTarget(); assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!"); const MRegisterInfo &MRI = *TM.getRegisterInfo(); - RegScavenger *RS = MRI.requiresRegisterScavenging() ? new RegScavenger():NULL; + RegScavenger *RS=MRI.requiresRegisterScavenging(Fn) ? new RegScavenger():NULL; for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) { if (RS) RS->reset(BB); From evan.cheng at apple.com Tue Feb 27 18:59:36 2007 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 27 Feb 2007 18:59:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp ARMRegisterInfo.h ARMRegisterInfo.td Message-ID: <200702280059.l1S0xagf004670@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMRegisterInfo.cpp updated: 1.74 -> 1.75 ARMRegisterInfo.h updated: 1.14 -> 1.15 ARMRegisterInfo.td updated: 1.12 -> 1.13 --- Log message: Make requiresRegisterScavenging determination on a per MachineFunction basis. --- Diffs of the changes: (+13 -11) ARMRegisterInfo.cpp | 6 ++++-- ARMRegisterInfo.h | 2 +- ARMRegisterInfo.td | 16 ++++++++-------- 3 files changed, 13 insertions(+), 11 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.74 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.75 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.74 Tue Feb 27 18:21:58 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Tue Feb 27 18:59:19 2007 @@ -326,8 +326,10 @@ return Reserved; } -bool ARMRegisterInfo::requiresRegisterScavenging() const { - return EnableScavenging; +bool +ARMRegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const { + const ARMFunctionInfo *AFI = MF.getInfo(); + return EnableScavenging && !AFI->isThumbFunction(); } /// hasFP - Return true if the specified function should have a dedicated frame Index: llvm/lib/Target/ARM/ARMRegisterInfo.h diff -u llvm/lib/Target/ARM/ARMRegisterInfo.h:1.14 llvm/lib/Target/ARM/ARMRegisterInfo.h:1.15 --- llvm/lib/Target/ARM/ARMRegisterInfo.h:1.14 Tue Feb 27 18:21:17 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.h Tue Feb 27 18:59:19 2007 @@ -74,7 +74,7 @@ BitVector getReservedRegs(const MachineFunction &MF) const; - bool requiresRegisterScavenging() const; + bool requiresRegisterScavenging(const MachineFunction &MF) const; bool hasFP(const MachineFunction &MF) const; Index: llvm/lib/Target/ARM/ARMRegisterInfo.td diff -u llvm/lib/Target/ARM/ARMRegisterInfo.td:1.12 llvm/lib/Target/ARM/ARMRegisterInfo.td:1.13 --- llvm/lib/Target/ARM/ARMRegisterInfo.td:1.12 Tue Feb 27 18:22:44 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.td Tue Feb 27 18:59:19 2007 @@ -163,14 +163,14 @@ return THUMB_GPR_AO; if (Subtarget.useThumbBacktraces()) { if (Subtarget.isR9Reserved()) - return RI->requiresRegisterScavenging() ? ARM_GPR_AO_8 : ARM_GPR_AO_4; + return RI->requiresRegisterScavenging(MF) ? ARM_GPR_AO_8:ARM_GPR_AO_4; else - return RI->requiresRegisterScavenging() ? ARM_GPR_AO_7 : ARM_GPR_AO_3; + return RI->requiresRegisterScavenging(MF) ? ARM_GPR_AO_7:ARM_GPR_AO_3; } else { if (Subtarget.isR9Reserved()) - return RI->requiresRegisterScavenging() ? ARM_GPR_AO_6 : ARM_GPR_AO_2; + return RI->requiresRegisterScavenging(MF) ? ARM_GPR_AO_6:ARM_GPR_AO_2; else - return RI->requiresRegisterScavenging() ? ARM_GPR_AO_5 : ARM_GPR_AO_1; + return RI->requiresRegisterScavenging(MF) ? ARM_GPR_AO_5:ARM_GPR_AO_1; } } @@ -184,24 +184,24 @@ I = THUMB_GPR_AO + (sizeof(THUMB_GPR_AO)/sizeof(unsigned)); else if (Subtarget.useThumbBacktraces()) { if (Subtarget.isR9Reserved()) { - if (RI->requiresRegisterScavenging()) + if (RI->requiresRegisterScavenging(MF)) I = ARM_GPR_AO_8 + (sizeof(ARM_GPR_AO_8)/sizeof(unsigned)); else I = ARM_GPR_AO_4 + (sizeof(ARM_GPR_AO_4)/sizeof(unsigned)); } else { - if (RI->requiresRegisterScavenging()) + if (RI->requiresRegisterScavenging(MF)) I = ARM_GPR_AO_7 + (sizeof(ARM_GPR_AO_7)/sizeof(unsigned)); else I = ARM_GPR_AO_3 + (sizeof(ARM_GPR_AO_3)/sizeof(unsigned)); } } else { if (Subtarget.isR9Reserved()) { - if (RI->requiresRegisterScavenging()) + if (RI->requiresRegisterScavenging(MF)) I = ARM_GPR_AO_6 + (sizeof(ARM_GPR_AO_6)/sizeof(unsigned)); else I = ARM_GPR_AO_2 + (sizeof(ARM_GPR_AO_2)/sizeof(unsigned)); } else { - if (RI->requiresRegisterScavenging()) + if (RI->requiresRegisterScavenging(MF)) I = ARM_GPR_AO_5 + (sizeof(ARM_GPR_AO_5)/sizeof(unsigned)); else I = ARM_GPR_AO_1 + (sizeof(ARM_GPR_AO_1)/sizeof(unsigned)); From reid at x10sys.com Tue Feb 27 19:30:24 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 19:30:24 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp Message-ID: <200702280130.l1S1UOYj005164@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: APInt.cpp updated: 1.57 -> 1.58 --- Log message: Fix a bug in RoundDoubleToAPInt where it would force the size to 64 bits instead of honoring the client's requested bit width. --- Diffs of the changes: (+1 -1) APInt.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.57 llvm/lib/Support/APInt.cpp:1.58 --- llvm/lib/Support/APInt.cpp:1.57 Tue Feb 27 17:49:07 2007 +++ llvm/lib/Support/APInt.cpp Tue Feb 27 19:30:08 2007 @@ -808,7 +808,7 @@ // If the exponent is negative, the value is < 0 so just return 0. if (exp < 0) - return APInt(64u, 0u); + return APInt(width, 0u); // Extract the mantissa by clearing the top 12 bits (sign + exponent). uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52; From reid at x10sys.com Tue Feb 27 20:21:05 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 20:21:05 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h Message-ID: <200702280221.l1S2L5IN006040@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: APInt.h updated: 1.28 -> 1.29 --- Log message: getActiveWords should return the number of words, not the index of the highest active words. Increment its result by one. --- Diffs of the changes: (+1 -1) APInt.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/ADT/APInt.h diff -u llvm/include/llvm/ADT/APInt.h:1.28 llvm/include/llvm/ADT/APInt.h:1.29 --- llvm/include/llvm/ADT/APInt.h:1.28 Tue Feb 27 17:47:33 2007 +++ llvm/include/llvm/ADT/APInt.h Tue Feb 27 20:20:49 2007 @@ -450,7 +450,7 @@ /// APInt. This is used in conjunction with getActiveData to extract the raw /// value of the APInt. inline uint32_t getActiveWords() const { - return whichWord(getActiveBits()-1); + return whichWord(getActiveBits()-1) + 1; } /// This function returns a pointer to the internal storage of the APInt. From reid at x10sys.com Tue Feb 27 20:24:01 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 20:24:01 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y Message-ID: <200702280224.l1S2O1nG006104@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.325 -> 1.326 --- Log message: Implement support for aribrary precision integers by creating two new tokens: ESAPINTVAL and EUAPINTVAL and adding an APInt* as a semantic value. This allows us to extend the definition of an integer constant to allow arbitrary precision integer constant values. --- Diffs of the changes: (+41 -2) llvmAsmParser.y | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 41 insertions(+), 2 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.325 llvm/lib/AsmParser/llvmAsmParser.y:1.326 --- llvm/lib/AsmParser/llvmAsmParser.y:1.325 Wed Feb 14 21:39:17 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y Tue Feb 27 20:23:44 2007 @@ -925,6 +925,7 @@ llvm::GlobalValue::LinkageTypes Linkage; llvm::GlobalValue::VisibilityTypes Visibility; llvm::FunctionType::ParameterAttributes ParamAttrs; + llvm::APInt *APIntVal; int64_t SInt64Val; uint64_t UInt64Val; int SIntVal; @@ -978,6 +979,12 @@ // EUINT64VAL - A positive number within uns. long long range %token EUINT64VAL +// ESAPINTVAL - A negative number with arbitrary precision +%token ESAPINTVAL + +// EUAPINTVAL - A positive number with arbitrary precision +%token EUAPINTVAL + %token LOCALVAL_ID GLOBALVAL_ID // %123 @123 %token FPVAL // Float or Double constant @@ -1704,13 +1711,45 @@ | IntType ESINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) GEN_ERROR("Constant value doesn't fit in type"); - $$ = ConstantInt::get($1, $2); + APInt Val(64, $2); + uint32_t BitWidth = cast($1)->getBitWidth(); + if (BitWidth > 64) + Val.sext(BitWidth); + else if (BitWidth < 64) + Val.trunc(BitWidth); + $$ = ConstantInt::get($1, Val); + CHECK_FOR_ERROR + } + | IntType ESAPINTVAL { // arbitrary precision integer constants + uint32_t BitWidth = cast($1)->getBitWidth(); + if ($2->getBitWidth() > BitWidth) { + GEN_ERROR("Constant value does not fit in type"); + } else if ($2->getBitWidth() < BitWidth) + $2->sext(BitWidth); + else if ($2->getBitWidth() > BitWidth) + $2->trunc(BitWidth); + $$ = ConstantInt::get($1, *$2); + delete $2; CHECK_FOR_ERROR } | IntType EUINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) GEN_ERROR("Constant value doesn't fit in type"); - $$ = ConstantInt::get($1, $2); + uint32_t BitWidth = cast($1)->getBitWidth(); + APInt Val(BitWidth, $2); + $$ = ConstantInt::get($1, Val); + CHECK_FOR_ERROR + } + | IntType EUAPINTVAL { // arbitrary precision integer constants + uint32_t BitWidth = cast($1)->getBitWidth(); + if ($2->getBitWidth() > BitWidth) { + GEN_ERROR("Constant value does not fit in type"); + } else if ($2->getBitWidth() < BitWidth) + $2->zext(BitWidth); + else if ($2->getBitWidth() > BitWidth) + $2->trunc(BitWidth); + $$ = ConstantInt::get($1, *$2); + delete $2; CHECK_FOR_ERROR } | INTTYPE TRUETOK { // Boolean constants From reid at x10sys.com Tue Feb 27 20:24:44 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 20:24:44 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/Lexer.l Message-ID: <200702280224.l1S2Oi6t006126@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: Lexer.l updated: 1.98 -> 1.99 --- Log message: Implement arbitrary integer constants through the use of APInt values. Positive, negative, and hexadecimal integer constants will now return an APInt for values having > 64 bits of precision. --- Diffs of the changes: (+46 -14) Lexer.l | 60 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 46 insertions(+), 14 deletions(-) Index: llvm/lib/AsmParser/Lexer.l diff -u llvm/lib/AsmParser/Lexer.l:1.98 llvm/lib/AsmParser/Lexer.l:1.99 --- llvm/lib/AsmParser/Lexer.l:1.98 Thu Feb 1 20:16:22 2007 +++ llvm/lib/AsmParser/Lexer.l Tue Feb 27 20:24:27 2007 @@ -186,6 +186,7 @@ * it to deal with 64 bit numbers. */ HexIntConstant [us]0x[0-9A-Fa-f]+ + %% {Comment} { /* Ignore comments for now */ } @@ -361,20 +362,51 @@ return ATSTRINGCONSTANT; } - - -{PInteger} { llvmAsmlval.UInt64Val = atoull(yytext); return EUINT64VAL; } -{NInteger} { - uint64_t Val = atoull(yytext+1); - // +1: we have bigger negative range - if (Val > (uint64_t)INT64_MAX+1) - GenerateError("Constant too large for signed 64 bits!"); - llvmAsmlval.SInt64Val = -Val; - return ESINT64VAL; - } -{HexIntConstant} { - llvmAsmlval.UInt64Val = HexIntToVal(yytext+3); - return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; +{PInteger} { int len = strlen(yytext); + uint32_t numBits = ((len * 64) / 19) + 1; + APInt Tmp(numBits, yytext, len, 10); + uint32_t activeBits = Tmp.getActiveBits(); + if (activeBits > 0 && activeBits < numBits) + Tmp.trunc(activeBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return EUAPINTVAL; + } else { + llvmAsmlval.UInt64Val = Tmp.getZExtValue(); + return EUINT64VAL; + } + } +{NInteger} { int len = strlen(yytext); + uint32_t numBits = (((len-1) * 64) / 19) + 1; + APInt Tmp(numBits, yytext, len, 10); + uint32_t minBits = Tmp.getMinSignedBits(); + if (minBits > 0 && minBits < numBits) + Tmp.trunc(minBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return ESAPINTVAL; + } else { + llvmAsmlval.SInt64Val = Tmp.getSExtValue(); + return ESINT64VAL; + } + } + +{HexIntConstant} { int len = strlen(yytext+3) - 3; + uint32_t bits = len * 4; + APInt Tmp(bits, yytext+3, len, 16); + uint32_t activeBits = Tmp.getActiveBits(); + if (activeBits > 0 && activeBits < bits) + Tmp.trunc(activeBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return yytext[0] == 's' ? ESAPINTVAL : EUAPINTVAL; + } else if (yytext[0] == 's') { + llvmAsmlval.SInt64Val = Tmp.getSExtValue(); + return ESINT64VAL; + } else { + llvmAsmlval.UInt64Val = Tmp.getZExtValue(); + return EUINT64VAL; + } } {LocalVarID} { From reid at x10sys.com Tue Feb 27 20:25:11 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 20:25:11 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/Lexer.cpp.cvs Lexer.l.cvs llvmAsmParser.cpp.cvs llvmAsmParser.h.cvs llvmAsmParser.y.cvs Message-ID: <200702280225.l1S2PBd5006154@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: Lexer.cpp.cvs updated: 1.31 -> 1.32 Lexer.l.cvs updated: 1.25 -> 1.26 llvmAsmParser.cpp.cvs updated: 1.70 -> 1.71 llvmAsmParser.h.cvs updated: 1.56 -> 1.57 llvmAsmParser.y.cvs updated: 1.71 -> 1.72 --- Log message: Regenerate. --- Diffs of the changes: (+4588 -3358) Lexer.cpp.cvs | 336 +- Lexer.l.cvs | 60 llvmAsmParser.cpp.cvs | 7035 ++++++++++++++++++++++++++++---------------------- llvmAsmParser.h.cvs | 444 ++- llvmAsmParser.y.cvs | 43 5 files changed, 4588 insertions(+), 3330 deletions(-) Index: llvm/lib/AsmParser/Lexer.cpp.cvs diff -u llvm/lib/AsmParser/Lexer.cpp.cvs:1.31 llvm/lib/AsmParser/Lexer.cpp.cvs:1.32 --- llvm/lib/AsmParser/Lexer.cpp.cvs:1.31 Mon Feb 5 14:47:19 2007 +++ llvm/lib/AsmParser/Lexer.cpp.cvs Tue Feb 27 20:24:54 2007 @@ -20,7 +20,7 @@ /* A lexical scanner generated by flex*/ /* Scanner skeleton version: - * $Header: /var/cvs/llvm/llvm/lib/AsmParser/Lexer.cpp.cvs,v 1.31 2007/02/05 20:47:19 reid Exp $ + * $Header: /var/cvs/llvm/llvm/lib/AsmParser/Lexer.cpp.cvs,v 1.32 2007/02/28 02:24:54 reid Exp $ */ #define FLEX_SCANNER @@ -869,7 +869,7 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 1 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" #define INITIAL 0 /*===-- Lexer.l - Scanner for llvm assembly files --------------*- C++ -*--===// // @@ -884,7 +884,7 @@ // //===----------------------------------------------------------------------===*/ #define YY_NEVER_INTERACTIVE 1 -#line 28 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 28 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" #include "ParserInternals.h" #include "llvm/Module.h" #include @@ -1168,7 +1168,7 @@ register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; -#line 189 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 190 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" #line 1175 "Lexer.cpp" @@ -1264,252 +1264,252 @@ { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 191 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 192 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { /* Ignore comments for now */ } YY_BREAK case 2: YY_RULE_SETUP -#line 193 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 194 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return BEGINTOK; } YY_BREAK case 3: YY_RULE_SETUP -#line 194 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 195 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ENDTOK; } YY_BREAK case 4: YY_RULE_SETUP -#line 195 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 196 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return TRUETOK; } YY_BREAK case 5: YY_RULE_SETUP -#line 196 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 197 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return FALSETOK; } YY_BREAK case 6: YY_RULE_SETUP -#line 197 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 198 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return DECLARE; } YY_BREAK case 7: YY_RULE_SETUP -#line 198 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 199 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return DEFINE; } YY_BREAK case 8: YY_RULE_SETUP -#line 199 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 200 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return GLOBAL; } YY_BREAK case 9: YY_RULE_SETUP -#line 200 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 201 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return CONSTANT; } YY_BREAK case 10: YY_RULE_SETUP -#line 201 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 202 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return INTERNAL; } YY_BREAK case 11: YY_RULE_SETUP -#line 202 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 203 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return LINKONCE; } YY_BREAK case 12: YY_RULE_SETUP -#line 203 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 204 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return WEAK; } YY_BREAK case 13: YY_RULE_SETUP -#line 204 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 205 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return APPENDING; } YY_BREAK case 14: YY_RULE_SETUP -#line 205 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 206 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return DLLIMPORT; } YY_BREAK case 15: YY_RULE_SETUP -#line 206 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 207 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return DLLEXPORT; } YY_BREAK case 16: YY_RULE_SETUP -#line 207 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 208 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return HIDDEN; } YY_BREAK case 17: YY_RULE_SETUP -#line 208 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 209 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return EXTERN_WEAK; } YY_BREAK case 18: YY_RULE_SETUP -#line 209 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 210 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return EXTERNAL; } YY_BREAK case 19: YY_RULE_SETUP -#line 210 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 211 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return IMPLEMENTATION; } YY_BREAK case 20: YY_RULE_SETUP -#line 211 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 212 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ZEROINITIALIZER; } YY_BREAK case 21: YY_RULE_SETUP -#line 212 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 213 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return DOTDOTDOT; } YY_BREAK case 22: YY_RULE_SETUP -#line 213 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 214 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return UNDEF; } YY_BREAK case 23: YY_RULE_SETUP -#line 214 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 215 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return NULL_TOK; } YY_BREAK case 24: YY_RULE_SETUP -#line 215 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 216 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return TO; } YY_BREAK case 25: YY_RULE_SETUP -#line 216 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 217 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return TAIL; } YY_BREAK case 26: YY_RULE_SETUP -#line 217 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 218 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return TARGET; } YY_BREAK case 27: YY_RULE_SETUP -#line 218 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 219 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return TRIPLE; } YY_BREAK case 28: YY_RULE_SETUP -#line 219 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 220 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return DEPLIBS; } YY_BREAK case 29: YY_RULE_SETUP -#line 220 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 221 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return DATALAYOUT; } YY_BREAK case 30: YY_RULE_SETUP -#line 221 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 222 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return VOLATILE; } YY_BREAK case 31: YY_RULE_SETUP -#line 222 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 223 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ALIGN; } YY_BREAK case 32: YY_RULE_SETUP -#line 223 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 224 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return SECTION; } YY_BREAK case 33: YY_RULE_SETUP -#line 224 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 225 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return MODULE; } YY_BREAK case 34: YY_RULE_SETUP -#line 225 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 226 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ASM_TOK; } YY_BREAK case 35: YY_RULE_SETUP -#line 226 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 227 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return SIDEEFFECT; } YY_BREAK case 36: YY_RULE_SETUP -#line 228 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 229 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return CC_TOK; } YY_BREAK case 37: YY_RULE_SETUP -#line 229 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 230 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return CCC_TOK; } YY_BREAK case 38: YY_RULE_SETUP -#line 230 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 231 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return FASTCC_TOK; } YY_BREAK case 39: YY_RULE_SETUP -#line 231 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 232 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return COLDCC_TOK; } YY_BREAK case 40: YY_RULE_SETUP -#line 232 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 233 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return X86_STDCALLCC_TOK; } YY_BREAK case 41: YY_RULE_SETUP -#line 233 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 234 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return X86_FASTCALLCC_TOK; } YY_BREAK case 42: YY_RULE_SETUP -#line 235 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 236 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return INREG; } YY_BREAK case 43: YY_RULE_SETUP -#line 236 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 237 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return SRET; } YY_BREAK case 44: YY_RULE_SETUP -#line 238 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 239 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TY(Type::VoidTy, VOID); } YY_BREAK case 45: YY_RULE_SETUP -#line 239 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 240 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TY(Type::FloatTy, FLOAT); } YY_BREAK case 46: YY_RULE_SETUP -#line 240 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 241 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TY(Type::DoubleTy,DOUBLE);} YY_BREAK case 47: YY_RULE_SETUP -#line 241 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 242 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TY(Type::LabelTy, LABEL); } YY_BREAK case 48: YY_RULE_SETUP -#line 242 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 243 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return TYPE; } YY_BREAK case 49: YY_RULE_SETUP -#line 243 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 244 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return OPAQUE; } YY_BREAK case 50: YY_RULE_SETUP -#line 244 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 245 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { uint64_t NumBits = atoull(yytext+1); if (NumBits < IntegerType::MIN_INT_BITS || NumBits > IntegerType::MAX_INT_BITS) @@ -1520,347 +1520,347 @@ YY_BREAK case 51: YY_RULE_SETUP -#line 252 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 253 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Add, ADD); } YY_BREAK case 52: YY_RULE_SETUP -#line 253 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 254 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Sub, SUB); } YY_BREAK case 53: YY_RULE_SETUP -#line 254 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 255 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Mul, MUL); } YY_BREAK case 54: YY_RULE_SETUP -#line 255 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 256 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, UDiv, UDIV); } YY_BREAK case 55: YY_RULE_SETUP -#line 256 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 257 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, SDiv, SDIV); } YY_BREAK case 56: YY_RULE_SETUP -#line 257 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 258 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, FDiv, FDIV); } YY_BREAK case 57: YY_RULE_SETUP -#line 258 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 259 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, URem, UREM); } YY_BREAK case 58: YY_RULE_SETUP -#line 259 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 260 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, SRem, SREM); } YY_BREAK case 59: YY_RULE_SETUP -#line 260 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 261 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, FRem, FREM); } YY_BREAK case 60: YY_RULE_SETUP -#line 261 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 262 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Shl, SHL); } YY_BREAK case 61: YY_RULE_SETUP -#line 262 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 263 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, LShr, LSHR); } YY_BREAK case 62: YY_RULE_SETUP -#line 263 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 264 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, AShr, ASHR); } YY_BREAK case 63: YY_RULE_SETUP -#line 264 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 265 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, And, AND); } YY_BREAK case 64: YY_RULE_SETUP -#line 265 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 266 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Or , OR ); } YY_BREAK case 65: YY_RULE_SETUP -#line 266 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 267 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Xor, XOR); } YY_BREAK case 66: YY_RULE_SETUP -#line 267 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 268 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ICmp, ICMP); } YY_BREAK case 67: YY_RULE_SETUP -#line 268 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 269 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, FCmp, FCMP); } YY_BREAK case 68: YY_RULE_SETUP -#line 270 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 271 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return EQ; } YY_BREAK case 69: YY_RULE_SETUP -#line 271 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 272 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return NE; } YY_BREAK case 70: YY_RULE_SETUP -#line 272 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 273 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return SLT; } YY_BREAK case 71: YY_RULE_SETUP -#line 273 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 274 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return SGT; } YY_BREAK case 72: YY_RULE_SETUP -#line 274 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 275 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return SLE; } YY_BREAK case 73: YY_RULE_SETUP -#line 275 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 276 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return SGE; } YY_BREAK case 74: YY_RULE_SETUP -#line 276 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 277 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ULT; } YY_BREAK case 75: YY_RULE_SETUP -#line 277 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 278 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return UGT; } YY_BREAK case 76: YY_RULE_SETUP -#line 278 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 279 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ULE; } YY_BREAK case 77: YY_RULE_SETUP -#line 279 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 280 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return UGE; } YY_BREAK case 78: YY_RULE_SETUP -#line 280 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 281 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return OEQ; } YY_BREAK case 79: YY_RULE_SETUP -#line 281 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 282 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ONE; } YY_BREAK case 80: YY_RULE_SETUP -#line 282 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 283 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return OLT; } YY_BREAK case 81: YY_RULE_SETUP -#line 283 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 284 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return OGT; } YY_BREAK case 82: YY_RULE_SETUP -#line 284 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 285 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return OLE; } YY_BREAK case 83: YY_RULE_SETUP -#line 285 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 286 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return OGE; } YY_BREAK case 84: YY_RULE_SETUP -#line 286 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 287 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return ORD; } YY_BREAK case 85: YY_RULE_SETUP -#line 287 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 288 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return UNO; } YY_BREAK case 86: YY_RULE_SETUP -#line 288 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 289 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return UEQ; } YY_BREAK case 87: YY_RULE_SETUP -#line 289 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 290 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return UNE; } YY_BREAK case 88: YY_RULE_SETUP -#line 291 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 292 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, PHI, PHI_TOK); } YY_BREAK case 89: YY_RULE_SETUP -#line 292 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 293 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, Call, CALL); } YY_BREAK case 90: YY_RULE_SETUP -#line 293 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 294 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, Trunc, TRUNC); } YY_BREAK case 91: YY_RULE_SETUP -#line 294 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 295 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, ZExt, ZEXT); } YY_BREAK case 92: YY_RULE_SETUP -#line 295 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 296 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, SExt, SEXT); } YY_BREAK case 93: YY_RULE_SETUP -#line 296 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 297 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPTrunc, FPTRUNC); } YY_BREAK case 94: YY_RULE_SETUP -#line 297 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 298 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPExt, FPEXT); } YY_BREAK case 95: YY_RULE_SETUP -#line 298 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 299 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, UIToFP, UITOFP); } YY_BREAK case 96: YY_RULE_SETUP -#line 299 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 300 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, SIToFP, SITOFP); } YY_BREAK case 97: YY_RULE_SETUP -#line 300 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 301 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPToUI, FPTOUI); } YY_BREAK case 98: YY_RULE_SETUP -#line 301 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 302 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPToSI, FPTOSI); } YY_BREAK case 99: YY_RULE_SETUP -#line 302 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 303 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, IntToPtr, INTTOPTR); } YY_BREAK case 100: YY_RULE_SETUP -#line 303 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 304 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, PtrToInt, PTRTOINT); } YY_BREAK case 101: YY_RULE_SETUP -#line 304 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 305 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, BitCast, BITCAST); } YY_BREAK case 102: YY_RULE_SETUP -#line 305 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 306 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, Select, SELECT); } YY_BREAK case 103: YY_RULE_SETUP -#line 306 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 307 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, VAArg , VAARG); } YY_BREAK case 104: YY_RULE_SETUP -#line 307 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 308 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Ret, RET); } YY_BREAK case 105: YY_RULE_SETUP -#line 308 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 309 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Br, BR); } YY_BREAK case 106: YY_RULE_SETUP -#line 309 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 310 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Switch, SWITCH); } YY_BREAK case 107: YY_RULE_SETUP -#line 310 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 311 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Invoke, INVOKE); } YY_BREAK case 108: YY_RULE_SETUP -#line 311 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 312 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Unwind, UNWIND); } YY_BREAK case 109: YY_RULE_SETUP -#line 312 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 313 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Unreachable, UNREACHABLE); } YY_BREAK case 110: YY_RULE_SETUP -#line 314 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 315 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Malloc, MALLOC); } YY_BREAK case 111: YY_RULE_SETUP -#line 315 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 316 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Alloca, ALLOCA); } YY_BREAK case 112: YY_RULE_SETUP -#line 316 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 317 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Free, FREE); } YY_BREAK case 113: YY_RULE_SETUP -#line 317 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 318 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Load, LOAD); } YY_BREAK case 114: YY_RULE_SETUP -#line 318 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 319 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Store, STORE); } YY_BREAK case 115: YY_RULE_SETUP -#line 319 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 320 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, GetElementPtr, GETELEMENTPTR); } YY_BREAK case 116: YY_RULE_SETUP -#line 321 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 322 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ExtractElement, EXTRACTELEMENT); } YY_BREAK case 117: YY_RULE_SETUP -#line 322 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 323 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, InsertElement, INSERTELEMENT); } YY_BREAK case 118: YY_RULE_SETUP -#line 323 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 324 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ShuffleVector, SHUFFLEVECTOR); } YY_BREAK case 119: YY_RULE_SETUP -#line 326 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 327 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { UnEscapeLexed(yytext+1); llvmAsmlval.StrVal = strdup(yytext+1); // Skip % @@ -1869,7 +1869,7 @@ YY_BREAK case 120: YY_RULE_SETUP -#line 331 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 332 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { UnEscapeLexed(yytext+1); llvmAsmlval.StrVal = strdup(yytext+1); // Skip @ @@ -1878,7 +1878,7 @@ YY_BREAK case 121: YY_RULE_SETUP -#line 336 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 337 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-1] = 0; // nuke colon UnEscapeLexed(yytext); @@ -1888,7 +1888,7 @@ YY_BREAK case 122: YY_RULE_SETUP -#line 342 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 343 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-2] = 0; // nuke colon, end quote UnEscapeLexed(yytext+1); @@ -1898,7 +1898,7 @@ YY_BREAK case 123: YY_RULE_SETUP -#line 349 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 350 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { // Note that we cannot unescape a string constant here! The // string constant might contain a \00 which would not be // understood by the string stuff. It is valid to make a @@ -1911,7 +1911,7 @@ YY_BREAK case 124: YY_RULE_SETUP -#line 358 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 359 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-1] = 0; // nuke end quote llvmAsmlval.StrVal = strdup(yytext+2); // Nuke @, quote @@ -1920,32 +1920,64 @@ YY_BREAK case 125: YY_RULE_SETUP -#line 366 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" -{ llvmAsmlval.UInt64Val = atoull(yytext); return EUINT64VAL; } +#line 365 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" +{ int len = strlen(yytext); + uint32_t numBits = ((len * 64) / 19) + 1; + APInt Tmp(numBits, yytext, len, 10); + uint32_t activeBits = Tmp.getActiveBits(); + if (activeBits > 0 && activeBits < numBits) + Tmp.trunc(activeBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return EUAPINTVAL; + } else { + llvmAsmlval.UInt64Val = Tmp.getZExtValue(); + return EUINT64VAL; + } + } YY_BREAK case 126: YY_RULE_SETUP -#line 367 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" -{ - uint64_t Val = atoull(yytext+1); - // +1: we have bigger negative range - if (Val > (uint64_t)INT64_MAX+1) - GenerateError("Constant too large for signed 64 bits!"); - llvmAsmlval.SInt64Val = -Val; - return ESINT64VAL; +#line 379 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" +{ int len = strlen(yytext); + uint32_t numBits = (((len-1) * 64) / 19) + 1; + APInt Tmp(numBits, yytext, len, 10); + uint32_t minBits = Tmp.getMinSignedBits(); + if (minBits > 0 && minBits < numBits) + Tmp.trunc(minBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return ESAPINTVAL; + } else { + llvmAsmlval.SInt64Val = Tmp.getSExtValue(); + return ESINT64VAL; + } } YY_BREAK case 127: YY_RULE_SETUP -#line 375 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" -{ - llvmAsmlval.UInt64Val = HexIntToVal(yytext+3); - return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; +#line 394 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" +{ int len = strlen(yytext+3) - 3; + uint32_t bits = len * 4; + APInt Tmp(bits, yytext+3, len, 16); + uint32_t activeBits = Tmp.getActiveBits(); + if (activeBits > 0 && activeBits < bits) + Tmp.trunc(activeBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return yytext[0] == 's' ? ESAPINTVAL : EUAPINTVAL; + } else if (yytext[0] == 's') { + llvmAsmlval.SInt64Val = Tmp.getSExtValue(); + return ESINT64VAL; + } else { + llvmAsmlval.UInt64Val = Tmp.getZExtValue(); + return EUINT64VAL; + } } YY_BREAK case 128: YY_RULE_SETUP -#line 380 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 412 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+1); if ((unsigned)Val != Val) @@ -1956,7 +1988,7 @@ YY_BREAK case 129: YY_RULE_SETUP -#line 387 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 419 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+1); if ((unsigned)Val != Val) @@ -1967,16 +1999,16 @@ YY_BREAK case 130: YY_RULE_SETUP -#line 395 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 427 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { llvmAsmlval.FPVal = atof(yytext); return FPVAL; } YY_BREAK case 131: YY_RULE_SETUP -#line 396 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 428 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { llvmAsmlval.FPVal = HexToFP(yytext); return FPVAL; } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 398 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 430 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { /* Make sure to free the internal buffers for flex when we are * done reading our input! @@ -1987,20 +2019,20 @@ YY_BREAK case 132: YY_RULE_SETUP -#line 406 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 438 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { /* Ignore whitespace */ } YY_BREAK case 133: YY_RULE_SETUP -#line 407 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 439 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" { return yytext[0]; } YY_BREAK case 134: YY_RULE_SETUP -#line 409 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 441 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2004 "Lexer.cpp" +#line 2036 "Lexer.cpp" case YY_END_OF_BUFFER: { @@ -2878,5 +2910,5 @@ return 0; } #endif -#line 409 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" +#line 441 "/proj/llvm/llvm-1/lib/AsmParser/Lexer.l" Index: llvm/lib/AsmParser/Lexer.l.cvs diff -u llvm/lib/AsmParser/Lexer.l.cvs:1.25 llvm/lib/AsmParser/Lexer.l.cvs:1.26 --- llvm/lib/AsmParser/Lexer.l.cvs:1.25 Thu Feb 1 20:16:22 2007 +++ llvm/lib/AsmParser/Lexer.l.cvs Tue Feb 27 20:24:54 2007 @@ -186,6 +186,7 @@ * it to deal with 64 bit numbers. */ HexIntConstant [us]0x[0-9A-Fa-f]+ + %% {Comment} { /* Ignore comments for now */ } @@ -361,20 +362,51 @@ return ATSTRINGCONSTANT; } - - -{PInteger} { llvmAsmlval.UInt64Val = atoull(yytext); return EUINT64VAL; } -{NInteger} { - uint64_t Val = atoull(yytext+1); - // +1: we have bigger negative range - if (Val > (uint64_t)INT64_MAX+1) - GenerateError("Constant too large for signed 64 bits!"); - llvmAsmlval.SInt64Val = -Val; - return ESINT64VAL; - } -{HexIntConstant} { - llvmAsmlval.UInt64Val = HexIntToVal(yytext+3); - return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; +{PInteger} { int len = strlen(yytext); + uint32_t numBits = ((len * 64) / 19) + 1; + APInt Tmp(numBits, yytext, len, 10); + uint32_t activeBits = Tmp.getActiveBits(); + if (activeBits > 0 && activeBits < numBits) + Tmp.trunc(activeBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return EUAPINTVAL; + } else { + llvmAsmlval.UInt64Val = Tmp.getZExtValue(); + return EUINT64VAL; + } + } +{NInteger} { int len = strlen(yytext); + uint32_t numBits = (((len-1) * 64) / 19) + 1; + APInt Tmp(numBits, yytext, len, 10); + uint32_t minBits = Tmp.getMinSignedBits(); + if (minBits > 0 && minBits < numBits) + Tmp.trunc(minBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return ESAPINTVAL; + } else { + llvmAsmlval.SInt64Val = Tmp.getSExtValue(); + return ESINT64VAL; + } + } + +{HexIntConstant} { int len = strlen(yytext+3) - 3; + uint32_t bits = len * 4; + APInt Tmp(bits, yytext+3, len, 16); + uint32_t activeBits = Tmp.getActiveBits(); + if (activeBits > 0 && activeBits < bits) + Tmp.trunc(activeBits); + if (Tmp.getBitWidth() > 64) { + llvmAsmlval.APIntVal = new APInt(Tmp); + return yytext[0] == 's' ? ESAPINTVAL : EUAPINTVAL; + } else if (yytext[0] == 's') { + llvmAsmlval.SInt64Val = Tmp.getSExtValue(); + return ESINT64VAL; + } else { + llvmAsmlval.UInt64Val = Tmp.getZExtValue(); + return EUINT64VAL; + } } {LocalVarID} { Index: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.70 llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.71 --- llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.70 Mon Feb 19 01:44:24 2007 +++ llvm/lib/AsmParser/llvmAsmParser.cpp.cvs Tue Feb 27 20:24:54 2007 @@ -1,147 +1,340 @@ +/* A Bison parser, made by GNU Bison 2.1. */ -/* A Bison parser, made from /Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 +/* Substitute the variable and function names. */ #define yyparse llvmAsmparse -#define yylex llvmAsmlex +#define yylex llvmAsmlex #define yyerror llvmAsmerror -#define yylval llvmAsmlval -#define yychar llvmAsmchar +#define yylval llvmAsmlval +#define yychar llvmAsmchar #define yydebug llvmAsmdebug #define yynerrs llvmAsmnerrs -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define LOCALVAL_ID 259 -#define GLOBALVAL_ID 260 -#define FPVAL 261 -#define VOID 262 -#define INTTYPE 263 -#define FLOAT 264 -#define DOUBLE 265 -#define LABEL 266 -#define TYPE 267 -#define LOCALVAR 268 -#define GLOBALVAR 269 -#define LABELSTR 270 -#define STRINGCONSTANT 271 -#define ATSTRINGCONSTANT 272 -#define IMPLEMENTATION 273 -#define ZEROINITIALIZER 274 -#define TRUETOK 275 -#define FALSETOK 276 -#define BEGINTOK 277 -#define ENDTOK 278 -#define DECLARE 279 -#define DEFINE 280 -#define GLOBAL 281 -#define CONSTANT 282 -#define SECTION 283 -#define VOLATILE 284 -#define TO 285 -#define DOTDOTDOT 286 -#define NULL_TOK 287 -#define UNDEF 288 -#define INTERNAL 289 -#define LINKONCE 290 -#define WEAK 291 -#define APPENDING 292 -#define DLLIMPORT 293 -#define DLLEXPORT 294 -#define EXTERN_WEAK 295 -#define OPAQUE 296 -#define EXTERNAL 297 -#define TARGET 298 -#define TRIPLE 299 -#define ALIGN 300 -#define DEPLIBS 301 -#define CALL 302 -#define TAIL 303 -#define ASM_TOK 304 -#define MODULE 305 -#define SIDEEFFECT 306 -#define CC_TOK 307 -#define CCC_TOK 308 -#define FASTCC_TOK 309 -#define COLDCC_TOK 310 -#define X86_STDCALLCC_TOK 311 -#define X86_FASTCALLCC_TOK 312 -#define DATALAYOUT 313 -#define RET 314 -#define BR 315 -#define SWITCH 316 -#define INVOKE 317 -#define UNWIND 318 -#define UNREACHABLE 319 -#define ADD 320 -#define SUB 321 -#define MUL 322 -#define UDIV 323 -#define SDIV 324 -#define FDIV 325 -#define UREM 326 -#define SREM 327 -#define FREM 328 -#define AND 329 -#define OR 330 -#define XOR 331 -#define SHL 332 -#define LSHR 333 -#define ASHR 334 -#define ICMP 335 -#define FCMP 336 -#define EQ 337 -#define NE 338 -#define SLT 339 -#define SGT 340 -#define SLE 341 -#define SGE 342 -#define ULT 343 -#define UGT 344 -#define ULE 345 -#define UGE 346 -#define OEQ 347 -#define ONE 348 -#define OLT 349 -#define OGT 350 -#define OLE 351 -#define OGE 352 -#define ORD 353 -#define UNO 354 -#define UEQ 355 -#define UNE 356 -#define MALLOC 357 -#define ALLOCA 358 -#define FREE 359 -#define LOAD 360 -#define STORE 361 -#define GETELEMENTPTR 362 -#define TRUNC 363 -#define ZEXT 364 -#define SEXT 365 -#define FPTRUNC 366 -#define FPEXT 367 -#define BITCAST 368 -#define UITOFP 369 -#define SITOFP 370 -#define FPTOUI 371 -#define FPTOSI 372 -#define INTTOPTR 373 -#define PTRTOINT 374 -#define PHI_TOK 375 -#define SELECT 376 -#define VAARG 377 -#define EXTRACTELEMENT 378 -#define INSERTELEMENT 379 -#define SHUFFLEVECTOR 380 -#define NORETURN 381 -#define INREG 382 -#define SRET 383 -#define DEFAULT 384 -#define HIDDEN 385 -#line 14 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + ESAPINTVAL = 260, + EUAPINTVAL = 261, + LOCALVAL_ID = 262, + GLOBALVAL_ID = 263, + FPVAL = 264, + VOID = 265, + INTTYPE = 266, + FLOAT = 267, + DOUBLE = 268, + LABEL = 269, + TYPE = 270, + LOCALVAR = 271, + GLOBALVAR = 272, + LABELSTR = 273, + STRINGCONSTANT = 274, + ATSTRINGCONSTANT = 275, + IMPLEMENTATION = 276, + ZEROINITIALIZER = 277, + TRUETOK = 278, + FALSETOK = 279, + BEGINTOK = 280, + ENDTOK = 281, + DECLARE = 282, + DEFINE = 283, + GLOBAL = 284, + CONSTANT = 285, + SECTION = 286, + VOLATILE = 287, + TO = 288, + DOTDOTDOT = 289, + NULL_TOK = 290, + UNDEF = 291, + INTERNAL = 292, + LINKONCE = 293, + WEAK = 294, + APPENDING = 295, + DLLIMPORT = 296, + DLLEXPORT = 297, + EXTERN_WEAK = 298, + OPAQUE = 299, + EXTERNAL = 300, + TARGET = 301, + TRIPLE = 302, + ALIGN = 303, + DEPLIBS = 304, + CALL = 305, + TAIL = 306, + ASM_TOK = 307, + MODULE = 308, + SIDEEFFECT = 309, + CC_TOK = 310, + CCC_TOK = 311, + FASTCC_TOK = 312, + COLDCC_TOK = 313, + X86_STDCALLCC_TOK = 314, + X86_FASTCALLCC_TOK = 315, + DATALAYOUT = 316, + RET = 317, + BR = 318, + SWITCH = 319, + INVOKE = 320, + UNWIND = 321, + UNREACHABLE = 322, + ADD = 323, + SUB = 324, + MUL = 325, + UDIV = 326, + SDIV = 327, + FDIV = 328, + UREM = 329, + SREM = 330, + FREM = 331, + AND = 332, + OR = 333, + XOR = 334, + SHL = 335, + LSHR = 336, + ASHR = 337, + ICMP = 338, + FCMP = 339, + EQ = 340, + NE = 341, + SLT = 342, + SGT = 343, + SLE = 344, + SGE = 345, + ULT = 346, + UGT = 347, + ULE = 348, + UGE = 349, + OEQ = 350, + ONE = 351, + OLT = 352, + OGT = 353, + OLE = 354, + OGE = 355, + ORD = 356, + UNO = 357, + UEQ = 358, + UNE = 359, + MALLOC = 360, + ALLOCA = 361, + FREE = 362, + LOAD = 363, + STORE = 364, + GETELEMENTPTR = 365, + TRUNC = 366, + ZEXT = 367, + SEXT = 368, + FPTRUNC = 369, + FPEXT = 370, + BITCAST = 371, + UITOFP = 372, + SITOFP = 373, + FPTOUI = 374, + FPTOSI = 375, + INTTOPTR = 376, + PTRTOINT = 377, + PHI_TOK = 378, + SELECT = 379, + VAARG = 380, + EXTRACTELEMENT = 381, + INSERTELEMENT = 382, + SHUFFLEVECTOR = 383, + NORETURN = 384, + INREG = 385, + SRET = 386, + DEFAULT = 387, + HIDDEN = 388 + }; +#endif +/* Tokens. */ +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define ESAPINTVAL 260 +#define EUAPINTVAL 261 +#define LOCALVAL_ID 262 +#define GLOBALVAL_ID 263 +#define FPVAL 264 +#define VOID 265 +#define INTTYPE 266 +#define FLOAT 267 +#define DOUBLE 268 +#define LABEL 269 +#define TYPE 270 +#define LOCALVAR 271 +#define GLOBALVAR 272 +#define LABELSTR 273 +#define STRINGCONSTANT 274 +#define ATSTRINGCONSTANT 275 +#define IMPLEMENTATION 276 +#define ZEROINITIALIZER 277 +#define TRUETOK 278 +#define FALSETOK 279 +#define BEGINTOK 280 +#define ENDTOK 281 +#define DECLARE 282 +#define DEFINE 283 +#define GLOBAL 284 +#define CONSTANT 285 +#define SECTION 286 +#define VOLATILE 287 +#define TO 288 +#define DOTDOTDOT 289 +#define NULL_TOK 290 +#define UNDEF 291 +#define INTERNAL 292 +#define LINKONCE 293 +#define WEAK 294 +#define APPENDING 295 +#define DLLIMPORT 296 +#define DLLEXPORT 297 +#define EXTERN_WEAK 298 +#define OPAQUE 299 +#define EXTERNAL 300 +#define TARGET 301 +#define TRIPLE 302 +#define ALIGN 303 +#define DEPLIBS 304 +#define CALL 305 +#define TAIL 306 +#define ASM_TOK 307 +#define MODULE 308 +#define SIDEEFFECT 309 +#define CC_TOK 310 +#define CCC_TOK 311 +#define FASTCC_TOK 312 +#define COLDCC_TOK 313 +#define X86_STDCALLCC_TOK 314 +#define X86_FASTCALLCC_TOK 315 +#define DATALAYOUT 316 +#define RET 317 +#define BR 318 +#define SWITCH 319 +#define INVOKE 320 +#define UNWIND 321 +#define UNREACHABLE 322 +#define ADD 323 +#define SUB 324 +#define MUL 325 +#define UDIV 326 +#define SDIV 327 +#define FDIV 328 +#define UREM 329 +#define SREM 330 +#define FREM 331 +#define AND 332 +#define OR 333 +#define XOR 334 +#define SHL 335 +#define LSHR 336 +#define ASHR 337 +#define ICMP 338 +#define FCMP 339 +#define EQ 340 +#define NE 341 +#define SLT 342 +#define SGT 343 +#define SLE 344 +#define SGE 345 +#define ULT 346 +#define UGT 347 +#define ULE 348 +#define UGE 349 +#define OEQ 350 +#define ONE 351 +#define OLT 352 +#define OGT 353 +#define OLE 354 +#define OGE 355 +#define ORD 356 +#define UNO 357 +#define UEQ 358 +#define UNE 359 +#define MALLOC 360 +#define ALLOCA 361 +#define FREE 362 +#define LOAD 363 +#define STORE 364 +#define GETELEMENTPTR 365 +#define TRUNC 366 +#define ZEXT 367 +#define SEXT 368 +#define FPTRUNC 369 +#define FPEXT 370 +#define BITCAST 371 +#define UITOFP 372 +#define SITOFP 373 +#define FPTOUI 374 +#define FPTOSI 375 +#define INTTOPTR 376 +#define PTRTOINT 377 +#define PHI_TOK 378 +#define SELECT 379 +#define VAARG 380 +#define EXTRACTELEMENT 381 +#define INSERTELEMENT 382 +#define SHUFFLEVECTOR 383 +#define NORETURN 384 +#define INREG 385 +#define SRET 386 +#define DEFAULT 387 +#define HIDDEN 388 + + + + +/* Copy the first part of user declarations. */ +#line 14 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" @@ -1028,8 +1221,28 @@ } -#line 901 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -typedef union { + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 901 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; llvm::BasicBlock *BasicBlockVal; @@ -1056,6 +1269,7 @@ llvm::GlobalValue::LinkageTypes Linkage; llvm::GlobalValue::VisibilityTypes Visibility; llvm::FunctionType::ParameterAttributes ParamAttrs; + llvm::APInt *APIntVal; int64_t SInt64Val; uint64_t UInt64Val; int SIntVal; @@ -1074,1061 +1288,1517 @@ llvm::ICmpInst::Predicate IPredicate; llvm::FCmpInst::Predicate FPredicate; } YYSTYPE; -#include +/* Line 196 of yacc.c. */ +#line 1293 "llvmAsmParser.tab.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 219 of yacc.c. */ +#line 1305 "llvmAsmParser.tab.c" + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + }; -#define YYFINAL 557 -#define YYFLAG -32768 -#define YYNTBASE 146 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 385 ? yytranslate[x] : 223) - -static const short yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 136, - 137, 134, 2, 133, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 141, - 132, 142, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 138, 135, 140, 2, 2, 2, 2, 2, 145, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, - 2, 2, 143, 2, 144, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131 -}; +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, - 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, - 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, - 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, - 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, - 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, - 119, 122, 123, 125, 127, 130, 131, 133, 135, 137, - 139, 141, 143, 145, 147, 148, 150, 151, 153, 155, - 156, 158, 160, 162, 164, 165, 167, 169, 171, 173, - 175, 178, 180, 182, 184, 186, 187, 190, 192, 194, - 195, 198, 199, 202, 203, 207, 210, 211, 213, 214, - 218, 220, 223, 225, 227, 229, 231, 233, 235, 238, - 240, 243, 249, 255, 261, 267, 271, 274, 280, 285, - 288, 290, 292, 294, 298, 300, 304, 306, 307, 309, - 313, 318, 322, 326, 331, 336, 340, 347, 353, 356, - 359, 362, 365, 368, 371, 374, 377, 380, 383, 390, - 396, 405, 412, 419, 427, 435, 442, 451, 460, 464, - 466, 468, 470, 472, 473, 475, 478, 479, 483, 484, - 488, 492, 494, 498, 502, 503, 510, 511, 519, 520, - 528, 531, 535, 537, 541, 545, 549, 553, 555, 556, - 562, 566, 568, 572, 574, 575, 585, 587, 589, 594, - 596, 598, 601, 605, 606, 608, 610, 612, 614, 616, - 618, 620, 622, 624, 628, 630, 636, 638, 640, 642, - 644, 646, 648, 651, 654, 657, 661, 664, 665, 667, - 670, 673, 677, 687, 697, 706, 721, 723, 725, 732, - 738, 741, 748, 756, 760, 766, 767, 768, 772, 775, - 777, 783, 789, 796, 803, 808, 815, 820, 825, 832, - 839, 842, 851, 853, 855, 856, 860, 867, 871, 878, - 881, 886, 893 -}; +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) -static const short yyrhs[] = { 66, - 0, 67, 0, 68, 0, 69, 0, 70, 0, 71, - 0, 72, 0, 73, 0, 74, 0, 78, 0, 79, - 0, 80, 0, 75, 0, 76, 0, 77, 0, 109, - 0, 110, 0, 111, 0, 112, 0, 113, 0, 114, - 0, 115, 0, 116, 0, 117, 0, 118, 0, 119, - 0, 120, 0, 83, 0, 84, 0, 85, 0, 86, - 0, 87, 0, 88, 0, 89, 0, 90, 0, 91, - 0, 92, 0, 93, 0, 94, 0, 95, 0, 96, - 0, 97, 0, 98, 0, 99, 0, 100, 0, 101, - 0, 102, 0, 89, 0, 90, 0, 91, 0, 92, - 0, 21, 0, 22, 0, 9, 0, 10, 0, 11, - 0, 14, 0, 17, 0, 153, 0, 0, 153, 132, - 0, 0, 15, 0, 18, 0, 156, 132, 0, 0, - 35, 0, 37, 0, 36, 0, 38, 0, 40, 0, - 39, 0, 41, 0, 43, 0, 0, 131, 0, 0, - 39, 0, 41, 0, 0, 35, 0, 36, 0, 37, - 0, 40, 0, 0, 54, 0, 55, 0, 56, 0, - 57, 0, 58, 0, 53, 4, 0, 110, 0, 111, - 0, 128, 0, 129, 0, 0, 165, 164, 0, 127, - 0, 164, 0, 0, 167, 166, 0, 0, 46, 4, - 0, 0, 133, 46, 4, 0, 29, 17, 0, 0, - 170, 0, 0, 133, 173, 172, 0, 170, 0, 46, - 4, 0, 9, 0, 10, 0, 11, 0, 12, 0, - 42, 0, 174, 0, 175, 134, 0, 207, 0, 135, - 4, 0, 175, 136, 179, 137, 167, 0, 8, 136, - 179, 137, 167, 0, 138, 4, 139, 175, 140, 0, - 141, 4, 139, 175, 142, 0, 143, 180, 144, 0, - 143, 144, 0, 141, 143, 180, 144, 142, 0, 141, - 143, 144, 142, 0, 175, 165, 0, 175, 0, 8, - 0, 176, 0, 178, 133, 176, 0, 178, 0, 178, - 133, 32, 0, 32, 0, 0, 175, 0, 180, 133, - 175, 0, 175, 138, 183, 140, 0, 175, 138, 140, - 0, 175, 145, 17, 0, 175, 141, 183, 142, 0, - 175, 143, 183, 144, 0, 175, 143, 144, 0, 175, - 141, 143, 183, 144, 142, 0, 175, 141, 143, 144, - 142, 0, 175, 33, 0, 175, 34, 0, 175, 207, - 0, 175, 182, 0, 175, 20, 0, 151, 3, 0, - 151, 4, 0, 9, 21, 0, 9, 22, 0, 152, - 7, 0, 148, 136, 181, 31, 175, 137, 0, 108, - 136, 181, 218, 137, 0, 122, 136, 181, 133, 181, - 133, 181, 137, 0, 146, 136, 181, 133, 181, 137, - 0, 147, 136, 181, 133, 181, 137, 0, 81, 149, - 136, 181, 133, 181, 137, 0, 82, 150, 136, 181, - 133, 181, 137, 0, 124, 136, 181, 133, 181, 137, - 0, 125, 136, 181, 133, 181, 133, 181, 137, 0, - 126, 136, 181, 133, 181, 133, 181, 137, 0, 183, - 133, 181, 0, 181, 0, 27, 0, 28, 0, 186, - 0, 0, 187, 0, 186, 187, 0, 0, 26, 188, - 203, 0, 0, 25, 189, 204, 0, 51, 50, 193, - 0, 19, 0, 155, 13, 175, 0, 155, 13, 8, - 0, 0, 157, 160, 184, 181, 190, 172, 0, 0, - 157, 158, 160, 184, 181, 191, 172, 0, 0, 157, - 159, 160, 184, 175, 192, 172, 0, 44, 194, 0, - 47, 132, 195, 0, 17, 0, 45, 132, 17, 0, - 59, 132, 17, 0, 138, 196, 140, 0, 196, 133, - 17, 0, 17, 0, 0, 197, 133, 175, 165, 154, - 0, 175, 165, 154, 0, 197, 0, 197, 133, 32, - 0, 32, 0, 0, 163, 177, 156, 136, 198, 137, - 167, 171, 168, 0, 23, 0, 143, 0, 162, 160, - 199, 200, 0, 24, 0, 144, 0, 210, 202, 0, - 161, 160, 199, 0, 0, 52, 0, 3, 0, 4, - 0, 7, 0, 21, 0, 22, 0, 33, 0, 34, - 0, 20, 0, 141, 183, 142, 0, 182, 0, 50, - 205, 17, 133, 17, 0, 5, 0, 6, 0, 153, - 0, 156, 0, 207, 0, 206, 0, 175, 208, 0, - 210, 211, 0, 201, 211, 0, 212, 155, 213, 0, - 212, 215, 0, 0, 16, 0, 60, 209, 0, 60, - 8, 0, 61, 12, 208, 0, 61, 9, 208, 133, - 12, 208, 133, 12, 208, 0, 62, 151, 208, 133, - 12, 208, 138, 214, 140, 0, 62, 151, 208, 133, - 12, 208, 138, 140, 0, 63, 163, 177, 208, 136, - 217, 137, 167, 31, 12, 208, 64, 12, 208, 0, - 64, 0, 65, 0, 214, 151, 206, 133, 12, 208, - 0, 151, 206, 133, 12, 208, 0, 155, 220, 0, - 175, 138, 208, 133, 208, 140, 0, 216, 133, 138, - 208, 133, 208, 140, 0, 175, 208, 165, 0, 217, - 133, 175, 208, 165, 0, 0, 0, 218, 133, 209, - 0, 49, 48, 0, 48, 0, 146, 175, 208, 133, - 208, 0, 147, 175, 208, 133, 208, 0, 81, 149, - 175, 208, 133, 208, 0, 82, 150, 175, 208, 133, - 208, 0, 148, 209, 31, 175, 0, 122, 209, 133, - 209, 133, 209, 0, 123, 209, 133, 175, 0, 124, - 209, 133, 209, 0, 125, 209, 133, 209, 133, 209, - 0, 126, 209, 133, 209, 133, 209, 0, 121, 216, - 0, 219, 163, 177, 208, 136, 217, 137, 167, 0, - 222, 0, 30, 0, 0, 103, 175, 169, 0, 103, - 175, 133, 9, 208, 169, 0, 104, 175, 169, 0, - 104, 175, 133, 9, 208, 169, 0, 105, 209, 0, - 221, 106, 175, 208, 0, 221, 107, 209, 133, 175, - 208, 0, 108, 175, 208, 218, 0 -}; +#endif +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; #endif -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1049, - 1049, 1049, 1049, 1049, 1049, 1050, 1050, 1050, 1050, 1050, - 1050, 1050, 1051, 1051, 1051, 1051, 1051, 1054, 1054, 1055, - 1055, 1056, 1056, 1057, 1057, 1058, 1058, 1062, 1062, 1063, - 1063, 1064, 1064, 1065, 1065, 1066, 1066, 1067, 1067, 1068, - 1068, 1069, 1070, 1075, 1076, 1076, 1078, 1078, 1079, 1079, - 1083, 1087, 1092, 1092, 1094, 1098, 1104, 1105, 1106, 1107, - 1108, 1112, 1113, 1114, 1118, 1119, 1123, 1124, 1125, 1129, - 1130, 1131, 1132, 1133, 1136, 1136, 1137, 1138, 1139, 1140, - 1141, 1149, 1150, 1151, 1152, 1155, 1156, 1161, 1162, 1165, - 1166, 1173, 1173, 1180, 1180, 1189, 1197, 1197, 1203, 1203, - 1205, 1210, 1223, 1223, 1223, 1223, 1226, 1230, 1234, 1241, - 1246, 1254, 1272, 1290, 1295, 1307, 1317, 1321, 1331, 1338, - 1345, 1352, 1357, 1362, 1369, 1370, 1377, 1384, 1392, 1397, - 1408, 1436, 1452, 1481, 1509, 1534, 1553, 1579, 1599, 1611, - 1618, 1684, 1694, 1704, 1710, 1716, 1721, 1726, 1734, 1746, - 1768, 1776, 1782, 1793, 1798, 1803, 1809, 1815, 1824, 1828, - 1836, 1836, 1847, 1852, 1860, 1861, 1865, 1865, 1869, 1869, - 1872, 1875, 1887, 1911, 1922, 1929, 1932, 1937, 1940, 1946, - 1950, 1953, 1959, 1972, 1976, 1981, 1983, 1988, 1993, 2002, - 2012, 2023, 2027, 2036, 2045, 2050, 2162, 2162, 2164, 2173, - 2173, 2175, 2180, 2192, 2196, 2201, 2205, 2209, 2213, 2217, - 2221, 2225, 2229, 2233, 2258, 2262, 2276, 2280, 2284, 2288, - 2294, 2294, 2300, 2309, 2313, 2322, 2332, 2341, 2353, 2366, - 2370, 2374, 2379, 2389, 2408, 2417, 2484, 2488, 2495, 2506, - 2519, 2529, 2540, 2550, 2558, 2566, 2569, 2570, 2577, 2581, - 2586, 2607, 2624, 2637, 2650, 2662, 2670, 2677, 2683, 2689, - 2695, 2710, 2774, 2779, 2783, 2790, 2797, 2805, 2812, 2820, - 2828, 2842, 2859 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 40 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 1429 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 148 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 78 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 286 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 559 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 388 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 138, 139, 136, 2, 135, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 143, 134, 144, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 140, 137, 142, 2, 2, 2, 2, 2, 147, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 141, 2, 2, 145, 2, 146, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133 }; -#endif +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short int yyprhs[] = +{ + 0, 0, 3, 5, 7, 9, 11, 13, 15, 17, + 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, + 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, + 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, + 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, + 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, + 119, 121, 122, 125, 126, 128, 130, 133, 134, 136, + 138, 140, 142, 144, 146, 148, 150, 151, 153, 154, + 156, 158, 159, 161, 163, 165, 167, 168, 170, 172, + 174, 176, 178, 181, 183, 185, 187, 189, 190, 193, + 195, 197, 198, 201, 202, 205, 206, 210, 213, 214, + 216, 217, 221, 223, 226, 228, 230, 232, 234, 236, + 238, 241, 243, 246, 252, 258, 264, 270, 274, 277, + 283, 288, 291, 293, 295, 297, 301, 303, 307, 309, + 310, 312, 316, 321, 325, 329, 334, 339, 343, 350, + 356, 359, 362, 365, 368, 371, 374, 377, 380, 383, + 386, 389, 392, 399, 405, 414, 421, 428, 436, 444, + 451, 460, 469, 473, 475, 477, 479, 481, 482, 484, + 487, 488, 492, 493, 497, 501, 503, 507, 511, 512, + 519, 520, 528, 529, 537, 540, 544, 546, 550, 554, + 558, 562, 564, 565, 571, 575, 577, 581, 583, 584, + 594, 596, 598, 603, 605, 607, 610, 614, 615, 617, + 619, 621, 623, 625, 627, 629, 631, 633, 637, 639, + 645, 647, 649, 651, 653, 655, 657, 660, 663, 666, + 670, 673, 674, 676, 679, 682, 686, 696, 706, 715, + 730, 732, 734, 741, 747, 750, 757, 765, 769, 775, + 776, 777, 781, 784, 786, 792, 798, 805, 812, 817, + 824, 829, 834, 841, 848, 851, 860, 862, 864, 865, + 869, 876, 880, 887, 890, 895, 902 +}; -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short int yyrhs[] = +{ + 188, 0, -1, 68, -1, 69, -1, 70, -1, 71, + -1, 72, -1, 73, -1, 74, -1, 75, -1, 76, + -1, 80, -1, 81, -1, 82, -1, 77, -1, 78, + -1, 79, -1, 111, -1, 112, -1, 113, -1, 114, + -1, 115, -1, 116, -1, 117, -1, 118, -1, 119, + -1, 120, -1, 121, -1, 122, -1, 85, -1, 86, + -1, 87, -1, 88, -1, 89, -1, 90, -1, 91, + -1, 92, -1, 93, -1, 94, -1, 95, -1, 96, + -1, 97, -1, 98, -1, 99, -1, 100, -1, 101, + -1, 102, -1, 103, -1, 104, -1, 91, -1, 92, + -1, 93, -1, 94, -1, 23, -1, 24, -1, 11, + -1, 12, -1, 13, -1, 16, -1, 19, -1, 156, + -1, -1, 156, 134, -1, -1, 17, -1, 20, -1, + 159, 134, -1, -1, 37, -1, 39, -1, 38, -1, + 40, -1, 42, -1, 41, -1, 43, -1, 45, -1, + -1, 133, -1, -1, 41, -1, 43, -1, -1, 37, + -1, 38, -1, 39, -1, 42, -1, -1, 56, -1, + 57, -1, 58, -1, 59, -1, 60, -1, 55, 4, + -1, 112, -1, 113, -1, 130, -1, 131, -1, -1, + 168, 167, -1, 129, -1, 167, -1, -1, 170, 169, + -1, -1, 48, 4, -1, -1, 135, 48, 4, -1, + 31, 19, -1, -1, 173, -1, -1, 135, 176, 175, + -1, 173, -1, 48, 4, -1, 11, -1, 12, -1, + 13, -1, 14, -1, 44, -1, 177, -1, 178, 136, + -1, 210, -1, 137, 4, -1, 178, 138, 182, 139, + 170, -1, 10, 138, 182, 139, 170, -1, 140, 4, + 141, 178, 142, -1, 143, 4, 141, 178, 144, -1, + 145, 183, 146, -1, 145, 146, -1, 143, 145, 183, + 146, 144, -1, 143, 145, 146, 144, -1, 178, 168, + -1, 178, -1, 10, -1, 179, -1, 181, 135, 179, + -1, 181, -1, 181, 135, 34, -1, 34, -1, -1, + 178, -1, 183, 135, 178, -1, 178, 140, 186, 142, + -1, 178, 140, 142, -1, 178, 147, 19, -1, 178, + 143, 186, 144, -1, 178, 145, 186, 146, -1, 178, + 145, 146, -1, 178, 143, 145, 186, 146, 144, -1, + 178, 143, 145, 146, 144, -1, 178, 35, -1, 178, + 36, -1, 178, 210, -1, 178, 185, -1, 178, 22, + -1, 154, 3, -1, 154, 5, -1, 154, 4, -1, + 154, 6, -1, 11, 23, -1, 11, 24, -1, 155, + 9, -1, 151, 138, 184, 33, 178, 139, -1, 110, + 138, 184, 221, 139, -1, 124, 138, 184, 135, 184, + 135, 184, 139, -1, 149, 138, 184, 135, 184, 139, + -1, 150, 138, 184, 135, 184, 139, -1, 83, 152, + 138, 184, 135, 184, 139, -1, 84, 153, 138, 184, + 135, 184, 139, -1, 126, 138, 184, 135, 184, 139, + -1, 127, 138, 184, 135, 184, 135, 184, 139, -1, + 128, 138, 184, 135, 184, 135, 184, 139, -1, 186, + 135, 184, -1, 184, -1, 29, -1, 30, -1, 189, + -1, -1, 190, -1, 189, 190, -1, -1, 28, 191, + 206, -1, -1, 27, 192, 207, -1, 53, 52, 196, + -1, 21, -1, 158, 15, 178, -1, 158, 15, 10, + -1, -1, 160, 163, 187, 184, 193, 175, -1, -1, + 160, 161, 163, 187, 184, 194, 175, -1, -1, 160, + 162, 163, 187, 178, 195, 175, -1, 46, 197, -1, + 49, 134, 198, -1, 19, -1, 47, 134, 19, -1, + 61, 134, 19, -1, 140, 199, 142, -1, 199, 135, + 19, -1, 19, -1, -1, 200, 135, 178, 168, 157, + -1, 178, 168, 157, -1, 200, -1, 200, 135, 34, + -1, 34, -1, -1, 166, 180, 159, 138, 201, 139, + 170, 174, 171, -1, 25, -1, 145, -1, 165, 163, + 202, 203, -1, 26, -1, 146, -1, 213, 205, -1, + 164, 163, 202, -1, -1, 54, -1, 3, -1, 4, + -1, 9, -1, 23, -1, 24, -1, 35, -1, 36, + -1, 22, -1, 143, 186, 144, -1, 185, -1, 52, + 208, 19, 135, 19, -1, 7, -1, 8, -1, 156, + -1, 159, -1, 210, -1, 209, -1, 178, 211, -1, + 213, 214, -1, 204, 214, -1, 215, 158, 216, -1, + 215, 218, -1, -1, 18, -1, 62, 212, -1, 62, + 10, -1, 63, 14, 211, -1, 63, 11, 211, 135, + 14, 211, 135, 14, 211, -1, 64, 154, 211, 135, + 14, 211, 140, 217, 142, -1, 64, 154, 211, 135, + 14, 211, 140, 142, -1, 65, 166, 180, 211, 138, + 220, 139, 170, 33, 14, 211, 66, 14, 211, -1, + 66, -1, 67, -1, 217, 154, 209, 135, 14, 211, + -1, 154, 209, 135, 14, 211, -1, 158, 223, -1, + 178, 140, 211, 135, 211, 142, -1, 219, 135, 140, + 211, 135, 211, 142, -1, 178, 211, 168, -1, 220, + 135, 178, 211, 168, -1, -1, -1, 221, 135, 212, + -1, 51, 50, -1, 50, -1, 149, 178, 211, 135, + 211, -1, 150, 178, 211, 135, 211, -1, 83, 152, + 178, 211, 135, 211, -1, 84, 153, 178, 211, 135, + 211, -1, 151, 212, 33, 178, -1, 124, 212, 135, + 212, 135, 212, -1, 125, 212, 135, 178, -1, 126, + 212, 135, 212, -1, 127, 212, 135, 212, 135, 212, + -1, 128, 212, 135, 212, 135, 212, -1, 123, 219, + -1, 222, 166, 180, 211, 138, 220, 139, 170, -1, + 225, -1, 32, -1, -1, 105, 178, 172, -1, 105, + 178, 135, 11, 211, 172, -1, 106, 178, 172, -1, + 106, 178, 135, 11, 211, 172, -1, 107, 212, -1, + 224, 108, 178, 211, -1, 224, 109, 212, 135, 178, + 211, -1, 110, 178, 211, 221, -1 +}; -static const char * const yytname[] = { "$","error","$undefined.","ESINT64VAL", -"EUINT64VAL","LOCALVAL_ID","GLOBALVAL_ID","FPVAL","VOID","INTTYPE","FLOAT","DOUBLE", -"LABEL","TYPE","LOCALVAR","GLOBALVAR","LABELSTR","STRINGCONSTANT","ATSTRINGCONSTANT", -"IMPLEMENTATION","ZEROINITIALIZER","TRUETOK","FALSETOK","BEGINTOK","ENDTOK", -"DECLARE","DEFINE","GLOBAL","CONSTANT","SECTION","VOLATILE","TO","DOTDOTDOT", -"NULL_TOK","UNDEF","INTERNAL","LINKONCE","WEAK","APPENDING","DLLIMPORT","DLLEXPORT", -"EXTERN_WEAK","OPAQUE","EXTERNAL","TARGET","TRIPLE","ALIGN","DEPLIBS","CALL", -"TAIL","ASM_TOK","MODULE","SIDEEFFECT","CC_TOK","CCC_TOK","FASTCC_TOK","COLDCC_TOK", -"X86_STDCALLCC_TOK","X86_FASTCALLCC_TOK","DATALAYOUT","RET","BR","SWITCH","INVOKE", -"UNWIND","UNREACHABLE","ADD","SUB","MUL","UDIV","SDIV","FDIV","UREM","SREM", -"FREM","AND","OR","XOR","SHL","LSHR","ASHR","ICMP","FCMP","EQ","NE","SLT","SGT", -"SLE","SGE","ULT","UGT","ULE","UGE","OEQ","ONE","OLT","OGT","OLE","OGE","ORD", -"UNO","UEQ","UNE","MALLOC","ALLOCA","FREE","LOAD","STORE","GETELEMENTPTR","TRUNC", -"ZEXT","SEXT","FPTRUNC","FPEXT","BITCAST","UITOFP","SITOFP","FPTOUI","FPTOSI", -"INTTOPTR","PTRTOINT","PHI_TOK","SELECT","VAARG","EXTRACTELEMENT","INSERTELEMENT", -"SHUFFLEVECTOR","NORETURN","INREG","SRET","DEFAULT","HIDDEN","'='","','","'*'", -"'\\\\'","'('","')'","'['","'x'","']'","'<'","'>'","'{'","'}'","'c'","ArithmeticOps", -"LogicalOps","CastOps","IPredicates","FPredicates","IntType","FPType","LocalName", -"OptLocalName","OptLocalAssign","GlobalName","OptGlobalAssign","GVInternalLinkage", -"GVExternalLinkage","GVVisibilityStyle","FunctionDeclareLinkage","FunctionDefineLinkage", -"OptCallingConv","ParamAttr","OptParamAttrs","FuncAttr","OptFuncAttrs","OptAlign", -"OptCAlign","SectionString","OptSection","GlobalVarAttributes","GlobalVarAttribute", -"PrimType","Types","ArgType","ResultTypes","ArgTypeList","ArgTypeListI","TypeListI", -"ConstVal","ConstExpr","ConstVector","GlobalType","Module","DefinitionList", -"Definition","@1","@2","@3","@4","@5","AsmBlock","TargetDefinition","LibrariesDefinition", -"LibList","ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader","END", -"Function","FunctionProto","OptSideEffect","ConstValueRef","SymbolicValueRef", -"ValueRef","ResolvedVal","BasicBlockList","BasicBlock","InstructionList","BBTerminatorInst", -"JumpTable","Inst","PHIList","ValueRefList","IndexList","OptTailCall","InstVal", -"OptVolatile","MemoryInst", NULL +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short int yyrline[] = +{ + 0, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, + 1055, 1056, 1056, 1056, 1056, 1056, 1056, 1057, 1057, 1057, + 1057, 1057, 1057, 1058, 1058, 1058, 1058, 1058, 1058, 1061, + 1061, 1062, 1062, 1063, 1063, 1064, 1064, 1065, 1065, 1069, + 1069, 1070, 1070, 1071, 1071, 1072, 1072, 1073, 1073, 1074, + 1074, 1075, 1075, 1076, 1077, 1082, 1083, 1083, 1085, 1085, + 1086, 1086, 1090, 1094, 1099, 1099, 1101, 1105, 1111, 1112, + 1113, 1114, 1115, 1119, 1120, 1121, 1125, 1126, 1130, 1131, + 1132, 1136, 1137, 1138, 1139, 1140, 1143, 1144, 1145, 1146, + 1147, 1148, 1149, 1156, 1157, 1158, 1159, 1162, 1163, 1168, + 1169, 1172, 1173, 1180, 1181, 1187, 1188, 1196, 1204, 1205, + 1210, 1211, 1212, 1217, 1230, 1230, 1230, 1230, 1233, 1237, + 1241, 1248, 1253, 1261, 1279, 1297, 1302, 1314, 1324, 1328, + 1338, 1345, 1352, 1359, 1364, 1369, 1376, 1377, 1384, 1391, + 1399, 1404, 1415, 1443, 1459, 1488, 1516, 1541, 1560, 1586, + 1606, 1618, 1625, 1691, 1701, 1711, 1723, 1735, 1743, 1755, + 1760, 1765, 1773, 1785, 1807, 1815, 1821, 1832, 1837, 1842, + 1848, 1854, 1863, 1867, 1875, 1875, 1886, 1891, 1899, 1900, + 1904, 1904, 1908, 1908, 1911, 1914, 1926, 1950, 1961, 1961, + 1971, 1971, 1979, 1979, 1989, 1992, 1998, 2011, 2015, 2020, + 2022, 2027, 2032, 2041, 2051, 2062, 2066, 2075, 2084, 2089, + 2201, 2201, 2203, 2212, 2212, 2214, 2219, 2231, 2235, 2240, + 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2297, 2301, + 2315, 2319, 2323, 2327, 2333, 2333, 2339, 2348, 2352, 2361, + 2371, 2380, 2392, 2405, 2409, 2413, 2418, 2428, 2447, 2456, + 2523, 2527, 2534, 2545, 2558, 2568, 2579, 2589, 2597, 2605, + 2608, 2609, 2616, 2620, 2625, 2646, 2663, 2676, 2689, 2701, + 2709, 2716, 2722, 2728, 2734, 2749, 2813, 2818, 2822, 2829, + 2836, 2844, 2851, 2859, 2867, 2881, 2898 }; #endif -static const short yyr1[] = { 0, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 147, - 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 151, 152, 152, 153, 153, 154, 154, - 155, 155, 156, 156, 157, 157, 158, 158, 158, 158, - 158, 159, 159, 159, 160, 160, 161, 161, 161, 162, - 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, - 163, 164, 164, 164, 164, 165, 165, 166, 166, 167, - 167, 168, 168, 169, 169, 170, 171, 171, 172, 172, - 173, 173, 174, 174, 174, 174, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, - 177, 177, 178, 178, 179, 179, 179, 179, 180, 180, - 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, - 181, 181, 181, 181, 181, 181, 181, 181, 182, 182, - 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, - 184, 184, 185, 185, 186, 186, 188, 187, 189, 187, - 187, 187, 187, 187, 190, 187, 191, 187, 192, 187, - 187, 187, 193, 194, 194, 195, 196, 196, 196, 197, - 197, 198, 198, 198, 198, 199, 200, 200, 201, 202, - 202, 203, 204, 205, 205, 206, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, - 208, 208, 209, 210, 210, 211, 212, 212, 212, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 214, 214, - 215, 216, 216, 217, 217, 217, 218, 218, 219, 219, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 221, 221, 222, 222, 222, 222, 222, - 222, 222, 222 +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "ESAPINTVAL", + "EUAPINTVAL", "LOCALVAL_ID", "GLOBALVAL_ID", "FPVAL", "VOID", "INTTYPE", + "FLOAT", "DOUBLE", "LABEL", "TYPE", "LOCALVAR", "GLOBALVAR", "LABELSTR", + "STRINGCONSTANT", "ATSTRINGCONSTANT", "IMPLEMENTATION", + "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK", + "DECLARE", "DEFINE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO", + "DOTDOTDOT", "NULL_TOK", "UNDEF", "INTERNAL", "LINKONCE", "WEAK", + "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE", + "EXTERNAL", "TARGET", "TRIPLE", "ALIGN", "DEPLIBS", "CALL", "TAIL", + "ASM_TOK", "MODULE", "SIDEEFFECT", "CC_TOK", "CCC_TOK", "FASTCC_TOK", + "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT", + "RET", "BR", "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB", + "MUL", "UDIV", "SDIV", "FDIV", "UREM", "SREM", "FREM", "AND", "OR", + "XOR", "SHL", "LSHR", "ASHR", "ICMP", "FCMP", "EQ", "NE", "SLT", "SGT", + "SLE", "SGE", "ULT", "UGT", "ULE", "UGE", "OEQ", "ONE", "OLT", "OGT", + "OLE", "OGE", "ORD", "UNO", "UEQ", "UNE", "MALLOC", "ALLOCA", "FREE", + "LOAD", "STORE", "GETELEMENTPTR", "TRUNC", "ZEXT", "SEXT", "FPTRUNC", + "FPEXT", "BITCAST", "UITOFP", "SITOFP", "FPTOUI", "FPTOSI", "INTTOPTR", + "PTRTOINT", "PHI_TOK", "SELECT", "VAARG", "EXTRACTELEMENT", + "INSERTELEMENT", "SHUFFLEVECTOR", "NORETURN", "INREG", "SRET", "DEFAULT", + "HIDDEN", "'='", "','", "'*'", "'\\\\'", "'('", "')'", "'['", "'x'", + "']'", "'<'", "'>'", "'{'", "'}'", "'c'", "$accept", "ArithmeticOps", + "LogicalOps", "CastOps", "IPredicates", "FPredicates", "IntType", + "FPType", "LocalName", "OptLocalName", "OptLocalAssign", "GlobalName", + "OptGlobalAssign", "GVInternalLinkage", "GVExternalLinkage", + "GVVisibilityStyle", "FunctionDeclareLinkage", "FunctionDefineLinkage", + "OptCallingConv", "ParamAttr", "OptParamAttrs", "FuncAttr", + "OptFuncAttrs", "OptAlign", "OptCAlign", "SectionString", "OptSection", + "GlobalVarAttributes", "GlobalVarAttribute", "PrimType", "Types", + "ArgType", "ResultTypes", "ArgTypeList", "ArgTypeListI", "TypeListI", + "ConstVal", "ConstExpr", "ConstVector", "GlobalType", "Module", + "DefinitionList", "Definition", "@1", "@2", "@3", "@4", "@5", "AsmBlock", + "TargetDefinition", "LibrariesDefinition", "LibList", "ArgListH", + "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader", "END", + "Function", "FunctionProto", "OptSideEffect", "ConstValueRef", + "SymbolicValueRef", "ValueRef", "ResolvedVal", "BasicBlockList", + "BasicBlock", "InstructionList", "BBTerminatorInst", "JumpTable", "Inst", + "PHIList", "ValueRefList", "IndexList", "OptTailCall", "InstVal", + "OptVolatile", "MemoryInst", 0 }; +#endif -static const short yyr2[] = { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 2, 0, 1, 1, 2, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, - 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, - 2, 1, 1, 1, 1, 0, 2, 1, 1, 0, - 2, 0, 2, 0, 3, 2, 0, 1, 0, 3, - 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, - 2, 5, 5, 5, 5, 3, 2, 5, 4, 2, - 1, 1, 1, 3, 1, 3, 1, 0, 1, 3, - 4, 3, 3, 4, 4, 3, 6, 5, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 6, 5, - 8, 6, 6, 7, 7, 6, 8, 8, 3, 1, - 1, 1, 1, 0, 1, 2, 0, 3, 0, 3, - 3, 1, 3, 3, 0, 6, 0, 7, 0, 7, - 2, 3, 1, 3, 3, 3, 3, 1, 0, 5, - 3, 1, 3, 1, 0, 9, 1, 1, 4, 1, - 1, 2, 3, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 5, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 3, 2, 0, 1, 2, - 2, 3, 9, 9, 8, 14, 1, 1, 6, 5, - 2, 6, 7, 3, 5, 0, 0, 3, 2, 1, - 5, 5, 6, 6, 4, 6, 4, 4, 6, 6, - 2, 8, 1, 1, 0, 3, 6, 3, 6, 2, - 4, 6, 4 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 61, 44, 42, 92, 40, 41, + 91, 120, 93, 60, 62, 123, 125, 99 }; +# endif -static const short yydefact[] = { 66, - 57, 63, 58, 64, 182, 179, 177, 0, 0, 0, - 0, 0, 0, 75, 66, 175, 77, 80, 0, 0, - 191, 0, 0, 61, 0, 65, 67, 69, 68, 70, - 72, 71, 73, 74, 76, 75, 75, 0, 176, 78, - 79, 75, 180, 81, 82, 83, 84, 75, 238, 178, - 238, 0, 0, 199, 192, 193, 181, 227, 228, 184, - 113, 114, 115, 116, 117, 0, 0, 0, 0, 229, - 230, 118, 183, 120, 0, 0, 171, 172, 0, 85, - 85, 239, 235, 62, 210, 211, 212, 234, 194, 195, - 198, 0, 138, 121, 0, 0, 0, 0, 127, 139, - 0, 119, 138, 0, 0, 113, 114, 115, 0, 0, - 0, 185, 0, 86, 87, 88, 89, 90, 0, 213, - 0, 275, 237, 0, 196, 137, 96, 133, 135, 0, - 0, 0, 0, 0, 0, 126, 0, 187, 189, 156, - 157, 154, 155, 158, 153, 149, 150, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 13, 14, 15, 10, - 11, 12, 0, 0, 0, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 152, 151, - 109, 91, 132, 131, 0, 207, 208, 209, 274, 260, - 0, 0, 0, 0, 85, 247, 248, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 236, 85, 251, 0, 273, 197, 130, 0, - 100, 0, 0, 129, 0, 140, 100, 109, 109, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 0, - 52, 53, 48, 49, 50, 51, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, - 0, 0, 142, 170, 0, 0, 0, 146, 0, 143, - 0, 0, 0, 0, 186, 0, 259, 241, 0, 240, - 0, 0, 54, 0, 0, 0, 0, 104, 104, 280, - 0, 0, 271, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 94, 95, 97, 136, - 134, 123, 124, 125, 128, 122, 188, 190, 0, 0, - 257, 0, 0, 0, 0, 0, 141, 127, 139, 0, - 144, 145, 0, 0, 0, 0, 0, 111, 109, 205, - 216, 217, 218, 223, 219, 220, 221, 222, 214, 0, - 225, 232, 231, 233, 0, 242, 0, 0, 0, 0, - 0, 276, 0, 278, 257, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, - 101, 0, 0, 0, 0, 0, 0, 0, 169, 148, - 0, 0, 0, 0, 106, 112, 110, 204, 96, 202, - 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 283, 0, 0, 0, 267, 268, 0, 0, - 0, 0, 265, 0, 281, 0, 0, 0, 0, 160, - 0, 0, 0, 0, 147, 0, 0, 0, 60, 0, - 100, 0, 224, 0, 0, 256, 0, 0, 104, 105, - 104, 0, 0, 0, 0, 0, 261, 262, 256, 0, - 0, 0, 258, 0, 166, 0, 0, 162, 163, 159, - 59, 201, 203, 96, 107, 0, 0, 0, 0, 0, - 263, 264, 0, 277, 279, 0, 0, 266, 269, 270, - 0, 282, 164, 165, 0, 0, 0, 60, 108, 102, - 226, 0, 0, 96, 0, 100, 252, 0, 100, 161, - 167, 168, 200, 0, 206, 0, 245, 0, 0, 254, - 0, 0, 253, 272, 103, 243, 0, 244, 0, 96, - 0, 0, 0, 255, 0, 0, 0, 0, 250, 0, - 0, 249, 0, 246, 0, 0, 0 +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 148, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 150, 150, 150, 150, 150, 150, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 154, 155, 155, 156, 156, + 157, 157, 158, 158, 159, 159, 160, 160, 161, 161, + 161, 161, 161, 162, 162, 162, 163, 163, 164, 164, + 164, 165, 165, 165, 165, 165, 166, 166, 166, 166, + 166, 166, 166, 167, 167, 167, 167, 168, 168, 169, + 169, 170, 170, 171, 171, 172, 172, 173, 174, 174, + 175, 175, 176, 176, 177, 177, 177, 177, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 179, 180, 180, 181, 181, 182, 182, 182, 182, + 183, 183, 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, + 191, 190, 192, 190, 190, 190, 190, 190, 193, 190, + 194, 190, 195, 190, 190, 190, 196, 197, 197, 198, + 199, 199, 199, 200, 200, 201, 201, 201, 201, 202, + 203, 203, 204, 205, 205, 206, 207, 208, 208, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 210, 210, 210, 210, 211, 211, 212, 213, 213, 214, + 215, 215, 215, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 217, 217, 218, 219, 219, 220, 220, 220, + 221, 221, 222, 222, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 224, 224, 225, + 225, 225, 225, 225, 225, 225, 225 }; -static const short yydefgoto[] = { 186, - 187, 188, 250, 267, 109, 110, 70, 482, 12, 71, - 14, 36, 37, 38, 42, 48, 119, 319, 229, 391, - 322, 525, 372, 348, 510, 285, 349, 72, 111, 128, - 195, 129, 130, 101, 274, 361, 275, 79, 555, 15, - 16, 18, 17, 191, 238, 239, 57, 21, 55, 92, - 410, 411, 120, 198, 49, 87, 50, 43, 413, 362, - 74, 364, 290, 51, 83, 84, 223, 529, 123, 303, - 490, 394, 224, 225, 226, 227 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 2, 0, 1, 1, 2, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 0, 2, 1, + 1, 0, 2, 0, 2, 0, 3, 2, 0, 1, + 0, 3, 1, 2, 1, 1, 1, 1, 1, 1, + 2, 1, 2, 5, 5, 5, 5, 3, 2, 5, + 4, 2, 1, 1, 1, 3, 1, 3, 1, 0, + 1, 3, 4, 3, 3, 4, 4, 3, 6, 5, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 6, 5, 8, 6, 6, 7, 7, 6, + 8, 8, 3, 1, 1, 1, 1, 0, 1, 2, + 0, 3, 0, 3, 3, 1, 3, 3, 0, 6, + 0, 7, 0, 7, 2, 3, 1, 3, 3, 3, + 3, 1, 0, 5, 3, 1, 3, 1, 0, 9, + 1, 1, 4, 1, 1, 2, 3, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 1, 5, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, + 2, 0, 1, 2, 2, 3, 9, 9, 8, 14, + 1, 1, 6, 5, 2, 6, 7, 3, 5, 0, + 0, 3, 2, 1, 5, 5, 6, 6, 4, 6, + 4, 4, 6, 6, 2, 8, 1, 1, 0, 3, + 6, 3, 6, 2, 4, 6, 4 }; -static const short yypact[] = { 438, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 27, -119, -29, - -84, 43, -57, -6, 525,-32768, 195, 140, -38, -27, --32768, -39, 112,-32768, 828,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 32, 32, 227,-32768,-32768, --32768, 32,-32768,-32768,-32768,-32768,-32768, 32, 119,-32768, - -2, 188, 210, 213,-32768,-32768,-32768,-32768,-32768, 49, --32768,-32768,-32768,-32768,-32768, 214, 245, 5, 104,-32768, --32768,-32768, 110,-32768, 227, 227,-32768,-32768, 1043, 154, - 154,-32768,-32768, 109,-32768,-32768,-32768,-32768,-32768,-32768, --32768, -89, 1085,-32768, 125, 139, 122, 49,-32768, 110, - -55,-32768, 1085, 1043, 1188, 46, 249, 272, 266, 273, - 589,-32768, 279,-32768,-32768,-32768,-32768,-32768, 1204,-32768, - 2, 1327,-32768, 268,-32768,-32768, 110,-32768, 153, 150, - 1188, 1188, 149, -53, 1188,-32768, 155,-32768, 110,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 494, 943, 157,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 158, 159, 163, - 164, 790, 1226, 495, 284, 166, 167, 169,-32768,-32768, - 173,-32768, 49, 110, 28,-32768,-32768,-32768,-32768,-32768, - 262, 1243, 142, 302, 154,-32768,-32768, 494, 943, 1188, - 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, - 1188, 1188,-32768, 154,-32768, 168,-32768,-32768, -58, 1124, --32768, 25, 16,-32768, 170, 110,-32768, 173, 173,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 177, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 181, 1043, 1043, 1043, - 1043, 1043,-32768,-32768, 20, 668, -40,-32768, -48,-32768, - 1043, 1043, 1043, 18,-32768, 182,-32768, 49, 747,-32768, - 872, 872,-32768, 872, 1204, 1188, 1188, 99, 117,-32768, - 747, 33, 186, 187, 191, 192, 198, 200, 747, 747, - 290, 1204, 1188, 1188,-32768,-32768,-32768,-32768,-32768,-32768, --32768, -87,-32768,-32768,-32768, -87,-32768,-32768, 1043, 1043, --32768, 203, 204, 205, 209, 1043,-32768, 202, 589, -43, --32768,-32768, 216, 218, 312, 328, 342,-32768, 173, 1140, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 295, 1043, --32768,-32768,-32768,-32768, 219,-32768, 229, 872, 747, 747, - 8,-32768, 17,-32768,-32768, 872, 225, 1188, 1188, 1188, - 1188, 1188, 231, 232, 1188, 872, 747, 233,-32768,-32768, --32768, 234, 235, -33, 1043, 1043, 1043, 1043,-32768,-32768, - 230, 1043, 1043, 1188,-32768,-32768,-32768,-32768, 110, 238, - 236,-32768, 357, -36, 363, 364, 241, 246, 248, 872, - 374, 872, 251, 254, 872, 255, 110,-32768, 256, 258, - 872, 872, 110, 260,-32768, 1188, 1043, 1043, 1188,-32768, - 261, 263, 264, 270,-32768, 267, 276, 47, 130, 1159, --32768, 274,-32768, 872, 872, 1188, 872, 872, 281,-32768, - 281, 872, 283, 1188, 1188, 1188,-32768,-32768, 1188, 747, - 282, 285,-32768, 1043,-32768, 1043, 1043,-32768,-32768,-32768, --32768,-32768,-32768, 110, 45, 382, 287, 280, 747, -13, --32768,-32768, 355,-32768,-32768, 265, 872,-32768,-32768,-32768, - 29,-32768,-32768,-32768, 286, 291, 292, 130,-32768, 375, --32768, 412, 1,-32768, 1188,-32768,-32768, 293,-32768,-32768, --32768,-32768,-32768, 423,-32768, 872,-32768, 996, 9, -58, - 747, 212,-32768, -87,-32768,-32768, 297,-32768, 996,-32768, - 419, 422, 303, -58, 872, 872, 425, 371,-32768, 872, - 427,-32768, 872,-32768, 443, 444,-32768 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned short int yydefact[] = +{ + 67, 58, 64, 59, 65, 185, 182, 180, 0, 0, + 0, 0, 0, 0, 76, 0, 67, 178, 78, 81, + 0, 0, 194, 0, 0, 62, 0, 66, 68, 70, + 69, 71, 73, 72, 74, 75, 77, 76, 76, 0, + 1, 179, 79, 80, 76, 183, 82, 83, 84, 85, + 76, 241, 181, 241, 0, 0, 202, 195, 196, 184, + 230, 231, 187, 114, 115, 116, 117, 118, 0, 0, + 0, 0, 232, 233, 119, 186, 121, 0, 0, 174, + 175, 0, 86, 86, 242, 238, 63, 213, 214, 215, + 237, 197, 198, 201, 0, 139, 122, 0, 0, 0, + 0, 128, 140, 0, 120, 139, 0, 0, 114, 115, + 116, 0, 0, 0, 188, 0, 87, 88, 89, 90, + 91, 0, 216, 0, 278, 240, 0, 199, 138, 97, + 134, 136, 0, 0, 0, 0, 0, 0, 127, 0, + 190, 192, 159, 160, 155, 157, 156, 158, 161, 154, + 150, 151, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 14, 15, 16, 11, 12, 13, 0, 0, 0, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 153, 152, 110, 92, 133, 132, 0, + 210, 211, 212, 277, 263, 0, 0, 0, 0, 86, + 250, 251, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 239, 86, 254, + 0, 276, 200, 131, 0, 101, 0, 0, 130, 0, + 141, 101, 110, 110, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 53, 54, 49, 50, 51, + 52, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 0, 0, 0, 0, 0, 0, 143, 173, 0, + 0, 0, 147, 0, 144, 0, 0, 0, 0, 189, + 0, 262, 244, 0, 243, 0, 0, 55, 0, 0, + 0, 0, 105, 105, 283, 0, 0, 274, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 94, 95, 96, 98, 137, 135, 124, 125, 126, 129, + 123, 191, 193, 0, 0, 260, 0, 0, 0, 0, + 0, 142, 128, 140, 0, 145, 146, 0, 0, 0, + 0, 0, 112, 110, 208, 219, 220, 221, 226, 222, + 223, 224, 225, 217, 0, 228, 235, 234, 236, 0, + 245, 0, 0, 0, 0, 0, 279, 0, 281, 260, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 99, 100, 102, 0, 0, 0, 0, + 0, 0, 0, 172, 149, 0, 0, 0, 0, 107, + 113, 111, 207, 97, 205, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, + 0, 270, 271, 0, 0, 0, 0, 268, 0, 284, + 0, 0, 0, 0, 163, 0, 0, 0, 0, 148, + 0, 0, 0, 61, 0, 101, 0, 227, 0, 0, + 259, 0, 0, 105, 106, 105, 0, 0, 0, 0, + 0, 264, 265, 259, 0, 0, 0, 261, 0, 169, + 0, 0, 165, 166, 162, 60, 204, 206, 97, 108, + 0, 0, 0, 0, 0, 266, 267, 0, 280, 282, + 0, 0, 269, 272, 273, 0, 285, 167, 168, 0, + 0, 0, 61, 109, 103, 229, 0, 0, 97, 0, + 101, 255, 0, 101, 164, 170, 171, 203, 0, 209, + 0, 248, 0, 0, 257, 0, 0, 256, 275, 104, + 246, 0, 247, 0, 97, 0, 0, 0, 258, 0, + 0, 0, 0, 253, 0, 0, 252, 0, 249 }; -static const short yypgoto[] = { 324, - 325, 326, 242, 252, -197,-32768, 0, -50, 376, 4, --32768,-32768,-32768, 40,-32768,-32768, -167, -306, -397,-32768, - -235,-32768, -291, -23,-32768, -211,-32768,-32768, -24, 237, - -229,-32768, 362, 369, -68, -108, -178, 201,-32768,-32768, - 453,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 391,-32768,-32768,-32768,-32768,-32768,-32768, -436, - -72, 101, -157,-32768, 424,-32768,-32768,-32768,-32768,-32768, - 7, 105,-32768,-32768,-32768,-32768 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short int yydefgoto[] = +{ + -1, 190, 191, 192, 254, 271, 111, 112, 72, 486, + 12, 73, 14, 37, 38, 39, 44, 50, 121, 323, + 233, 395, 326, 529, 376, 352, 514, 289, 353, 74, + 113, 130, 199, 131, 132, 103, 278, 365, 279, 81, + 15, 16, 17, 19, 18, 195, 242, 243, 59, 22, + 57, 94, 414, 415, 122, 202, 51, 89, 52, 45, + 417, 366, 76, 368, 294, 53, 85, 86, 227, 533, + 125, 307, 494, 398, 228, 229, 230, 231 }; - -#define YYLAST 1453 - - -static const short yytable[] = { 11, - 73, 326, 189, 13, 277, 279, 294, 374, 96, 293, - 112, 449, 22, 82, 11, 390, 420, 293, 13, 390, - 23, 85, 315, 316, 196, 422, 327, 328, 27, 28, - 29, 30, 31, 32, 33, 138, 34, 295, 190, 389, - 317, 318, 2, 124, 100, 4, 346, 24, -54, -54, - 125, 315, 316, 421, 300, 25, 312, 304, 305, 306, - 307, 308, 421, 347, 311, 368, 140, 141, 127, 317, - 318, 19, 100, 346, 26, 75, 76, 135, 127, 135, - 139, 80, 386, 11, 336, 20, 508, 81, 136, 336, - 235, 537, 336, 52, 194, 342, 336, 340, 54, 439, - 401, 341, 543, 440, 53, 453, 232, 233, 58, 59, - 236, 98, 61, 62, 63, 64, 530, 1, 2, 515, - 3, 4, 1, 516, 35, 3, 58, 59, 56, 98, - 61, 62, 63, 64, 82, 1, 2, 407, 3, 4, - 527, 86, 544, 1, 197, 65, 3, 97, 538, 102, - 291, 103, 336, 292, 315, 316, 388, 324, 102, 337, - 103, 515, 35, 65, 323, 519, 102, 494, 103, 495, - 376, 389, 317, 318, 44, 45, 46, 289, 390, 47, - 102, 414, 103, 480, 93, 298, 299, 289, 301, 302, - 289, 289, 289, 289, 289, 309, 310, 289, 286, 331, - 332, 333, 334, 335, 89, 127, 113, 114, 115, 116, - 117, 118, 343, 344, 345, 485, 363, 94, 363, 363, - 426, 363, 428, 429, 430, 390, 90, 390, 363, 91, - 189, 371, 102, 40, 103, 41, 363, 363, 66, 315, - 316, 67, 541, 102, 68, 103, 69, 99, 95, 373, - 102, 339, 103, 77, 78, -55, 66, 317, 318, 67, - 392, 393, 68, 131, 69, 133, 190, 399, 142, 143, - 194, 369, 370, 313, 314, 104, 105, 132, -56, 144, - 532, 473, 192, 534, 228, 230, 231, 194, 387, 289, - 234, 237, 268, 269, 270, 363, 363, 363, 271, 272, - 280, 281, 282, 363, 283, 284, 498, 499, 500, 287, - 293, 325, 329, 363, 363, 528, 330, 350, 377, 378, - 385, 315, 316, 379, 380, 409, 441, 442, 443, 444, - 381, 539, 382, 446, 447, 395, 396, 397, 389, 317, - 318, 398, 404, 400, 405, 406, 412, 363, 402, 363, - 403, 415, 363, 289, 427, 289, 289, 289, 363, 363, - 433, 416, 425, 431, 432, 436, 437, 438, 471, 472, - 450, 445, 451, 452, 454, 455, 456, 460, 457, 448, - 458, 363, 363, 439, 363, 363, 462, 464, 465, 363, - 466, 365, 366, 474, 367, 469, 476, 363, 511, 475, - 421, 375, 477, 478, 517, 505, 486, 506, 507, 383, - 384, 470, 479, 493, 289, 497, 363, 513, 503, 512, - 524, 504, 520, 526, 363, 484, 535, 521, 522, 542, - 545, 489, 533, 546, 551, 547, 550, -174, 553, 289, - 289, 289, 556, 557, 489, 220, 221, 222, 481, 296, - -62, 1, 2, 363, 3, 4, 5, 523, 363, 122, - 297, 509, 6, 7, 137, 134, 321, 39, 417, 418, - 419, 121, 363, 363, 88, 501, 424, 363, 0, 423, - 363, 8, 0, 0, 9, 0, 434, 435, 10, 0, - 531, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 59, 0, 98, 106, 107, 108, 64, 481, 1, 2, - 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, - 459, 0, 461, 0, -173, 463, 0, 0, 0, 0, - 0, 467, 468, 0, 0, 0, 65, -62, 1, 2, - 0, 3, 4, 5, 0, 0, 0, 0, 0, 6, - 7, 0, 0, 0, 487, 488, 0, 491, 492, 0, - 0, 0, 496, 0, 0, 0, 0, 0, 8, 0, - 502, 9, 0, 0, 0, 10, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 0, 0, 0, 514, - 0, 0, 0, 58, 59, 0, 0, 518, 0, 0, - 0, 0, 1, 2, 0, 3, 4, 0, 145, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 146, 147, 0, 0, 0, 536, 0, 0, 66, - 0, 540, 67, 0, 0, 68, 0, 69, 278, 0, - 0, 0, 0, 0, 0, 548, 549, 0, 0, 0, - 552, 0, 0, 554, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 0, 58, 59, 0, 98, 106, 107, 108, 64, - 0, 1, 2, 0, 3, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 65, - 178, 0, 179, 180, 181, 0, 0, 0, 0, 0, - 0, 0, 102, 0, 103, 0, 182, 0, 0, 183, - 0, 184, 0, 185, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, - 352, 58, 59, 353, 0, 0, 0, 0, 0, 0, - 1, 2, 0, 3, 4, 0, 354, 355, 356, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, - 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 58, 59, 359, 98, 106, 107, - 108, 64, 66, 1, 2, 67, 3, 4, 68, 0, - 69, 338, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 0, - 0, 65, 58, 59, 0, 60, 61, 62, 63, 64, - 0, 1, 2, 0, 3, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 65, - 179, 180, 181, 0, 351, 352, 58, 59, 353, 0, - 102, 0, 103, 0, 0, 1, 2, 360, 3, 4, - 0, 354, 355, 356, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 357, 358, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 359, 0, 0, 66, 0, 0, 67, 0, 273, - 68, 0, 69, 0, 0, 0, 0, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 0, 0, 0, 0, 0, 0, - 0, 0, 66, 251, 252, 67, 0, 0, 68, 0, - 69, 0, 0, 0, 0, 0, 0, 0, 0, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 179, 180, 181, 351, 352, - 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 360, 0, 0, 354, 355, 356, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 357, 358, - 0, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 359, 0, 58, 59, 0, - 98, 106, 107, 108, 64, 0, 1, 2, 0, 3, - 4, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 0, 0, - 0, 0, 0, 0, 65, 0, 0, 0, 0, 58, - 59, 0, 98, 61, 62, 63, 64, 0, 1, 2, - 0, 3, 4, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 126, 178, 0, 179, - 180, 181, 0, 0, 0, 0, 65, 0, 58, 59, - 0, 98, 61, 62, 63, 64, 360, 1, 2, 0, - 3, 4, 0, 0, 58, 59, 0, 98, 61, 62, - 63, 64, 0, 1, 2, 320, 3, 4, 0, 0, - 0, 0, 0, 58, 59, 65, 98, 61, 62, 63, - 64, 408, 1, 2, 0, 3, 4, 66, 0, 0, - 67, 65, 0, 68, 0, 69, 0, 0, 0, 0, - 483, 0, 58, 59, 0, 98, 61, 62, 63, 64, - 65, 1, 2, 0, 3, 4, 0, 0, 58, 59, - 0, 193, 61, 62, 63, 64, 0, 1, 2, 66, - 3, 4, 67, 0, 0, 68, 0, 69, 0, 65, - 58, 59, 0, 98, 106, 107, 108, 64, 0, 1, - 2, 0, 3, 4, 0, 65, 0, 58, 59, 0, - 288, 61, 62, 63, 64, 0, 1, 2, 66, 3, - 4, 67, 0, 0, 68, 0, 69, 65, 0, 0, - 0, 0, 0, 0, 66, 0, 0, 67, 0, 0, - 68, 0, 69, 0, 65, 0, 0, 0, 0, 0, - 0, 0, 0, 66, 0, 0, 67, 0, 0, 68, - 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 66, 0, 0, 67, 0, 0, 68, 0, - 69, 0, 0, 0, 0, 0, 0, 0, 66, 0, - 0, 67, 0, 0, 68, 0, 69, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 199, 0, 0, 0, - 66, 0, 0, 67, 0, 0, 68, 0, 276, 0, - 0, 0, 0, 0, 200, 201, 0, 66, 0, 0, - 67, 0, 0, 68, 0, 69, 202, 203, 204, 205, - 206, 207, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 208, 209, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, - 211, 212, 0, 0, 213, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 214, 215, 216, - 217, 218, 219 +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -440 +static const short int yypact[] = +{ + 406, -440, -440, -440, -440, -440, -440, -440, -2, -101, + 21, -55, 80, -20, 15, 132, 556, -440, 253, 197, + -7, 87, -440, 20, 207, -440, 893, -440, -440, -440, + -440, -440, -440, -440, -440, -440, -440, 97, 97, 125, + -440, -440, -440, -440, 97, -440, -440, -440, -440, -440, + 97, 235, -440, 6, 240, 248, 258, -440, -440, -440, + -440, -440, 134, -440, -440, -440, -440, -440, 269, 277, + 11, 123, -440, -440, -440, 33, -440, 125, 125, -440, + -440, 1055, 128, 128, -440, -440, 47, -440, -440, -440, + -440, -440, -440, -440, -57, 939, -440, 154, 156, 488, + 134, -440, 33, -112, -440, 939, 1055, 1149, 38, 281, + 289, 239, 293, 850, -440, 299, -440, -440, -440, -440, + -440, 1168, -440, 2, 1301, -440, 285, -440, -440, 33, + -440, 170, 167, 1149, 1149, 164, -97, 1149, -440, 171, + -440, 33, -440, -440, -440, -440, -440, -440, -440, -440, + -440, -440, -440, -440, -440, -440, -440, -440, -440, -440, + -440, -440, -440, -440, -440, -440, -440, 254, 446, 174, + -440, -440, -440, -440, -440, -440, -440, -440, -440, -440, + -440, -440, 175, 176, 177, 178, 109, 1203, 676, 290, + 181, 182, 183, -440, -440, 187, -440, 134, 33, 93, + -440, -440, -440, -440, -440, 273, 1217, 127, 313, 128, + -440, -440, 254, 446, 1149, 1149, 1149, 1149, 1149, 1149, + 1149, 1149, 1149, 1149, 1149, 1149, 1149, -440, 128, -440, + 70, -440, -440, -29, 1098, -440, 72, -39, -440, 184, + 33, -440, 187, 187, -440, -440, -440, -440, -440, -440, + -440, -440, -440, -440, 188, -440, -440, -440, -440, -440, + -440, -440, -440, -440, -440, -440, -440, -440, -440, -440, + -440, 196, 1055, 1055, 1055, 1055, 1055, -440, -440, 22, + 771, -44, -440, -59, -440, 1055, 1055, 1055, -9, -440, + 198, -440, 134, 591, -440, 728, 728, -440, 728, 1168, + 1149, 1149, 112, 147, -440, 591, 75, 190, 200, 214, + 215, 217, 219, 591, 591, 322, 1168, 1149, 1149, -440, + -440, -440, -440, -440, -440, -440, -41, -440, -440, -440, + -41, -440, -440, 1055, 1055, -440, 230, 231, 232, 233, + 1055, -440, 225, 850, -43, -440, -440, 236, 241, 337, + 355, 371, -440, 187, 1114, -440, -440, -440, -440, -440, + -440, -440, -440, 323, 1055, -440, -440, -440, -440, 243, + -440, 244, 728, 591, 591, 17, -440, 19, -440, -440, + 728, 242, 1149, 1149, 1149, 1149, 1149, 245, 246, 1149, + 728, 591, 249, -440, -440, -440, 252, 255, -24, 1055, + 1055, 1055, 1055, -440, -440, 247, 1055, 1055, 1149, -440, + -440, -440, -440, 33, 257, 260, -440, 375, -37, 383, + 386, 264, 268, 272, 728, 400, 728, 275, 282, 728, + 284, 33, -440, 295, 296, 728, 728, 33, 270, -440, + 1149, 1055, 1055, 1149, -440, 297, 298, 301, 303, -440, + 300, 302, 150, 32, 1133, -440, 305, -440, 728, 728, + 1149, 728, 728, 307, -440, 307, 728, 311, 1149, 1149, + 1149, -440, -440, 1149, 591, 308, 310, -440, 1055, -440, + 1055, 1055, -440, -440, -440, -440, -440, -440, 33, 46, + 397, 315, 314, 591, 26, -440, -440, 376, -440, -440, + 309, 728, -440, -440, -440, 89, -440, -440, -440, 317, + 319, 321, 32, -440, 413, -440, 449, 7, -440, 1149, + -440, -440, 324, -440, -440, -440, -440, -440, 460, -440, + 728, -440, 976, 9, -29, 591, 149, -440, -41, -440, + -440, 330, -440, 976, -440, 453, 454, 336, -29, 728, + 728, 461, 412, -440, 728, 465, -440, 728, -440 }; -static const short yycheck[] = { 0, - 25, 237, 111, 0, 183, 184, 204, 299, 4, 9, - 79, 409, 132, 16, 15, 322, 9, 9, 15, 326, - 50, 24, 110, 111, 23, 9, 238, 239, 35, 36, - 37, 38, 39, 40, 41, 104, 43, 205, 111, 127, - 128, 129, 15, 133, 69, 18, 29, 132, 3, 4, - 140, 110, 111, 46, 212, 13, 224, 215, 216, 217, - 218, 219, 46, 46, 222, 295, 21, 22, 93, 128, - 129, 45, 97, 29, 132, 36, 37, 133, 103, 133, - 105, 42, 312, 84, 133, 59, 484, 48, 144, 133, - 144, 528, 133, 132, 119, 144, 133, 276, 138, 133, - 144, 142, 539, 137, 132, 142, 131, 132, 5, 6, - 135, 8, 9, 10, 11, 12, 514, 14, 15, 133, - 17, 18, 14, 137, 131, 17, 5, 6, 17, 8, - 9, 10, 11, 12, 16, 14, 15, 349, 17, 18, - 140, 144, 540, 14, 143, 42, 17, 143, 140, 134, - 9, 136, 133, 12, 110, 111, 314, 142, 134, 140, - 136, 133, 131, 42, 140, 137, 134, 459, 136, 461, - 138, 127, 128, 129, 35, 36, 37, 202, 485, 40, - 134, 360, 136, 137, 136, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 195, 268, - 269, 270, 271, 272, 17, 230, 53, 54, 55, 56, - 57, 58, 281, 282, 283, 451, 289, 4, 291, 292, - 378, 294, 380, 381, 382, 532, 17, 534, 301, 17, - 339, 133, 134, 39, 136, 41, 309, 310, 135, 110, - 111, 138, 31, 134, 141, 136, 143, 144, 4, 133, - 134, 276, 136, 27, 28, 7, 135, 128, 129, 138, - 329, 330, 141, 139, 143, 144, 339, 336, 3, 4, - 295, 296, 297, 106, 107, 75, 76, 139, 7, 7, - 516, 439, 4, 519, 17, 133, 137, 312, 313, 314, - 142, 137, 136, 136, 136, 368, 369, 370, 136, 136, - 17, 136, 136, 376, 136, 133, 464, 465, 466, 48, - 9, 142, 136, 386, 387, 513, 136, 136, 133, 133, - 31, 110, 111, 133, 133, 350, 395, 396, 397, 398, - 133, 529, 133, 402, 403, 133, 133, 133, 127, 128, - 129, 133, 31, 142, 17, 4, 52, 420, 133, 422, - 133, 133, 425, 378, 379, 380, 381, 382, 431, 432, - 385, 133, 138, 133, 133, 133, 133, 133, 437, 438, - 133, 142, 137, 17, 12, 12, 136, 4, 133, 404, - 133, 454, 455, 133, 457, 458, 133, 133, 133, 462, - 133, 291, 292, 133, 294, 136, 133, 470, 17, 137, - 46, 301, 133, 137, 140, 474, 133, 476, 477, 309, - 310, 436, 137, 133, 439, 133, 489, 138, 137, 133, - 46, 137, 137, 12, 497, 450, 4, 137, 137, 133, - 12, 456, 140, 12, 64, 133, 12, 0, 12, 464, - 465, 466, 0, 0, 469, 122, 122, 122, 449, 208, - 13, 14, 15, 526, 17, 18, 19, 508, 531, 84, - 209, 485, 25, 26, 103, 97, 230, 15, 368, 369, - 370, 81, 545, 546, 51, 469, 376, 550, -1, 375, - 553, 44, -1, -1, 47, -1, 386, 387, 51, -1, - 515, -1, -1, -1, -1, -1, -1, -1, -1, 5, - 6, -1, 8, 9, 10, 11, 12, 508, 14, 15, - -1, 17, 18, -1, -1, -1, -1, -1, -1, -1, - 420, -1, 422, -1, 0, 425, -1, -1, -1, -1, - -1, 431, 432, -1, -1, -1, 42, 13, 14, 15, - -1, 17, 18, 19, -1, -1, -1, -1, -1, 25, - 26, -1, -1, -1, 454, 455, -1, 457, 458, -1, - -1, -1, 462, -1, -1, -1, -1, -1, 44, -1, - 470, 47, -1, -1, -1, 51, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, -1, -1, 489, - -1, -1, -1, 5, 6, -1, -1, 497, -1, -1, - -1, -1, 14, 15, -1, 17, 18, -1, 20, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, 34, -1, -1, -1, 526, -1, -1, 135, - -1, 531, 138, -1, -1, 141, -1, 143, 144, -1, - -1, -1, -1, -1, -1, 545, 546, -1, -1, -1, - 550, -1, -1, 553, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, -1, 5, 6, -1, 8, 9, 10, 11, 12, - -1, 14, 15, -1, 17, 18, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 42, - 122, -1, 124, 125, 126, -1, -1, -1, -1, -1, - -1, -1, 134, -1, 136, -1, 138, -1, -1, 141, - -1, 143, -1, 145, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, - 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, - 14, 15, -1, 17, 18, -1, 20, 21, 22, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 5, 6, 50, 8, 9, 10, - 11, 12, 135, 14, 15, 138, 17, 18, 141, -1, - 143, 144, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, - -1, 42, 5, 6, -1, 8, 9, 10, 11, 12, - -1, 14, 15, -1, 17, 18, -1, -1, -1, -1, - -1, -1, -1, -1, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, -1, 122, 42, - 124, 125, 126, -1, 3, 4, 5, 6, 7, -1, - 134, -1, 136, -1, -1, 14, 15, 141, 17, 18, - -1, 20, 21, 22, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 33, 34, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, 135, -1, -1, 138, -1, 140, - 141, -1, 143, -1, -1, -1, -1, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, - -1, -1, 135, 21, 22, 138, -1, -1, 141, -1, - 143, -1, -1, -1, -1, -1, -1, -1, -1, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, -1, 122, -1, 124, 125, 126, 3, 4, - -1, -1, 7, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 141, -1, -1, 20, 21, 22, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 33, 34, - -1, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 50, -1, 5, 6, -1, - 8, 9, 10, 11, 12, -1, 14, 15, -1, 17, - 18, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, - -1, -1, -1, -1, 42, -1, -1, -1, -1, 5, - 6, -1, 8, 9, 10, 11, 12, -1, 14, 15, - -1, 17, 18, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 32, 122, -1, 124, - 125, 126, -1, -1, -1, -1, 42, -1, 5, 6, - -1, 8, 9, 10, 11, 12, 141, 14, 15, -1, - 17, 18, -1, -1, 5, 6, -1, 8, 9, 10, - 11, 12, -1, 14, 15, 32, 17, 18, -1, -1, - -1, -1, -1, 5, 6, 42, 8, 9, 10, 11, - 12, 32, 14, 15, -1, 17, 18, 135, -1, -1, - 138, 42, -1, 141, -1, 143, -1, -1, -1, -1, - 32, -1, 5, 6, -1, 8, 9, 10, 11, 12, - 42, 14, 15, -1, 17, 18, -1, -1, 5, 6, - -1, 8, 9, 10, 11, 12, -1, 14, 15, 135, - 17, 18, 138, -1, -1, 141, -1, 143, -1, 42, - 5, 6, -1, 8, 9, 10, 11, 12, -1, 14, - 15, -1, 17, 18, -1, 42, -1, 5, 6, -1, - 8, 9, 10, 11, 12, -1, 14, 15, 135, 17, - 18, 138, -1, -1, 141, -1, 143, 42, -1, -1, - -1, -1, -1, -1, 135, -1, -1, 138, -1, -1, - 141, -1, 143, -1, 42, -1, -1, -1, -1, -1, - -1, -1, -1, 135, -1, -1, 138, -1, -1, 141, - -1, 143, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 135, -1, -1, 138, -1, -1, 141, -1, - 143, -1, -1, -1, -1, -1, -1, -1, 135, -1, - -1, 138, -1, -1, 141, -1, 143, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, - 135, -1, -1, 138, -1, -1, 141, -1, 143, -1, - -1, -1, -1, -1, 48, 49, -1, 135, -1, -1, - 138, -1, -1, 141, -1, 143, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, - 104, 105, -1, -1, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126 +/* YYPGOTO[NTERM-NUM]. */ +static const short int yypgoto[] = +{ + -440, 358, 359, 361, 274, 276, -206, -440, 0, -19, + 401, 13, -440, -440, -440, 31, -440, -440, -178, -309, + -394, -440, -236, -440, -297, -1, -440, -207, -440, -440, + -25, 263, -252, -440, 387, 404, -69, -110, -162, 160, + -440, -440, 490, -440, -440, -440, -440, -440, -440, -440, + -440, -440, -440, -440, 426, -440, -440, -440, -440, -440, + -440, -439, -73, 100, -212, -440, 457, -440, -440, -440, + -440, -440, 40, 135, -440, -440, -440, -440 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include -#endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible at ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ -#endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -178 +static const short int yytable[] = +{ + 11, 75, 298, 193, 304, 330, 378, 308, 309, 310, + 311, 312, 114, 13, 315, 98, 11, 394, 297, 453, + 297, 394, 350, 137, 84, 281, 283, 200, 424, 13, + 426, 299, 87, 23, 138, 331, 332, 140, 137, 351, + 194, -55, -55, -55, -55, 20, 102, 372, 1, 239, + 316, 3, 28, 29, 30, 31, 32, 33, 34, 21, + 35, 142, 143, 1, 390, 425, 3, 425, 77, 78, + 129, 319, 320, 24, 102, 82, 340, 350, 126, 25, + 129, 83, 141, 319, 320, 127, 11, 346, 393, 321, + 322, 340, 340, 541, 512, 26, 198, 104, 340, 105, + 345, 321, 322, 405, 547, 328, 392, 457, 236, 237, + 2, 443, 240, 4, 27, 444, 60, 61, 344, 100, + 108, 109, 110, 66, 534, 1, 2, 54, 3, 4, + 60, 61, 40, 100, 63, 64, 65, 66, 295, 1, + 2, 296, 3, 4, 319, 320, 411, 201, 36, 531, + 548, 542, 88, 67, 79, 80, 99, 340, 319, 320, + 56, 519, 321, 322, 341, 520, 498, 67, 499, 104, + 430, 105, 432, 433, 434, 393, 321, 322, 317, 318, + 394, 293, 545, 115, 116, 117, 118, 119, 120, 302, + 303, 293, 305, 306, 293, 293, 293, 293, 293, 313, + 314, 293, 418, 335, 336, 337, 338, 339, 104, 129, + 105, 104, 290, 105, 327, 380, 347, 348, 349, 489, + 367, 55, 367, 367, 519, 367, 58, 394, 523, 394, + 36, 477, 367, 193, 46, 47, 48, 106, 107, 49, + 367, 367, 144, 145, 146, 147, 68, 375, 104, 69, + 105, 277, 70, 84, 71, 343, 502, 503, 504, 91, + 68, 319, 320, 69, 396, 397, 70, 92, 71, 101, + 194, 403, 95, 96, 198, 373, 374, 93, 393, 321, + 322, 97, 377, 104, 536, 105, 104, 538, 105, 484, + -56, 198, 391, 293, 42, 133, 43, 134, -57, 367, + 367, 367, 148, 196, 232, 234, 235, 367, 238, 284, + 241, 532, 272, 273, 274, 275, 276, 367, 367, 285, + 286, 287, 288, 291, 297, 381, 333, 543, 329, 413, + 445, 446, 447, 448, 334, 382, 354, 450, 451, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 383, + 384, 367, 385, 367, 386, 389, 367, 293, 431, 293, + 293, 293, 367, 367, 437, 399, 400, 401, 402, 404, + 408, 406, 475, 476, 409, 410, 407, 416, 419, 420, + 435, 436, 429, 452, 440, 367, 367, 441, 367, 367, + 442, 449, 454, 367, 456, 369, 370, 458, 371, 455, + 459, 367, 460, 461, 464, 379, -177, 462, 473, 509, + 443, 510, 511, 387, 388, 474, 515, 466, 293, 468, + 367, -63, 1, 2, 425, 3, 4, 5, 367, 488, + 469, 470, 478, 6, 7, 493, 480, 479, 481, 482, + 490, 483, 497, 293, 293, 293, 501, 507, 493, 508, + 516, 521, 8, 485, 517, 9, 524, 367, 525, 10, + 526, 528, 367, 530, 539, 546, 537, 549, 550, 255, + 256, 551, 421, 422, 423, 554, 367, 367, 555, 557, + 428, 367, 224, 225, 367, 226, 300, 124, 513, 301, + 438, 439, 139, 527, 535, 60, 61, 325, 100, 63, + 64, 65, 66, 136, 1, 2, 41, 3, 4, 123, + 90, 0, 485, 505, 427, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 463, 0, 465, 0, 0, 467, + 0, 0, 67, 0, 0, 471, 472, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 0, 0, 0, 0, 0, -176, 0, 491, 492, + 0, 495, 496, 0, 0, 0, 500, 0, 0, 0, + 0, -63, 1, 2, 506, 3, 4, 5, 0, 0, + 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 355, 356, 0, 0, 60, 61, + 357, 522, 8, 0, 0, 9, 0, 1, 2, 10, + 3, 4, 0, 358, 359, 360, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 361, 362, 69, 0, + 540, 70, 0, 71, 135, 544, 0, 0, 0, 0, + 0, 0, 0, 363, 0, 0, 0, 0, 0, 552, + 553, 0, 0, 0, 556, 0, 0, 558, 0, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 0, 0, 0, 0, + 0, 0, 0, 60, 61, 0, 100, 108, 109, 110, + 66, 0, 1, 2, 0, 3, 4, 0, 0, 0, + 0, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 0, 182, 0, 183, 184, 185, + 67, 0, 0, 0, 0, 0, 0, 104, 0, 105, + 0, 355, 356, 0, 364, 60, 61, 357, 0, 0, + 0, 0, 0, 0, 1, 2, 0, 3, 4, 0, + 358, 359, 360, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 361, 362, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, + 363, 100, 108, 109, 110, 66, 0, 1, 2, 0, + 3, 4, 0, 0, 0, 0, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 68, 0, 67, 69, 0, 0, 70, + 0, 71, 282, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 0, 182, 0, 183, 184, 185, 60, 61, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 0, 3, + 4, 364, 149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 150, 151, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 61, 0, 62, 63, 64, 65, 66, 68, 1, + 2, 69, 3, 4, 70, 0, 71, 342, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 0, 0, 67, 0, 0, + 0, 0, 0, 0, 0, 0, 60, 61, 0, 100, + 63, 64, 65, 66, 0, 1, 2, 0, 3, 4, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 128, 182, 0, 183, 184, 185, 355, + 356, 0, 0, 67, 0, 357, 104, 0, 105, 0, + 186, 0, 0, 187, 0, 188, 0, 189, 358, 359, + 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 361, 362, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 363, 0, + 68, 0, 0, 69, 0, 0, 70, 0, 71, 0, + 0, 0, 0, 0, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 0, 60, 61, 0, 100, 108, 109, 110, 66, + 0, 1, 2, 0, 3, 4, 68, 0, 0, 69, + 0, 0, 70, 0, 71, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 67, + 182, 0, 183, 184, 185, 60, 61, 0, 100, 63, + 64, 65, 66, 0, 1, 2, 0, 3, 4, 364, + 0, 60, 61, 0, 100, 63, 64, 65, 66, 0, + 1, 2, 324, 3, 4, 0, 0, 0, 0, 0, + 60, 61, 67, 100, 63, 64, 65, 66, 412, 1, + 2, 0, 3, 4, 0, 0, 60, 61, 67, 100, + 63, 64, 65, 66, 0, 1, 2, 487, 3, 4, + 0, 0, 0, 0, 0, 60, 61, 67, 197, 63, + 64, 65, 66, 0, 1, 2, 0, 3, 4, 0, + 0, 0, 68, 67, 0, 69, 0, 0, 70, 0, + 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 61, 67, 100, 108, 109, 110, 66, 0, 1, + 2, 0, 3, 4, 60, 61, 0, 292, 63, 64, + 65, 66, 0, 1, 2, 68, 3, 4, 69, 0, + 0, 70, 0, 71, 0, 0, 0, 67, 0, 0, + 0, 68, 0, 0, 69, 0, 0, 70, 0, 71, + 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 0, 69, 0, 0, 70, 0, 71, 0, + 0, 0, 0, 0, 0, 0, 68, 0, 0, 69, + 0, 0, 70, 0, 71, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 69, 0, + 0, 70, 0, 71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, + 68, 0, 0, 69, 0, 0, 70, 0, 280, 0, + 0, 204, 205, 0, 68, 0, 0, 69, 0, 0, + 70, 0, 71, 206, 207, 208, 209, 210, 211, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 212, 213, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 214, 215, 216, 0, + 0, 217, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 218, 219, 220, 221, 222, 223 +}; -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc -#endif +static const short int yycheck[] = +{ + 0, 26, 208, 113, 216, 241, 303, 219, 220, 221, + 222, 223, 81, 0, 226, 4, 16, 326, 11, 413, + 11, 330, 31, 135, 18, 187, 188, 25, 11, 16, + 11, 209, 26, 134, 146, 242, 243, 106, 135, 48, + 113, 3, 4, 5, 6, 47, 71, 299, 16, 146, + 228, 19, 37, 38, 39, 40, 41, 42, 43, 61, + 45, 23, 24, 16, 316, 48, 19, 48, 37, 38, + 95, 112, 113, 52, 99, 44, 135, 31, 135, 134, + 105, 50, 107, 112, 113, 142, 86, 146, 129, 130, + 131, 135, 135, 532, 488, 15, 121, 136, 135, 138, + 144, 130, 131, 146, 543, 144, 318, 144, 133, 134, + 17, 135, 137, 20, 134, 139, 7, 8, 280, 10, + 11, 12, 13, 14, 518, 16, 17, 134, 19, 20, + 7, 8, 0, 10, 11, 12, 13, 14, 11, 16, + 17, 14, 19, 20, 112, 113, 353, 145, 133, 142, + 544, 142, 146, 44, 29, 30, 145, 135, 112, 113, + 140, 135, 130, 131, 142, 139, 463, 44, 465, 136, + 382, 138, 384, 385, 386, 129, 130, 131, 108, 109, + 489, 206, 33, 55, 56, 57, 58, 59, 60, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 364, 272, 273, 274, 275, 276, 136, 234, + 138, 136, 199, 138, 142, 140, 285, 286, 287, 455, + 293, 134, 295, 296, 135, 298, 19, 536, 139, 538, + 133, 443, 305, 343, 37, 38, 39, 77, 78, 42, + 313, 314, 3, 4, 5, 6, 137, 135, 136, 140, + 138, 142, 143, 18, 145, 280, 468, 469, 470, 19, + 137, 112, 113, 140, 333, 334, 143, 19, 145, 146, + 343, 340, 138, 4, 299, 300, 301, 19, 129, 130, + 131, 4, 135, 136, 520, 138, 136, 523, 138, 139, + 9, 316, 317, 318, 41, 141, 43, 141, 9, 372, + 373, 374, 9, 4, 19, 135, 139, 380, 144, 19, + 139, 517, 138, 138, 138, 138, 138, 390, 391, 138, + 138, 138, 135, 50, 11, 135, 138, 533, 144, 354, + 399, 400, 401, 402, 138, 135, 138, 406, 407, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 135, + 135, 424, 135, 426, 135, 33, 429, 382, 383, 384, + 385, 386, 435, 436, 389, 135, 135, 135, 135, 144, + 33, 135, 441, 442, 19, 4, 135, 54, 135, 135, + 135, 135, 140, 408, 135, 458, 459, 135, 461, 462, + 135, 144, 135, 466, 19, 295, 296, 14, 298, 139, + 14, 474, 138, 135, 4, 305, 0, 135, 138, 478, + 135, 480, 481, 313, 314, 440, 19, 135, 443, 135, + 493, 15, 16, 17, 48, 19, 20, 21, 501, 454, + 135, 135, 135, 27, 28, 460, 135, 139, 135, 139, + 135, 139, 135, 468, 469, 470, 135, 139, 473, 139, + 135, 142, 46, 453, 140, 49, 139, 530, 139, 53, + 139, 48, 535, 14, 4, 135, 142, 14, 14, 23, + 24, 135, 372, 373, 374, 14, 549, 550, 66, 14, + 380, 554, 124, 124, 557, 124, 212, 86, 489, 213, + 390, 391, 105, 512, 519, 7, 8, 234, 10, 11, + 12, 13, 14, 99, 16, 17, 16, 19, 20, 83, + 53, -1, 512, 473, 379, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 424, -1, 426, -1, -1, 429, + -1, -1, 44, -1, -1, 435, 436, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, -1, -1, -1, -1, -1, 0, -1, 458, 459, + -1, 461, 462, -1, -1, -1, 466, -1, -1, -1, + -1, 15, 16, 17, 474, 19, 20, 21, -1, -1, + -1, -1, -1, 27, 28, -1, -1, -1, -1, -1, + -1, -1, -1, 493, 3, 4, -1, -1, 7, 8, + 9, 501, 46, -1, -1, 49, -1, 16, 17, 53, + 19, 20, -1, 22, 23, 24, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 137, 35, 36, 140, -1, + 530, 143, -1, 145, 146, 535, -1, -1, -1, -1, + -1, -1, -1, 52, -1, -1, -1, -1, -1, 549, + 550, -1, -1, -1, 554, -1, -1, 557, -1, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, -1, -1, -1, -1, + -1, -1, -1, 7, 8, -1, 10, 11, 12, 13, + 14, -1, 16, 17, -1, 19, 20, -1, -1, -1, + -1, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, -1, 124, -1, 126, 127, 128, + 44, -1, -1, -1, -1, -1, -1, 136, -1, 138, + -1, 3, 4, -1, 143, 7, 8, 9, -1, -1, + -1, -1, -1, -1, 16, 17, -1, 19, 20, -1, + 22, 23, 24, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 35, 36, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 7, 8, + 52, 10, 11, 12, 13, 14, -1, 16, 17, -1, + 19, 20, -1, -1, -1, -1, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 137, -1, 44, 140, -1, -1, 143, + -1, 145, 146, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, -1, 124, -1, 126, 127, 128, 7, 8, -1, + -1, -1, -1, -1, -1, -1, 16, 17, -1, 19, + 20, 143, 22, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 35, 36, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 7, 8, -1, 10, 11, 12, 13, 14, 137, 16, + 17, 140, 19, 20, 143, -1, 145, 146, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, 7, 8, -1, 10, + 11, 12, 13, 14, -1, 16, 17, -1, 19, 20, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 34, 124, -1, 126, 127, 128, 3, + 4, -1, -1, 44, -1, 9, 136, -1, 138, -1, + 140, -1, -1, 143, -1, 145, -1, 147, 22, 23, + 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 35, 36, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, + 137, -1, -1, 140, -1, -1, 143, -1, 145, -1, + -1, -1, -1, -1, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, -1, 7, 8, -1, 10, 11, 12, 13, 14, + -1, 16, 17, -1, 19, 20, 137, -1, -1, 140, + -1, -1, 143, -1, 145, -1, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 44, + 124, -1, 126, 127, 128, 7, 8, -1, 10, 11, + 12, 13, 14, -1, 16, 17, -1, 19, 20, 143, + -1, 7, 8, -1, 10, 11, 12, 13, 14, -1, + 16, 17, 34, 19, 20, -1, -1, -1, -1, -1, + 7, 8, 44, 10, 11, 12, 13, 14, 34, 16, + 17, -1, 19, 20, -1, -1, 7, 8, 44, 10, + 11, 12, 13, 14, -1, 16, 17, 34, 19, 20, + -1, -1, -1, -1, -1, 7, 8, 44, 10, 11, + 12, 13, 14, -1, 16, 17, -1, 19, 20, -1, + -1, -1, 137, 44, -1, 140, -1, -1, 143, -1, + 145, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 7, 8, 44, 10, 11, 12, 13, 14, -1, 16, + 17, -1, 19, 20, 7, 8, -1, 10, 11, 12, + 13, 14, -1, 16, 17, 137, 19, 20, 140, -1, + -1, 143, -1, 145, -1, -1, -1, 44, -1, -1, + -1, 137, -1, -1, 140, -1, -1, 143, -1, 145, + -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, + 137, -1, -1, 140, -1, -1, 143, -1, 145, -1, + -1, -1, -1, -1, -1, -1, 137, -1, -1, 140, + -1, -1, 143, -1, 145, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 137, -1, -1, 140, -1, + -1, 143, -1, 145, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, + 137, -1, -1, 140, -1, -1, 143, -1, 145, -1, + -1, 50, 51, -1, 137, -1, -1, 140, -1, -1, + 143, -1, 145, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 105, 106, 107, -1, + -1, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128 +}; -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 16, 17, 19, 20, 21, 27, 28, 46, 49, + 53, 156, 158, 159, 160, 188, 189, 190, 192, 191, + 47, 61, 197, 134, 52, 134, 15, 134, 37, 38, + 39, 40, 41, 42, 43, 45, 133, 161, 162, 163, + 0, 190, 41, 43, 164, 207, 37, 38, 39, 42, + 165, 204, 206, 213, 134, 134, 140, 198, 19, 196, + 7, 8, 10, 11, 12, 13, 14, 44, 137, 140, + 143, 145, 156, 159, 177, 178, 210, 163, 163, 29, + 30, 187, 163, 163, 18, 214, 215, 26, 146, 205, + 214, 19, 19, 19, 199, 138, 4, 4, 4, 145, + 10, 146, 178, 183, 136, 138, 187, 187, 11, 12, + 13, 154, 155, 178, 184, 55, 56, 57, 58, 59, + 60, 166, 202, 202, 158, 218, 135, 142, 34, 178, + 179, 181, 182, 141, 141, 146, 183, 135, 146, 182, + 184, 178, 23, 24, 3, 4, 5, 6, 9, 22, + 35, 36, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 124, 126, 127, 128, 140, 143, 145, 147, + 149, 150, 151, 185, 210, 193, 4, 10, 178, 180, + 25, 145, 203, 32, 50, 51, 62, 63, 64, 65, + 66, 67, 83, 84, 105, 106, 107, 110, 123, 124, + 125, 126, 127, 128, 149, 150, 151, 216, 222, 223, + 224, 225, 19, 168, 135, 139, 178, 178, 144, 146, + 178, 139, 194, 195, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 152, 23, 24, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 153, 138, 138, 138, 138, 138, 142, 184, 186, + 145, 186, 146, 186, 19, 138, 138, 138, 135, 175, + 159, 50, 10, 178, 212, 11, 14, 11, 154, 166, + 152, 153, 178, 178, 212, 178, 178, 219, 212, 212, + 212, 212, 212, 178, 178, 212, 166, 108, 109, 112, + 113, 130, 131, 167, 34, 179, 170, 142, 144, 144, + 170, 175, 175, 138, 138, 184, 184, 184, 184, 184, + 135, 142, 146, 178, 186, 144, 146, 184, 184, 184, + 31, 48, 173, 176, 138, 3, 4, 9, 22, 23, + 24, 35, 36, 52, 143, 185, 209, 210, 211, 211, + 211, 211, 180, 178, 178, 135, 172, 135, 172, 211, + 140, 135, 135, 135, 135, 135, 135, 211, 211, 33, + 180, 178, 212, 129, 167, 169, 184, 184, 221, 135, + 135, 135, 135, 184, 144, 146, 135, 135, 33, 19, + 4, 175, 34, 178, 200, 201, 54, 208, 186, 135, + 135, 211, 211, 211, 11, 48, 11, 221, 211, 140, + 212, 178, 212, 212, 212, 135, 135, 178, 211, 211, + 135, 135, 135, 135, 139, 184, 184, 184, 184, 144, + 184, 184, 178, 168, 135, 139, 19, 144, 14, 14, + 138, 135, 135, 211, 4, 211, 135, 211, 135, 135, + 135, 211, 211, 138, 178, 184, 184, 212, 135, 139, + 135, 135, 139, 139, 139, 156, 157, 34, 178, 170, + 135, 211, 211, 178, 220, 211, 211, 135, 172, 172, + 211, 135, 212, 212, 212, 220, 211, 139, 139, 184, + 184, 184, 168, 173, 174, 19, 135, 140, 211, 135, + 139, 142, 211, 139, 139, 139, 139, 157, 48, 171, + 14, 142, 154, 217, 168, 178, 170, 142, 170, 4, + 211, 209, 142, 154, 211, 33, 135, 209, 168, 14, + 14, 135, 211, 211, 14, 66, 211, 14, 211 +}; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 +#define YYEMPTY (-2) #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ while (0) + #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) #endif -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif #endif -#else /* not YYLSP_NEEDED */ + + +/* YYLEX -- calling `yylex' with the right arguments. */ + #ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) +# define YYLEX yylex (YYLEX_PARAM) #else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ +# define YYLEX yylex () #endif -/* If nonreentrant, generate the variables here */ +/* Enable debugging if requested. */ +#if YYDEBUG -#ifndef YYPURE +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; #endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; #endif +{ + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); +} -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -#define YYINITDEPTH 200 +# define YYINITDEPTH 200 #endif -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 +# define YYMAXDEPTH 10000 #endif + -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif { - register char *f = from; - register char *t = to; - register int i = count; + const char *yys = yystr; + + while (*yys++ != '\0') + continue; - while (i-- > 0) - *t++ = *f++; + return yys - yystr - 1; } +# endif +# endif -#else /* __cplusplus */ +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + char *yyd = yydest; + const char *yys = yysrc; -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, unsigned int count) + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) { - register char *t = to; - register char *f = from; - register int i = count; + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; - while (i-- > 0) - *t++ = *f++; + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; } +# endif + +#endif /* YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; #endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; #endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} -#line 217 "/usr/share/bison.simple" -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ +/* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ #ifdef YYPARSE_PARAM -int yyparse (void *); +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) #else -int yyparse (void); +int +yyparse () + #endif #endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL { - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -2140,644 +2810,675 @@ so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) + if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - if (yyssp >= yyss + yystacksize - 1) + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ +/* Read a look-ahead token if we need one and don't already have one. */ /* yyresume: */ - /* First try to decide what to do without reference to lookahead token. */ + /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ + /* Not known => get a look-ahead token if don't already have one. */ + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ + if (yychar <= YYEOF) { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; + -/* Do a reduction. yyn is the number of a rule to reduce with. */ +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ -#if YYDEBUG != 0 - if (yydebug) + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) { - int i; + case 29: +#line 1061 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;} + break; - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); + case 30: +#line 1061 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_NE; ;} + break; - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif + case 31: +#line 1062 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;} + break; + case 32: +#line 1062 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;} + break; - switch (yyn) { + case 33: +#line 1063 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;} + break; -case 28: -#line 1054 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_EQ; ; - break;} -case 29: -#line 1054 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_NE; ; - break;} -case 30: -#line 1055 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_SLT; ; - break;} -case 31: -#line 1055 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_SGT; ; - break;} -case 32: -#line 1056 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_SLE; ; - break;} -case 33: -#line 1056 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_SGE; ; - break;} -case 34: -#line 1057 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_ULT; ; - break;} -case 35: -#line 1057 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_UGT; ; - break;} -case 36: -#line 1058 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_ULE; ; - break;} -case 37: -#line 1058 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.IPredicate = ICmpInst::ICMP_UGE; ; - break;} -case 38: -#line 1062 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_OEQ; ; - break;} -case 39: -#line 1062 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_ONE; ; - break;} -case 40: -#line 1063 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_OLT; ; - break;} -case 41: -#line 1063 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_OGT; ; - break;} -case 42: -#line 1064 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_OLE; ; - break;} -case 43: -#line 1064 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_OGE; ; - break;} -case 44: -#line 1065 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_ORD; ; - break;} -case 45: -#line 1065 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_UNO; ; - break;} -case 46: -#line 1066 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_UEQ; ; - break;} -case 47: -#line 1066 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_UNE; ; - break;} -case 48: -#line 1067 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_ULT; ; - break;} -case 49: -#line 1067 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_UGT; ; - break;} -case 50: -#line 1068 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_ULE; ; - break;} -case 51: -#line 1068 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_UGE; ; - break;} -case 52: -#line 1069 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_TRUE; ; - break;} -case 53: -#line 1070 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.FPredicate = FCmpInst::FCMP_FALSE; ; - break;} -case 60: -#line 1079 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 61: -#line 1083 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.StrVal = yyvsp[-1].StrVal; - CHECK_FOR_ERROR - ; - break;} -case 62: -#line 1087 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.StrVal = 0; - CHECK_FOR_ERROR - ; - break;} -case 65: -#line 1094 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.StrVal = yyvsp[-1].StrVal; - CHECK_FOR_ERROR - ; - break;} -case 66: -#line 1098 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.StrVal = 0; - CHECK_FOR_ERROR - ; - break;} -case 67: -#line 1104 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::InternalLinkage; ; - break;} -case 68: -#line 1105 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::WeakLinkage; ; - break;} -case 69: -#line 1106 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ; - break;} -case 70: -#line 1107 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::AppendingLinkage; ; - break;} -case 71: -#line 1108 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::DLLExportLinkage; ; - break;} -case 72: -#line 1112 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::DLLImportLinkage; ; - break;} -case 73: -#line 1113 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ; - break;} -case 74: -#line 1114 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalLinkage; ; - break;} -case 75: -#line 1118 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Visibility = GlobalValue::DefaultVisibility; ; - break;} -case 76: -#line 1119 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Visibility = GlobalValue::HiddenVisibility; ; - break;} -case 77: -#line 1123 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalLinkage; ; - break;} -case 78: -#line 1124 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::DLLImportLinkage; ; - break;} -case 79: -#line 1125 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ; - break;} -case 80: -#line 1129 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalLinkage; ; - break;} -case 81: -#line 1130 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::InternalLinkage; ; - break;} -case 82: -#line 1131 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ; - break;} -case 83: -#line 1132 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::WeakLinkage; ; - break;} -case 84: -#line 1133 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::DLLExportLinkage; ; - break;} -case 85: -#line 1136 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 86: -#line 1137 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 87: -#line 1138 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Fast; ; - break;} -case 88: -#line 1139 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Cold; ; - break;} -case 89: -#line 1140 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::X86_StdCall; ; - break;} -case 90: -#line 1141 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::X86_FastCall; ; - break;} -case 91: -#line 1142 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) - GEN_ERROR("Calling conv too large"); - yyval.UIntVal = yyvsp[0].UInt64Val; - CHECK_FOR_ERROR - ; - break;} -case 92: -#line 1149 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ParamAttrs = FunctionType::ZExtAttribute; ; - break;} -case 93: -#line 1150 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ParamAttrs = FunctionType::SExtAttribute; ; - break;} -case 94: -#line 1151 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ParamAttrs = FunctionType::InRegAttribute; ; - break;} -case 95: -#line 1152 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ParamAttrs = FunctionType::StructRetAttribute; ; - break;} -case 96: -#line 1155 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ParamAttrs = FunctionType::NoAttributeSet; ; - break;} -case 97: -#line 1156 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ParamAttrs = FunctionType::ParameterAttributes(yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs); - ; - break;} -case 98: -#line 1161 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ParamAttrs = FunctionType::NoReturnAttribute; ; - break;} -case 100: -#line 1165 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ParamAttrs = FunctionType::NoAttributeSet; ; - break;} -case 101: -#line 1166 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ParamAttrs = FunctionType::ParameterAttributes(yyvsp[-1].ParamAttrs | yyvsp[0].ParamAttrs); - ; - break;} -case 102: -#line 1173 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 103: -#line 1174 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + case 34: +#line 1063 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;} + break; + + case 35: +#line 1064 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;} + break; + + case 36: +#line 1064 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;} + break; + + case 37: +#line 1065 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;} + break; + + case 38: +#line 1065 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;} + break; + + case 39: +#line 1069 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;} + break; + + case 40: +#line 1069 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;} + break; + + case 41: +#line 1070 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;} + break; + + case 42: +#line 1070 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;} + break; + + case 43: +#line 1071 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;} + break; + + case 44: +#line 1071 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;} + break; + + case 45: +#line 1072 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;} + break; + + case 46: +#line 1072 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;} + break; + + case 47: +#line 1073 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;} + break; + + case 48: +#line 1073 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;} + break; + + case 49: +#line 1074 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;} + break; + + case 50: +#line 1074 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;} + break; + + case 51: +#line 1075 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;} + break; + + case 52: +#line 1075 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;} + break; + + case 53: +#line 1076 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;} + break; + + case 54: +#line 1077 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;} + break; + + case 61: +#line 1086 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = 0; ;} + break; + + case 62: +#line 1090 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = (yyvsp[-1].StrVal); + CHECK_FOR_ERROR + ;} + break; + + case 63: +#line 1094 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = 0; + CHECK_FOR_ERROR + ;} + break; + + case 66: +#line 1101 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = (yyvsp[-1].StrVal); + CHECK_FOR_ERROR + ;} + break; + + case 67: +#line 1105 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = 0; + CHECK_FOR_ERROR + ;} + break; + + case 68: +#line 1111 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} + break; + + case 69: +#line 1112 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} + break; + + case 70: +#line 1113 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} + break; + + case 71: +#line 1114 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;} + break; + + case 72: +#line 1115 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} + break; + + case 73: +#line 1119 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} + break; + + case 74: +#line 1120 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} + break; + + case 75: +#line 1121 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} + break; + + case 76: +#line 1125 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Visibility) = GlobalValue::DefaultVisibility; ;} + break; + + case 77: +#line 1126 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Visibility) = GlobalValue::HiddenVisibility; ;} + break; + + case 78: +#line 1130 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} + break; + + case 79: +#line 1131 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} + break; + + case 80: +#line 1132 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} + break; + + case 81: +#line 1136 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} + break; + + case 82: +#line 1137 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} + break; + + case 83: +#line 1138 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} + break; + + case 84: +#line 1139 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} + break; + + case 85: +#line 1140 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} + break; + + case 86: +#line 1143 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::C; ;} + break; + + case 87: +#line 1144 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::C; ;} + break; + + case 88: +#line 1145 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::Fast; ;} + break; + + case 89: +#line 1146 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::Cold; ;} + break; + + case 90: +#line 1147 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::X86_StdCall; ;} + break; + + case 91: +#line 1148 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::X86_FastCall; ;} + break; + + case 92: +#line 1149 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val)) + GEN_ERROR("Calling conv too large"); + (yyval.UIntVal) = (yyvsp[0].UInt64Val); + CHECK_FOR_ERROR + ;} + break; + + case 93: +#line 1156 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ParamAttrs) = FunctionType::ZExtAttribute; ;} + break; + + case 94: +#line 1157 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ParamAttrs) = FunctionType::SExtAttribute; ;} + break; + + case 95: +#line 1158 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ParamAttrs) = FunctionType::InRegAttribute; ;} + break; + + case 96: +#line 1159 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ParamAttrs) = FunctionType::StructRetAttribute; ;} + break; + + case 97: +#line 1162 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ParamAttrs) = FunctionType::NoAttributeSet; ;} + break; + + case 98: +#line 1163 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ParamAttrs) = FunctionType::ParameterAttributes((yyvsp[-1].ParamAttrs) | (yyvsp[0].ParamAttrs)); + ;} + break; + + case 99: +#line 1168 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ParamAttrs) = FunctionType::NoReturnAttribute; ;} + break; + + case 101: +#line 1172 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ParamAttrs) = FunctionType::NoAttributeSet; ;} + break; + + case 102: +#line 1173 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ParamAttrs) = FunctionType::ParameterAttributes((yyvsp[-1].ParamAttrs) | (yyvsp[0].ParamAttrs)); + ;} + break; + + case 103: +#line 1180 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = 0; ;} + break; + + case 104: +#line 1181 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.UIntVal) = (yyvsp[0].UInt64Val); + if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR -; - break;} -case 104: -#line 1180 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 105: -#line 1181 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) +;} + break; + + case 105: +#line 1187 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = 0; ;} + break; + + case 106: +#line 1188 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.UIntVal) = (yyvsp[0].UInt64Val); + if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) GEN_ERROR("Alignment must be a power of two"); CHECK_FOR_ERROR -; - break;} -case 106: -#line 1189 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) - if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') +;} + break; + + case 107: +#line 1196 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i) + if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\') GEN_ERROR("Invalid character in section name"); - yyval.StrVal = yyvsp[0].StrVal; + (yyval.StrVal) = (yyvsp[0].StrVal); CHECK_FOR_ERROR -; - break;} -case 107: -#line 1197 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 108: -#line 1198 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = yyvsp[0].StrVal; ; - break;} -case 109: -#line 1203 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 110: -#line 1204 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 111: -#line 1205 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurGV->setSection(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); +;} + break; + + case 108: +#line 1204 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = 0; ;} + break; + + case 109: +#line 1205 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = (yyvsp[0].StrVal); ;} + break; + + case 110: +#line 1210 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 111: +#line 1211 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 112: +#line 1212 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + CurGV->setSection((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 112: -#line 1210 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val)) + ;} + break; + + case 113: +#line 1217 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val))) GEN_ERROR("Alignment must be a power of two"); - CurGV->setAlignment(yyvsp[0].UInt64Val); + CurGV->setAlignment((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR - ; - break;} -case 117: -#line 1226 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeVal = new PATypeHolder(OpaqueType::get()); + ;} + break; + + case 118: +#line 1233 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeVal) = new PATypeHolder(OpaqueType::get()); CHECK_FOR_ERROR - ; - break;} -case 118: -#line 1230 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); + ;} + break; + + case 119: +#line 1237 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); CHECK_FOR_ERROR - ; - break;} -case 119: -#line 1234 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Pointer type? - if (*yyvsp[-1].TypeVal == Type::LabelTy) + ;} + break; + + case 120: +#line 1241 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Pointer type? + if (*(yyvsp[-1].TypeVal) == Type::LabelTy) GEN_ERROR("Cannot form a pointer to a basic block"); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); - delete yyvsp[-1].TypeVal; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[-1].TypeVal)))); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 121: +#line 1248 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Named types are also simple types... + const Type* tmp = getTypeVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - ; - break;} -case 120: -#line 1241 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Named types are also simple types... - const Type* tmp = getTypeVal(yyvsp[0].ValIDVal); - CHECK_FOR_ERROR - yyval.TypeVal = new PATypeHolder(tmp); - ; - break;} -case 121: -#line 1246 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Type UpReference - if (yyvsp[0].UInt64Val > (uint64_t)~0U) GEN_ERROR("Value out of range"); + (yyval.TypeVal) = new PATypeHolder(tmp); + ;} + break; + + case 122: +#line 1253 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Type UpReference + if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder - UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector... - yyval.TypeVal = new PATypeHolder(OT); + UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT)); // Add to vector... + (yyval.TypeVal) = new PATypeHolder(OT); UR_OUT("New Upreference!\n"); CHECK_FOR_ERROR - ; - break;} -case 122: -#line 1254 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 123: +#line 1261 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { std::vector Params; std::vector Attrs; - Attrs.push_back(yyvsp[0].ParamAttrs); - for (TypeWithAttrsList::iterator I=yyvsp[-2].TypeWithAttrsList->begin(), E=yyvsp[-2].TypeWithAttrsList->end(); I != E; ++I) { + Attrs.push_back((yyvsp[0].ParamAttrs)); + for (TypeWithAttrsList::iterator I=(yyvsp[-2].TypeWithAttrsList)->begin(), E=(yyvsp[-2].TypeWithAttrsList)->end(); I != E; ++I) { Params.push_back(I->Ty->get()); if (I->Ty->get() != Type::VoidTy) Attrs.push_back(I->Attrs); @@ -2785,20 +3486,21 @@ bool isVarArg = Params.size() && Params.back() == Type::VoidTy; if (isVarArg) Params.pop_back(); - FunctionType *FT = FunctionType::get(*yyvsp[-4].TypeVal, Params, isVarArg, Attrs); - delete yyvsp[-2].TypeWithAttrsList; // Delete the argument list - delete yyvsp[-4].TypeVal; // Delete the return type handle - yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); - CHECK_FOR_ERROR - ; - break;} -case 123: -#line 1272 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + FunctionType *FT = FunctionType::get(*(yyvsp[-4].TypeVal), Params, isVarArg, Attrs); + delete (yyvsp[-2].TypeWithAttrsList); // Delete the argument list + delete (yyvsp[-4].TypeVal); // Delete the return type handle + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FT)); + CHECK_FOR_ERROR + ;} + break; + + case 124: +#line 1279 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { std::vector Params; std::vector Attrs; - Attrs.push_back(yyvsp[0].ParamAttrs); - for (TypeWithAttrsList::iterator I=yyvsp[-2].TypeWithAttrsList->begin(), E=yyvsp[-2].TypeWithAttrsList->end(); I != E; ++I) { + Attrs.push_back((yyvsp[0].ParamAttrs)); + for (TypeWithAttrsList::iterator I=(yyvsp[-2].TypeWithAttrsList)->begin(), E=(yyvsp[-2].TypeWithAttrsList)->end(); I != E; ++I) { Params.push_back(I->Ty->get()); if (I->Ty->get() != Type::VoidTy) Attrs.push_back(I->Attrs); @@ -2806,282 +3508,303 @@ bool isVarArg = Params.size() && Params.back() == Type::VoidTy; if (isVarArg) Params.pop_back(); - FunctionType *FT = FunctionType::get(yyvsp[-4].PrimType, Params, isVarArg, Attrs); - delete yyvsp[-2].TypeWithAttrsList; // Delete the argument list - yyval.TypeVal = new PATypeHolder(HandleUpRefs(FT)); - CHECK_FOR_ERROR - ; - break;} -case 124: -#line 1290 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Sized array type? - yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 125: -#line 1295 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Vector type? - const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); - if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) + FunctionType *FT = FunctionType::get((yyvsp[-4].PrimType), Params, isVarArg, Attrs); + delete (yyvsp[-2].TypeWithAttrsList); // Delete the argument list + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FT)); + CHECK_FOR_ERROR + ;} + break; + + case 125: +#line 1297 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Sized array type? + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 126: +#line 1302 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Vector type? + const llvm::Type* ElemTy = (yyvsp[-1].TypeVal)->get(); + if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val)) GEN_ERROR("Unsigned result not equal to signed result"); if (!ElemTy->isFloatingPoint() && !ElemTy->isInteger()) GEN_ERROR("Element type of a VectorType must be primitive"); - if (!isPowerOf2_32(yyvsp[-3].UInt64Val)) + if (!isPowerOf2_32((yyvsp[-3].UInt64Val))) GEN_ERROR("Vector length should be a power of 2"); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(VectorType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); - delete yyvsp[-1].TypeVal; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(VectorType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 126: -#line 1307 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Structure type? + ;} + break; + + case 127: +#line 1314 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Structure type? std::vector Elements; - for (std::list::iterator I = yyvsp[-1].TypeList->begin(), - E = yyvsp[-1].TypeList->end(); I != E; ++I) + for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), + E = (yyvsp[-1].TypeList)->end(); I != E; ++I) Elements.push_back(*I); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); - delete yyvsp[-1].TypeList; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); + delete (yyvsp[-1].TypeList); CHECK_FOR_ERROR - ; - break;} -case 127: -#line 1317 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Empty structure type? - yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); - CHECK_FOR_ERROR - ; - break;} -case 128: -#line 1321 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 128: +#line 1324 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Empty structure type? + (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector())); + CHECK_FOR_ERROR + ;} + break; + + case 129: +#line 1328 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { std::vector Elements; - for (std::list::iterator I = yyvsp[-2].TypeList->begin(), - E = yyvsp[-2].TypeList->end(); I != E; ++I) + for (std::list::iterator I = (yyvsp[-2].TypeList)->begin(), + E = (yyvsp[-2].TypeList)->end(); I != E; ++I) Elements.push_back(*I); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true))); - delete yyvsp[-2].TypeList; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true))); + delete (yyvsp[-2].TypeList); CHECK_FOR_ERROR - ; - break;} -case 129: -#line 1331 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Empty structure type? - yyval.TypeVal = new PATypeHolder(StructType::get(std::vector(), true)); - CHECK_FOR_ERROR - ; - break;} -case 130: -#line 1338 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeWithAttrs.Ty = yyvsp[-1].TypeVal; - yyval.TypeWithAttrs.Attrs = yyvsp[0].ParamAttrs; - ; - break;} -case 131: -#line 1345 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 130: +#line 1338 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Empty structure type? + (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector(), true)); + CHECK_FOR_ERROR + ;} + break; + + case 131: +#line 1345 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeWithAttrs).Ty = (yyvsp[-1].TypeVal); + (yyval.TypeWithAttrs).Attrs = (yyvsp[0].ParamAttrs); + ;} + break; + + case 132: +#line 1352 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); - if (!(*yyvsp[0].TypeVal)->isFirstClassType()) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); + if (!(*(yyvsp[0].TypeVal))->isFirstClassType()) GEN_ERROR("LLVM functions cannot return aggregate types"); - yyval.TypeVal = yyvsp[0].TypeVal; - ; - break;} -case 132: -#line 1352 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeVal = new PATypeHolder(Type::VoidTy); - ; - break;} -case 133: -#line 1357 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeWithAttrsList = new TypeWithAttrsList(); - yyval.TypeWithAttrsList->push_back(yyvsp[0].TypeWithAttrs); + (yyval.TypeVal) = (yyvsp[0].TypeVal); + ;} + break; + + case 133: +#line 1359 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeVal) = new PATypeHolder(Type::VoidTy); + ;} + break; + + case 134: +#line 1364 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeWithAttrsList) = new TypeWithAttrsList(); + (yyval.TypeWithAttrsList)->push_back((yyvsp[0].TypeWithAttrs)); CHECK_FOR_ERROR - ; - break;} -case 134: -#line 1362 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - (yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList)->push_back(yyvsp[0].TypeWithAttrs); + ;} + break; + + case 135: +#line 1369 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + ((yyval.TypeWithAttrsList)=(yyvsp[-2].TypeWithAttrsList))->push_back((yyvsp[0].TypeWithAttrs)); CHECK_FOR_ERROR - ; - break;} -case 136: -#line 1370 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeWithAttrsList=yyvsp[-2].TypeWithAttrsList; + ;} + break; + + case 137: +#line 1377 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeWithAttrsList)=(yyvsp[-2].TypeWithAttrsList); TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet; TWA.Ty = new PATypeHolder(Type::VoidTy); - yyval.TypeWithAttrsList->push_back(TWA); + (yyval.TypeWithAttrsList)->push_back(TWA); CHECK_FOR_ERROR - ; - break;} -case 137: -#line 1377 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeWithAttrsList = new TypeWithAttrsList; + ;} + break; + + case 138: +#line 1384 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeWithAttrsList) = new TypeWithAttrsList; TypeWithAttrs TWA; TWA.Attrs = FunctionType::NoAttributeSet; TWA.Ty = new PATypeHolder(Type::VoidTy); - yyval.TypeWithAttrsList->push_back(TWA); + (yyval.TypeWithAttrsList)->push_back(TWA); CHECK_FOR_ERROR - ; - break;} -case 138: -#line 1384 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeWithAttrsList = new TypeWithAttrsList(); + ;} + break; + + case 139: +#line 1391 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeWithAttrsList) = new TypeWithAttrsList(); CHECK_FOR_ERROR - ; - break;} -case 139: -#line 1392 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeList = new std::list(); - yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + ;} + break; + + case 140: +#line 1399 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeList) = new std::list(); + (yyval.TypeList)->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 140: -#line 1397 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + ;} + break; + + case 141: +#line 1404 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 141: -#line 1408 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr + ;} + break; + + case 142: +#line 1415 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription()); - const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); + const ArrayType *ATy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); // Verify that we have the correct size... - if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) + if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized array initialized with " + - utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + itostr(NumElements) + ""); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 142: -#line 1436 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 143: +#line 1443 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); - const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); + const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) GEN_ERROR("Type mismatch: constant sized array initialized with 0" " arguments, but has size of " + itostr(NumElements) +""); - yyval.ConstVal = ConstantArray::get(ATy, std::vector()); - delete yyvsp[-2].TypeVal; + (yyval.ConstVal) = ConstantArray::get(ATy, std::vector()); + delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 143: -#line 1452 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 144: +#line 1459 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); - const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); + const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'"); int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); - char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); - if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal)) + char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); + if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal))) GEN_ERROR("Can't build string constant of size " + - itostr((int)(EndStr-yyvsp[0].StrVal)) + + itostr((int)(EndStr-(yyvsp[0].StrVal))) + " when array has size " + itostr(NumElements) + ""); std::vector Vals; if (ETy == Type::Int8Ty) { - for (unsigned char *C = (unsigned char *)yyvsp[0].StrVal; + for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); C != (unsigned char*)EndStr; ++C) Vals.push_back(ConstantInt::get(ETy, *C)); } else { - free(yyvsp[0].StrVal); + free((yyvsp[0].StrVal)); GEN_ERROR("Cannot build string arrays of non byte sized elements"); } - free(yyvsp[0].StrVal); - yyval.ConstVal = ConstantArray::get(ATy, Vals); - delete yyvsp[-2].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 144: -#line 1481 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr + free((yyvsp[0].StrVal)); + (yyval.ConstVal) = ConstantArray::get(ATy, Vals); + delete (yyvsp[-2].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 145: +#line 1488 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription()); - const VectorType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); + const VectorType *PTy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make packed constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'"); const Type *ETy = PTy->getElementType(); int NumElements = PTy->getNumElements(); // Verify that we have the correct size... - if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) + if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized packed initialized with " + - utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + itostr(NumElements) + ""); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ConstVal = ConstantVector::get(PTy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantVector::get(PTy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 145: -#line 1509 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); + ;} + break; + + case 146: +#line 1516 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + const StructType *STy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'"); - if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes()) + if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes()) GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! - for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i) - if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i)) + for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) + if ((*(yyvsp[-1].ConstVector))[i]->getType() != STy->getElementType(i)) GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + @@ -3091,20 +3814,21 @@ if (STy->isPacked()) GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'"); - yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 146: -#line 1534 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 147: +#line 1541 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); - const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); + const StructType *STy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) GEN_ERROR("Illegal number of initializers for structure type"); @@ -3113,25 +3837,26 @@ if (STy->isPacked()) GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'"); - yyval.ConstVal = ConstantStruct::get(STy, std::vector()); - delete yyvsp[-2].TypeVal; + (yyval.ConstVal) = ConstantStruct::get(STy, std::vector()); + delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 147: -#line 1553 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const StructType *STy = dyn_cast(yyvsp[-5].TypeVal->get()); + ;} + break; + + case 148: +#line 1560 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + const StructType *STy = dyn_cast((yyvsp[-5].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-5].TypeVal)->getDescription() + "'"); + (*(yyvsp[-5].TypeVal))->getDescription() + "'"); - if (yyvsp[-2].ConstVector->size() != STy->getNumContainedTypes()) + if ((yyvsp[-2].ConstVector)->size() != STy->getNumContainedTypes()) GEN_ERROR("Illegal number of initializers for structure type"); // Check to ensure that constants are compatible with the type initializer! - for (unsigned i = 0, e = yyvsp[-2].ConstVector->size(); i != e; ++i) - if ((*yyvsp[-2].ConstVector)[i]->getType() != STy->getElementType(i)) + for (unsigned i = 0, e = (yyvsp[-2].ConstVector)->size(); i != e; ++i) + if ((*(yyvsp[-2].ConstVector))[i]->getType() != STy->getElementType(i)) GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + @@ -3142,20 +3867,21 @@ GEN_ERROR("Vector initializer to non-vector type '" + STy->getDescription() + "'"); - yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-2].ConstVector); - delete yyvsp[-5].TypeVal; delete yyvsp[-2].ConstVector; + (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-2].ConstVector)); + delete (yyvsp[-5].TypeVal); delete (yyvsp[-2].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 148: -#line 1579 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 149: +#line 1586 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription()); - const StructType *STy = dyn_cast(yyvsp[-4].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription()); + const StructType *STy = dyn_cast((yyvsp[-4].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-4].TypeVal)->getDescription() + "'"); + (*(yyvsp[-4].TypeVal))->getDescription() + "'"); if (STy->getNumContainedTypes() != 0) GEN_ERROR("Illegal number of initializers for structure type"); @@ -3165,42 +3891,45 @@ GEN_ERROR("Vector initializer to non-vector type '" + STy->getDescription() + "'"); - yyval.ConstVal = ConstantStruct::get(STy, std::vector()); - delete yyvsp[-4].TypeVal; + (yyval.ConstVal) = ConstantStruct::get(STy, std::vector()); + delete (yyvsp[-4].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 149: -#line 1599 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 150: +#line 1606 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make null pointer constant with type: '" + - (*yyvsp[-1].TypeVal)->getDescription() + "'"); + (*(yyvsp[-1].TypeVal))->getDescription() + "'"); - yyval.ConstVal = ConstantPointerNull::get(PTy); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = ConstantPointerNull::get(PTy); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 150: -#line 1611 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 151: +#line 1618 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 151: -#line 1618 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + (yyval.ConstVal) = UndefValue::get((yyvsp[-1].TypeVal)->get()); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 152: +#line 1625 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + const PointerType *Ty = dyn_cast((yyvsp[-1].TypeVal)->get()); if (Ty == 0) GEN_ERROR("Global const reference must be a pointer type"); @@ -3214,7 +3943,7 @@ Function *SavedCurFn = CurFun.CurrentFunction; CurFun.CurrentFunction = 0; - Value *V = getValNonImprovising(Ty, yyvsp[0].ValIDVal); + Value *V = getValNonImprovising(Ty, (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR CurFun.CurrentFunction = SavedCurFn; @@ -3229,16 +3958,16 @@ // First check to see if the forward references value is already created! PerModuleInfo::GlobalRefsType::iterator I = - CurModule.GlobalRefs.find(std::make_pair(PT, yyvsp[0].ValIDVal)); + CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[0].ValIDVal))); if (I != CurModule.GlobalRefs.end()) { V = I->second; // Placeholder already exists, use it... - yyvsp[0].ValIDVal.destroy(); + (yyvsp[0].ValIDVal).destroy(); } else { std::string Name; - if (yyvsp[0].ValIDVal.Type == ValID::GlobalName) - Name = yyvsp[0].ValIDVal.Name; - else if (yyvsp[0].ValIDVal.Type != ValID::GlobalID) + if ((yyvsp[0].ValIDVal).Type == ValID::GlobalName) + Name = (yyvsp[0].ValIDVal).Name; + else if ((yyvsp[0].ValIDVal).Type != ValID::GlobalID) GEN_ERROR("Invalid reference to global"); // Create the forward referenced global. @@ -3254,271 +3983,340 @@ } // Keep track of the fact that we have a forward ref to recycle it - CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV)); + CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[0].ValIDVal)), GV)); V = GV; } } - yyval.ConstVal = cast(V); - delete yyvsp[-1].TypeVal; // Free the type handle + (yyval.ConstVal) = cast(V); + delete (yyvsp[-1].TypeVal); // Free the type handle CHECK_FOR_ERROR - ; - break;} -case 152: -#line 1684 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 153: +#line 1691 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + if ((yyvsp[-1].TypeVal)->get() != (yyvsp[0].ConstVal)->getType()) GEN_ERROR("Mismatched types for constant expression: " + - (*yyvsp[-1].TypeVal)->getDescription() + " and " + yyvsp[0].ConstVal->getType()->getDescription()); - yyval.ConstVal = yyvsp[0].ConstVal; - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 153: -#line 1694 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (*(yyvsp[-1].TypeVal))->getDescription() + " and " + (yyvsp[0].ConstVal)->getType()->getDescription()); + (yyval.ConstVal) = (yyvsp[0].ConstVal); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 154: +#line 1701 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - const Type *Ty = yyvsp[-1].TypeVal->get(); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + const Type *Ty = (yyvsp[-1].TypeVal)->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) GEN_ERROR("Cannot create a null initialized value of this type"); - yyval.ConstVal = Constant::getNullValue(Ty); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = Constant::getNullValue(Ty); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 154: -#line 1704 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // integral constants - if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) + ;} + break; + + case 155: +#line 1711 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val))) GEN_ERROR("Constant value doesn't fit in type"); - yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val); + APInt Val(64, (yyvsp[0].SInt64Val)); + uint32_t BitWidth = cast((yyvsp[-1].PrimType))->getBitWidth(); + if (BitWidth > 64) + Val.sext(BitWidth); + else if (BitWidth < 64) + Val.trunc(BitWidth); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), Val); + CHECK_FOR_ERROR + ;} + break; + + case 156: +#line 1723 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // arbitrary precision integer constants + uint32_t BitWidth = cast((yyvsp[-1].PrimType))->getBitWidth(); + if ((yyvsp[0].APIntVal)->getBitWidth() > BitWidth) { + GEN_ERROR("Constant value does not fit in type"); + } else if ((yyvsp[0].APIntVal)->getBitWidth() < BitWidth) + (yyvsp[0].APIntVal)->sext(BitWidth); + else if ((yyvsp[0].APIntVal)->getBitWidth() > BitWidth) + (yyvsp[0].APIntVal)->trunc(BitWidth); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), *(yyvsp[0].APIntVal)); + delete (yyvsp[0].APIntVal); CHECK_FOR_ERROR - ; - break;} -case 155: -#line 1710 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // integral constants - if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) + ;} + break; + + case 157: +#line 1735 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val))) GEN_ERROR("Constant value doesn't fit in type"); - yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val); + uint32_t BitWidth = cast((yyvsp[-1].PrimType))->getBitWidth(); + APInt Val(BitWidth, (yyvsp[0].UInt64Val)); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), Val); + CHECK_FOR_ERROR + ;} + break; + + case 158: +#line 1743 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // arbitrary precision integer constants + uint32_t BitWidth = cast((yyvsp[-1].PrimType))->getBitWidth(); + if ((yyvsp[0].APIntVal)->getBitWidth() > BitWidth) { + GEN_ERROR("Constant value does not fit in type"); + } else if ((yyvsp[0].APIntVal)->getBitWidth() < BitWidth) + (yyvsp[0].APIntVal)->zext(BitWidth); + else if ((yyvsp[0].APIntVal)->getBitWidth() > BitWidth) + (yyvsp[0].APIntVal)->trunc(BitWidth); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), *(yyvsp[0].APIntVal)); + delete (yyvsp[0].APIntVal); CHECK_FOR_ERROR - ; - break;} -case 156: -#line 1716 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants - assert(cast(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?"); - yyval.ConstVal = ConstantInt::getTrue(); - CHECK_FOR_ERROR - ; - break;} -case 157: -#line 1721 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants - assert(cast(yyvsp[-1].PrimType)->getBitWidth() == 1 && "Not Bool?"); - yyval.ConstVal = ConstantInt::getFalse(); - CHECK_FOR_ERROR - ; - break;} -case 158: -#line 1726 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Float & Double constants - if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) + ;} + break; + + case 159: +#line 1755 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + assert(cast((yyvsp[-1].PrimType))->getBitWidth() == 1 && "Not Bool?"); + (yyval.ConstVal) = ConstantInt::getTrue(); + CHECK_FOR_ERROR + ;} + break; + + case 160: +#line 1760 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + assert(cast((yyvsp[-1].PrimType))->getBitWidth() == 1 && "Not Bool?"); + (yyval.ConstVal) = ConstantInt::getFalse(); + CHECK_FOR_ERROR + ;} + break; + + case 161: +#line 1765 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Float & Double constants + if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal))) GEN_ERROR("Floating point constant invalid for type"); - yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal); + (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].PrimType), (yyvsp[0].FPVal)); CHECK_FOR_ERROR - ; - break;} -case 159: -#line 1734 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 162: +#line 1773 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - Constant *Val = yyvsp[-3].ConstVal; - const Type *DestTy = yyvsp[-1].TypeVal->get(); - if (!CastInst::castIsValid(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy)) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + Constant *Val = (yyvsp[-3].ConstVal); + const Type *DestTy = (yyvsp[-1].TypeVal)->get(); + if (!CastInst::castIsValid((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + DestTy->getDescription() + "'"); - yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, DestTy); - delete yyvsp[-1].TypeVal; - ; - break;} -case 160: -#line 1746 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!isa(yyvsp[-2].ConstVal->getType())) + (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), DestTy); + delete (yyvsp[-1].TypeVal); + ;} + break; + + case 163: +#line 1785 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!isa((yyvsp[-2].ConstVal)->getType())) GEN_ERROR("GetElementPtr requires a pointer operand"); const Type *IdxTy = - GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), &(*yyvsp[-1].ValueList)[0], yyvsp[-1].ValueList->size(), + GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), &(*(yyvsp[-1].ValueList))[0], (yyvsp[-1].ValueList)->size(), true); if (!IdxTy) GEN_ERROR("Index list invalid for constant getelementptr"); SmallVector IdxVec; - for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i) - if (Constant *C = dyn_cast((*yyvsp[-1].ValueList)[i])) + for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i) + if (Constant *C = dyn_cast((*(yyvsp[-1].ValueList))[i])) IdxVec.push_back(C); else GEN_ERROR("Indices to constant getelementptr must be constants"); - delete yyvsp[-1].ValueList; + delete (yyvsp[-1].ValueList); - yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, &IdxVec[0], IdxVec.size()); + (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal), &IdxVec[0], IdxVec.size()); CHECK_FOR_ERROR - ; - break;} -case 161: -#line 1768 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-5].ConstVal->getType() != Type::Int1Ty) + ;} + break; + + case 164: +#line 1807 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-5].ConstVal)->getType() != Type::Int1Ty) GEN_ERROR("Select condition must be of boolean type"); - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Select operand types must match"); - yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 162: -#line 1776 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ;} + break; + + case 165: +#line 1815 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Binary operator types must match"); CHECK_FOR_ERROR; - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 163: -#line 1782 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + ;} + break; + + case 166: +#line 1821 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Logical operator types must match"); - if (!yyvsp[-3].ConstVal->getType()->isInteger()) { - if (Instruction::isShift(yyvsp[-5].BinaryOpVal) || !isa(yyvsp[-3].ConstVal->getType()) || - !cast(yyvsp[-3].ConstVal->getType())->getElementType()->isInteger()) + if (!(yyvsp[-3].ConstVal)->getType()->isInteger()) { + if (Instruction::isShift((yyvsp[-5].BinaryOpVal)) || !isa((yyvsp[-3].ConstVal)->getType()) || + !cast((yyvsp[-3].ConstVal)->getType())->getElementType()->isInteger()) GEN_ERROR("Logical operator requires integral operands"); } - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 164: -#line 1793 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ;} + break; + + case 167: +#line 1832 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("icmp operand types must match"); - yyval.ConstVal = ConstantExpr::getICmp(yyvsp[-5].IPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 165: -#line 1798 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + (yyval.ConstVal) = ConstantExpr::getICmp((yyvsp[-5].IPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + ;} + break; + + case 168: +#line 1837 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("fcmp operand types must match"); - yyval.ConstVal = ConstantExpr::getFCmp(yyvsp[-5].FPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 166: -#line 1803 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + (yyval.ConstVal) = ConstantExpr::getFCmp((yyvsp[-5].FPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + ;} + break; + + case 169: +#line 1842 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid extractelement operands"); - yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 167: -#line 1809 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + ;} + break; + + case 170: +#line 1848 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid insertelement operands"); - yyval.ConstVal = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 168: -#line 1815 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + ;} + break; + + case 171: +#line 1854 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid shufflevector operands"); - yyval.ConstVal = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 169: -#line 1824 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); + ;} + break; + + case 172: +#line 1863 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 170: -#line 1828 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ConstVector = new std::vector(); - yyval.ConstVector->push_back(yyvsp[0].ConstVal); + ;} + break; + + case 173: +#line 1867 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ConstVector) = new std::vector(); + (yyval.ConstVector)->push_back((yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 171: -#line 1836 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = false; ; - break;} -case 172: -#line 1836 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = true; ; - break;} -case 173: -#line 1847 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = ParserResult = CurModule.CurrentModule; + ;} + break; + + case 174: +#line 1875 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.BoolVal) = false; ;} + break; + + case 175: +#line 1875 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.BoolVal) = true; ;} + break; + + case 176: +#line 1886 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule; CurModule.ModuleDone(); CHECK_FOR_ERROR; - ; - break;} -case 174: -#line 1852 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = ParserResult = CurModule.CurrentModule; + ;} + break; + + case 177: +#line 1891 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = ParserResult = CurModule.CurrentModule; CurModule.ModuleDone(); CHECK_FOR_ERROR; - ; - break;} -case 177: -#line 1865 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ CurFun.isDeclare = false; ; - break;} -case 178: -#line 1865 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 180: +#line 1904 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CurFun.isDeclare = false; ;} + break; + + case 181: +#line 1904 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CurFun.FunctionDone(); CHECK_FOR_ERROR - ; - break;} -case 179: -#line 1869 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ CurFun.isDeclare = true; ; - break;} -case 180: -#line 1869 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 182: +#line 1908 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CurFun.isDeclare = true; ;} + break; + + case 183: +#line 1908 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CHECK_FOR_ERROR - ; - break;} -case 181: -#line 1872 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 184: +#line 1911 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CHECK_FOR_ERROR - ; - break;} -case 182: -#line 1875 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 185: +#line 1914 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Emit an error if there are any unresolved types left. if (!CurModule.LateResolveTypes.empty()) { const ValID &DID = CurModule.LateResolveTypes.begin()->first; @@ -3529,13 +4327,14 @@ } } CHECK_FOR_ERROR - ; - break;} -case 183: -#line 1887 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 186: +#line 1926 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: // @@ -3545,226 +4344,248 @@ // If types are not resolved eagerly, then the two types will not be // determined to be the same type! // - ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal); + ResolveTypeTo((yyvsp[-2].StrVal), *(yyvsp[0].TypeVal)); - if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) { + if (!setTypeName(*(yyvsp[0].TypeVal), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) { CHECK_FOR_ERROR // If this is a named type that is not a redefinition, add it to the slot // table. - CurModule.Types.push_back(*yyvsp[0].TypeVal); + CurModule.Types.push_back(*(yyvsp[0].TypeVal)); } - delete yyvsp[0].TypeVal; + delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 184: -#line 1911 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - ResolveTypeTo(yyvsp[-2].StrVal, yyvsp[0].PrimType); + ;} + break; + + case 187: +#line 1950 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + ResolveTypeTo((yyvsp[-2].StrVal), (yyvsp[0].PrimType)); - if (!setTypeName(yyvsp[0].PrimType, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) { + if (!setTypeName((yyvsp[0].PrimType), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) { CHECK_FOR_ERROR // If this is a named type that is not a redefinition, add it to the slot // table. - CurModule.Types.push_back(yyvsp[0].PrimType); + CurModule.Types.push_back((yyvsp[0].PrimType)); } CHECK_FOR_ERROR - ; - break;} -case 185: -#line 1922 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 188: +#line 1961 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { /* "Externally Visible" Linkage */ - if (yyvsp[0].ConstVal == 0) + if ((yyvsp[0].ConstVal) == 0) GEN_ERROR("Global value initializer is not a constant"); - CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, - yyvsp[-2].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); + CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, + (yyvsp[-2].Visibility), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 186: -#line 1929 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 189: +#line 1968 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; - ; - break;} -case 187: -#line 1932 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].ConstVal == 0) + ;} + break; + + case 190: +#line 1971 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].ConstVal) == 0) GEN_ERROR("Global value initializer is not a constant"); - CurGV = ParseGlobalVariable(yyvsp[-4].StrVal, yyvsp[-3].Linkage, yyvsp[-2].Visibility, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); + CurGV = ParseGlobalVariable((yyvsp[-4].StrVal), (yyvsp[-3].Linkage), (yyvsp[-2].Visibility), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 188: -#line 1937 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 191: +#line 1976 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; - ; - break;} -case 189: -#line 1940 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 192: +#line 1979 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); - CurGV = ParseGlobalVariable(yyvsp[-4].StrVal, yyvsp[-3].Linkage, yyvsp[-2].Visibility, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); + CurGV = ParseGlobalVariable((yyvsp[-4].StrVal), (yyvsp[-3].Linkage), (yyvsp[-2].Visibility), (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); CHECK_FOR_ERROR - delete yyvsp[0].TypeVal; - ; - break;} -case 190: -#line 1946 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + delete (yyvsp[0].TypeVal); + ;} + break; + + case 193: +#line 1985 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; CHECK_FOR_ERROR - ; - break;} -case 191: -#line 1950 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CHECK_FOR_ERROR - ; - break;} -case 192: -#line 1953 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 194: +#line 1989 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CHECK_FOR_ERROR - ; - break;} -case 193: -#line 1959 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 195: +#line 1992 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + CHECK_FOR_ERROR + ;} + break; + + case 196: +#line 1998 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm(); - char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); - std::string NewAsm(yyvsp[0].StrVal, EndStr); - free(yyvsp[0].StrVal); + char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); + std::string NewAsm((yyvsp[0].StrVal), EndStr); + free((yyvsp[0].StrVal)); if (AsmSoFar.empty()) CurModule.CurrentModule->setModuleInlineAsm(NewAsm); else CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm); CHECK_FOR_ERROR -; - break;} -case 194: -#line 1972 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); - ; - break;} -case 195: -#line 1976 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->setDataLayout(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); - ; - break;} -case 197: -#line 1983 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); +;} + break; + + case 197: +#line 2011 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); + ;} + break; + + case 198: +#line 2015 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); + ;} + break; + + case 200: +#line 2022 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 198: -#line 1988 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + ;} + break; + + case 201: +#line 2027 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 199: -#line 1993 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 202: +#line 2032 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { CHECK_FOR_ERROR - ; - break;} -case 200: -#line 2002 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 203: +#line 2041 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); - if (*yyvsp[-2].TypeVal == Type::VoidTy) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); + if (*(yyvsp[-2].TypeVal) == Type::VoidTy) GEN_ERROR("void typed arguments are invalid"); - ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal; - yyval.ArgList = yyvsp[-4].ArgList; - yyvsp[-4].ArgList->push_back(E); - CHECK_FOR_ERROR - ; - break;} -case 201: -#line 2012 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ArgListEntry E; E.Attrs = (yyvsp[-1].ParamAttrs); E.Ty = (yyvsp[-2].TypeVal); E.Name = (yyvsp[0].StrVal); + (yyval.ArgList) = (yyvsp[-4].ArgList); + (yyvsp[-4].ArgList)->push_back(E); + CHECK_FOR_ERROR + ;} + break; + + case 204: +#line 2051 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); - if (*yyvsp[-2].TypeVal == Type::VoidTy) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); + if (*(yyvsp[-2].TypeVal) == Type::VoidTy) GEN_ERROR("void typed arguments are invalid"); - ArgListEntry E; E.Attrs = yyvsp[-1].ParamAttrs; E.Ty = yyvsp[-2].TypeVal; E.Name = yyvsp[0].StrVal; - yyval.ArgList = new ArgListType; - yyval.ArgList->push_back(E); - CHECK_FOR_ERROR - ; - break;} -case 202: -#line 2023 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = yyvsp[0].ArgList; + ArgListEntry E; E.Attrs = (yyvsp[-1].ParamAttrs); E.Ty = (yyvsp[-2].TypeVal); E.Name = (yyvsp[0].StrVal); + (yyval.ArgList) = new ArgListType; + (yyval.ArgList)->push_back(E); CHECK_FOR_ERROR - ; - break;} -case 203: -#line 2027 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = yyvsp[-2].ArgList; + ;} + break; + + case 205: +#line 2062 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = (yyvsp[0].ArgList); + CHECK_FOR_ERROR + ;} + break; + + case 206: +#line 2066 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = (yyvsp[-2].ArgList); struct ArgListEntry E; E.Ty = new PATypeHolder(Type::VoidTy); E.Name = 0; E.Attrs = FunctionType::NoAttributeSet; - yyval.ArgList->push_back(E); + (yyval.ArgList)->push_back(E); CHECK_FOR_ERROR - ; - break;} -case 204: -#line 2036 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = new ArgListType; + ;} + break; + + case 207: +#line 2075 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = new ArgListType; struct ArgListEntry E; E.Ty = new PATypeHolder(Type::VoidTy); E.Name = 0; E.Attrs = FunctionType::NoAttributeSet; - yyval.ArgList->push_back(E); + (yyval.ArgList)->push_back(E); CHECK_FOR_ERROR - ; - break;} -case 205: -#line 2045 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = 0; + ;} + break; + + case 208: +#line 2084 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = 0; CHECK_FOR_ERROR - ; - break;} -case 206: -#line 2051 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - UnEscapeLexed(yyvsp[-6].StrVal); - std::string FunctionName(yyvsp[-6].StrVal); - free(yyvsp[-6].StrVal); // Free strdup'd memory! + ;} + break; + + case 209: +#line 2090 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + UnEscapeLexed((yyvsp[-6].StrVal)); + std::string FunctionName((yyvsp[-6].StrVal)); + free((yyvsp[-6].StrVal)); // Free strdup'd memory! // Check the function result for abstractness if this is a define. We should // have no abstract types at this point - if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(yyvsp[-7].TypeVal)) - GEN_ERROR("Reference to abstract result: "+ yyvsp[-7].TypeVal->get()->getDescription()); + if (!CurFun.isDeclare && CurModule.TypeIsUnresolved((yyvsp[-7].TypeVal))) + GEN_ERROR("Reference to abstract result: "+ (yyvsp[-7].TypeVal)->get()->getDescription()); std::vector ParamTypeList; std::vector ParamAttrs; - ParamAttrs.push_back(yyvsp[-2].ParamAttrs); - if (yyvsp[-4].ArgList) { // If there are arguments... - for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); I != yyvsp[-4].ArgList->end(); ++I) { + ParamAttrs.push_back((yyvsp[-2].ParamAttrs)); + if ((yyvsp[-4].ArgList)) { // If there are arguments... + for (ArgListType::iterator I = (yyvsp[-4].ArgList)->begin(); I != (yyvsp[-4].ArgList)->end(); ++I) { const Type* Ty = I->Ty->get(); if (!CurFun.isDeclare && CurModule.TypeIsUnresolved(I->Ty)) GEN_ERROR("Reference to abstract argument: " + Ty->getDescription()); @@ -3777,10 +4598,10 @@ bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; if (isVarArg) ParamTypeList.pop_back(); - FunctionType *FT = FunctionType::get(*yyvsp[-7].TypeVal, ParamTypeList, isVarArg, + FunctionType *FT = FunctionType::get(*(yyvsp[-7].TypeVal), ParamTypeList, isVarArg, ParamAttrs); const PointerType *PFT = PointerType::get(FT); - delete yyvsp[-7].TypeVal; + delete (yyvsp[-7].TypeVal); ValID ID; if (!FunctionName.empty()) { @@ -3829,26 +4650,26 @@ Fn->setLinkage(CurFun.Linkage); Fn->setVisibility(CurFun.Visibility); } - Fn->setCallingConv(yyvsp[-8].UIntVal); - Fn->setAlignment(yyvsp[0].UIntVal); - if (yyvsp[-1].StrVal) { - Fn->setSection(yyvsp[-1].StrVal); - free(yyvsp[-1].StrVal); + Fn->setCallingConv((yyvsp[-8].UIntVal)); + Fn->setAlignment((yyvsp[0].UIntVal)); + if ((yyvsp[-1].StrVal)) { + Fn->setSection((yyvsp[-1].StrVal)); + free((yyvsp[-1].StrVal)); } // Add all of the arguments we parsed to the function... - if (yyvsp[-4].ArgList) { // Is null if empty... + if ((yyvsp[-4].ArgList)) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert(yyvsp[-4].ArgList->back().Ty->get() == Type::VoidTy && yyvsp[-4].ArgList->back().Name == 0 && + assert((yyvsp[-4].ArgList)->back().Ty->get() == Type::VoidTy && (yyvsp[-4].ArgList)->back().Name == 0 && "Not a varargs marker!"); - delete yyvsp[-4].ArgList->back().Ty; - yyvsp[-4].ArgList->pop_back(); // Delete the last entry + delete (yyvsp[-4].ArgList)->back().Ty; + (yyvsp[-4].ArgList)->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); Function::arg_iterator ArgEnd = Fn->arg_end(); unsigned Idx = 1; - for (ArgListType::iterator I = yyvsp[-4].ArgList->begin(); - I != yyvsp[-4].ArgList->end() && ArgIt != ArgEnd; ++I, ++ArgIt) { + for (ArgListType::iterator I = (yyvsp[-4].ArgList)->begin(); + I != (yyvsp[-4].ArgList)->end() && ArgIt != ArgEnd; ++I, ++ArgIt) { delete I->Ty; // Delete the typeholder... setValueName(ArgIt, I->Name); // Insert arg into symtab... CHECK_FOR_ERROR @@ -3856,114 +4677,128 @@ Idx++; } - delete yyvsp[-4].ArgList; // We're now done with the argument list + delete (yyvsp[-4].ArgList); // We're now done with the argument list } CHECK_FOR_ERROR -; - break;} -case 209: -#line 2164 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.FunctionVal = CurFun.CurrentFunction; +;} + break; + + case 212: +#line 2203 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.FunctionVal) = CurFun.CurrentFunction; // Make sure that we keep track of the linkage type even if there was a // previous "declare". - yyval.FunctionVal->setLinkage(yyvsp[-3].Linkage); - yyval.FunctionVal->setVisibility(yyvsp[-2].Visibility); -; - break;} -case 212: -#line 2175 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.FunctionVal = yyvsp[-1].FunctionVal; + (yyval.FunctionVal)->setLinkage((yyvsp[-3].Linkage)); + (yyval.FunctionVal)->setVisibility((yyvsp[-2].Visibility)); +;} + break; + + case 215: +#line 2214 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR -; - break;} -case 213: -#line 2180 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurFun.CurrentFunction->setLinkage(yyvsp[-2].Linkage); - CurFun.CurrentFunction->setVisibility(yyvsp[-1].Visibility); - yyval.FunctionVal = CurFun.CurrentFunction; +;} + break; + + case 216: +#line 2219 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + CurFun.CurrentFunction->setLinkage((yyvsp[-2].Linkage)); + CurFun.CurrentFunction->setVisibility((yyvsp[-1].Visibility)); + (yyval.FunctionVal) = CurFun.CurrentFunction; CurFun.FunctionDone(); CHECK_FOR_ERROR - ; - break;} -case 214: -#line 2192 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = false; + ;} + break; + + case 217: +#line 2231 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = false; CHECK_FOR_ERROR - ; - break;} -case 215: -#line 2196 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = true; + ;} + break; + + case 218: +#line 2235 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = true; CHECK_FOR_ERROR - ; - break;} -case 216: -#line 2201 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // A reference to a direct constant - yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); - CHECK_FOR_ERROR - ; - break;} -case 217: -#line 2205 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); + ;} + break; + + case 219: +#line 2240 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // A reference to a direct constant + (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); CHECK_FOR_ERROR - ; - break;} -case 218: -#line 2209 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Perhaps it's an FP constant? - yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); - CHECK_FOR_ERROR - ; - break;} -case 219: -#line 2213 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(ConstantInt::getTrue()); + ;} + break; + + case 220: +#line 2244 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR - ; - break;} -case 220: -#line 2217 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(ConstantInt::getFalse()); + ;} + break; + + case 221: +#line 2248 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Perhaps it's an FP constant? + (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); CHECK_FOR_ERROR - ; - break;} -case 221: -#line 2221 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::createNull(); + ;} + break; + + case 222: +#line 2252 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create(ConstantInt::getTrue()); CHECK_FOR_ERROR - ; - break;} -case 222: -#line 2225 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::createUndef(); + ;} + break; + + case 223: +#line 2256 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create(ConstantInt::getFalse()); CHECK_FOR_ERROR - ; - break;} -case 223: -#line 2229 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // A vector zero constant. - yyval.ValIDVal = ValID::createZeroInit(); - CHECK_FOR_ERROR - ; - break;} -case 224: -#line 2233 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized packed vector - const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); - int NumElements = yyvsp[-1].ConstVector->size(); + ;} + break; + + case 224: +#line 2260 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::createNull(); + CHECK_FOR_ERROR + ;} + break; + + case 225: +#line 2264 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::createUndef(); + CHECK_FOR_ERROR + ;} + break; + + case 226: +#line 2268 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // A vector zero constant. + (yyval.ValIDVal) = ValID::createZeroInit(); + CHECK_FOR_ERROR + ;} + break; + + case 227: +#line 2272 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized packed vector + const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType(); + int NumElements = (yyvsp[-1].ConstVector)->size(); VectorType* pt = VectorType::get(ETy, NumElements); PATypeHolder* PTy = new PATypeHolder( @@ -3975,118 +4810,130 @@ ); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '" + - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ValIDVal = ValID::create(ConstantVector::get(pt, *yyvsp[-1].ConstVector)); - delete PTy; delete yyvsp[-1].ConstVector; + (yyval.ValIDVal) = ValID::create(ConstantVector::get(pt, *(yyvsp[-1].ConstVector))); + delete PTy; delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 225: -#line 2258 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); + ;} + break; + + case 228: +#line 2297 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 226: -#line 2262 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - char *End = UnEscapeLexed(yyvsp[-2].StrVal, true); - std::string AsmStr = std::string(yyvsp[-2].StrVal, End); - End = UnEscapeLexed(yyvsp[0].StrVal, true); - std::string Constraints = std::string(yyvsp[0].StrVal, End); - yyval.ValIDVal = ValID::createInlineAsm(AsmStr, Constraints, yyvsp[-3].BoolVal); - free(yyvsp[-2].StrVal); - free(yyvsp[0].StrVal); - CHECK_FOR_ERROR - ; - break;} -case 227: -#line 2276 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Is it an integer reference...? - yyval.ValIDVal = ValID::createLocalID(yyvsp[0].UIntVal); - CHECK_FOR_ERROR - ; - break;} -case 228: -#line 2280 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::createGlobalID(yyvsp[0].UIntVal); + ;} + break; + + case 229: +#line 2301 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + char *End = UnEscapeLexed((yyvsp[-2].StrVal), true); + std::string AsmStr = std::string((yyvsp[-2].StrVal), End); + End = UnEscapeLexed((yyvsp[0].StrVal), true); + std::string Constraints = std::string((yyvsp[0].StrVal), End); + (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal)); + free((yyvsp[-2].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 229: -#line 2284 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Is it a named reference...? - yyval.ValIDVal = ValID::createLocalName(yyvsp[0].StrVal); - CHECK_FOR_ERROR - ; - break;} -case 230: -#line 2288 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Is it a named reference...? - yyval.ValIDVal = ValID::createGlobalName(yyvsp[0].StrVal); - CHECK_FOR_ERROR - ; - break;} -case 233: -#line 2300 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 230: +#line 2315 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Is it an integer reference...? + (yyval.ValIDVal) = ValID::createLocalID((yyvsp[0].UIntVal)); + CHECK_FOR_ERROR + ;} + break; + + case 231: +#line 2319 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::createGlobalID((yyvsp[0].UIntVal)); + CHECK_FOR_ERROR + ;} + break; + + case 232: +#line 2323 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Is it a named reference...? + (yyval.ValIDVal) = ValID::createLocalName((yyvsp[0].StrVal)); + CHECK_FOR_ERROR + ;} + break; + + case 233: +#line 2327 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Is it a named reference...? + (yyval.ValIDVal) = ValID::createGlobalName((yyvsp[0].StrVal)); + CHECK_FOR_ERROR + ;} + break; + + case 236: +#line 2339 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 234: -#line 2309 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.FunctionVal = yyvsp[-1].FunctionVal; + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + (yyval.ValueVal) = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 237: +#line 2348 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); + CHECK_FOR_ERROR + ;} + break; + + case 238: +#line 2352 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Do not allow functions with 0 basic blocks + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); + CHECK_FOR_ERROR + ;} + break; + + case 239: +#line 2361 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 235: -#line 2313 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Do not allow functions with 0 basic blocks - yyval.FunctionVal = yyvsp[-1].FunctionVal; - CHECK_FOR_ERROR - ; - break;} -case 236: -#line 2322 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); + InsertValue((yyvsp[0].TermInstVal)); + (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal)); + InsertValue((yyvsp[-2].BasicBlockVal)); + (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal); CHECK_FOR_ERROR - InsertValue(yyvsp[0].TermInstVal); - yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal); - InsertValue(yyvsp[-2].BasicBlockVal); - yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; - CHECK_FOR_ERROR - ; - break;} -case 237: -#line 2332 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (CastInst *CI1 = dyn_cast(yyvsp[0].InstVal)) + ;} + break; + + case 240: +#line 2371 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (CastInst *CI1 = dyn_cast((yyvsp[0].InstVal))) if (CastInst *CI2 = dyn_cast(CI1->getOperand(0))) if (CI2->getParent() == 0) - yyvsp[-1].BasicBlockVal->getInstList().push_back(CI2); - yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); - yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; - CHECK_FOR_ERROR - ; - break;} -case 238: -#line 2341 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BasicBlockVal = getBBVal(ValID::createLocalID(CurFun.NextBBNum++), true); + (yyvsp[-1].BasicBlockVal)->getInstList().push_back(CI2); + (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal)); + (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal); + CHECK_FOR_ERROR + ;} + break; + + case 241: +#line 2380 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BasicBlockVal) = getBBVal(ValID::createLocalID(CurFun.NextBBNum++), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -4094,14 +4941,15 @@ // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); CHECK_FOR_ERROR - ; - break;} -case 239: -#line 2353 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BasicBlockVal = getBBVal(ValID::createLocalName(yyvsp[0].StrVal), true); + ;} + break; + + case 242: +#line 2392 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BasicBlockVal) = getBBVal(ValID::createLocalName((yyvsp[0].StrVal)), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -4109,93 +4957,100 @@ // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); CHECK_FOR_ERROR - ; - break;} -case 240: -#line 2366 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Return with a result... - yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); - CHECK_FOR_ERROR - ; - break;} -case 241: -#line 2370 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Return with no result... - yyval.TermInstVal = new ReturnInst(); - CHECK_FOR_ERROR - ; - break;} -case 242: -#line 2374 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Unconditional Branch... - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); - CHECK_FOR_ERROR - yyval.TermInstVal = new BranchInst(tmpBB); - ; - break;} -case 243: -#line 2379 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - assert(cast(yyvsp[-7].PrimType)->getBitWidth() == 1 && "Not Bool?"); - BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal); - CHECK_FOR_ERROR - BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal); - CHECK_FOR_ERROR - Value* tmpVal = getVal(Type::Int1Ty, yyvsp[-6].ValIDVal); - CHECK_FOR_ERROR - yyval.TermInstVal = new BranchInst(tmpBBA, tmpBBB, tmpVal); - ; - break;} -case 244: -#line 2389 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal); + ;} + break; + + case 243: +#line 2405 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Return with a result... + (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal)); + CHECK_FOR_ERROR + ;} + break; + + case 244: +#line 2409 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Return with no result... + (yyval.TermInstVal) = new ReturnInst(); + CHECK_FOR_ERROR + ;} + break; + + case 245: +#line 2413 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Unconditional Branch... + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); + CHECK_FOR_ERROR + (yyval.TermInstVal) = new BranchInst(tmpBB); + ;} + break; + + case 246: +#line 2418 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + assert(cast((yyvsp[-7].PrimType))->getBitWidth() == 1 && "Not Bool?"); + BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal)); + CHECK_FOR_ERROR + BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal)); + CHECK_FOR_ERROR + Value* tmpVal = getVal(Type::Int1Ty, (yyvsp[-6].ValIDVal)); + CHECK_FOR_ERROR + (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal); + ;} + break; + + case 247: +#line 2428 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + Value* tmpVal = getVal((yyvsp[-7].PrimType), (yyvsp[-6].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - SwitchInst *S = new SwitchInst(tmpVal, tmpBB, yyvsp[-1].JumpTable->size()); - yyval.TermInstVal = S; + SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size()); + (yyval.TermInstVal) = S; - std::vector >::iterator I = yyvsp[-1].JumpTable->begin(), - E = yyvsp[-1].JumpTable->end(); + std::vector >::iterator I = (yyvsp[-1].JumpTable)->begin(), + E = (yyvsp[-1].JumpTable)->end(); for (; I != E; ++I) { if (ConstantInt *CI = dyn_cast(I->first)) S->addCase(CI, I->second); else GEN_ERROR("Switch case is constant, but not a simple integer"); } - delete yyvsp[-1].JumpTable; + delete (yyvsp[-1].JumpTable); CHECK_FOR_ERROR - ; - break;} -case 245: -#line 2408 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal); + ;} + break; + + case 248: +#line 2447 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + Value* tmpVal = getVal((yyvsp[-6].PrimType), (yyvsp[-5].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0); - yyval.TermInstVal = S; + (yyval.TermInstVal) = S; CHECK_FOR_ERROR - ; - break;} -case 246: -#line 2418 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 249: +#line 2457 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Handle the short syntax const PointerType *PFTy = 0; const FunctionType *Ty = 0; - if (!(PFTy = dyn_cast(yyvsp[-11].TypeVal->get())) || + if (!(PFTy = dyn_cast((yyvsp[-11].TypeVal)->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; FunctionType::ParamAttrsList ParamAttrs; - ParamAttrs.push_back(yyvsp[-6].ParamAttrs); - for (ValueRefList::iterator I = yyvsp[-8].ValueRefList->begin(), E = yyvsp[-8].ValueRefList->end(); I != E; ++I) { + ParamAttrs.push_back((yyvsp[-6].ParamAttrs)); + for (ValueRefList::iterator I = (yyvsp[-8].ValueRefList)->begin(), E = (yyvsp[-8].ValueRefList)->end(); I != E; ++I) { const Type *Ty = I->Val->getType(); if (Ty == Type::VoidTy) GEN_ERROR("Short call syntax cannot be used with varargs"); @@ -4203,20 +5058,20 @@ ParamAttrs.push_back(I->Attrs); } - Ty = FunctionType::get(yyvsp[-11].TypeVal->get(), ParamTypes, false, ParamAttrs); + Ty = FunctionType::get((yyvsp[-11].TypeVal)->get(), ParamTypes, false, ParamAttrs); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, yyvsp[-10].ValIDVal); // Get the function we're calling... + Value *V = getVal(PFTy, (yyvsp[-10].ValIDVal)); // Get the function we're calling... CHECK_FOR_ERROR - BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal); + BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR // Check the arguments ValueList Args; - if (yyvsp[-8].ValueRefList->empty()) { // Has no arguments? + if ((yyvsp[-8].ValueRefList)->empty()) { // Has no arguments? // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " @@ -4226,7 +5081,7 @@ // correctly! FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - ValueRefList::iterator ArgI = yyvsp[-8].ValueRefList->begin(), ArgE = yyvsp[-8].ValueRefList->end(); + ValueRefList::iterator ArgI = (yyvsp[-8].ValueRefList)->begin(), ArgE = (yyvsp[-8].ValueRefList)->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) @@ -4245,314 +5100,340 @@ // Create the InvokeInst InvokeInst *II = new InvokeInst(V, Normal, Except, &Args[0], Args.size()); - II->setCallingConv(yyvsp[-12].UIntVal); - yyval.TermInstVal = II; - delete yyvsp[-8].ValueRefList; - CHECK_FOR_ERROR - ; - break;} -case 247: -#line 2484 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TermInstVal = new UnwindInst(); + II->setCallingConv((yyvsp[-12].UIntVal)); + (yyval.TermInstVal) = II; + delete (yyvsp[-8].ValueRefList); CHECK_FOR_ERROR - ; - break;} -case 248: -#line 2488 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TermInstVal = new UnreachableInst(); + ;} + break; + + case 250: +#line 2523 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TermInstVal) = new UnwindInst(); CHECK_FOR_ERROR - ; - break;} -case 249: -#line 2495 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.JumpTable = yyvsp[-5].JumpTable; - Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + ;} + break; + + case 251: +#line 2527 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TermInstVal) = new UnreachableInst(); + CHECK_FOR_ERROR + ;} + break; + + case 252: +#line 2534 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.JumpTable) = (yyvsp[-5].JumpTable); + Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value"); - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); - ; - break;} -case 250: -#line 2506 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.JumpTable = new std::vector >(); - Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); + ;} + break; + + case 253: +#line 2545 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.JumpTable) = new std::vector >(); + Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value"); - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); - ; - break;} -case 251: -#line 2519 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); + ;} + break; + + case 254: +#line 2558 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Is this definition named?? if so, assign the name... - setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); + setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal)); CHECK_FOR_ERROR - InsertValue(yyvsp[0].InstVal); - yyval.InstVal = yyvsp[0].InstVal; + InsertValue((yyvsp[0].InstVal)); + (yyval.InstVal) = (yyvsp[0].InstVal); CHECK_FOR_ERROR - ; - break;} -case 252: -#line 2529 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Used for PHI nodes + ;} + break; + + case 255: +#line 2568 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Used for PHI nodes if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-5].TypeVal)->getDescription()); - yyval.PHIList = new std::list >(); - Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal); - CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); - CHECK_FOR_ERROR - yyval.PHIList->push_back(std::make_pair(tmpVal, tmpBB)); - delete yyvsp[-5].TypeVal; - ; - break;} -case 253: -#line 2540 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.PHIList = yyvsp[-6].PHIList; - Value* tmpVal = getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-5].TypeVal))->getDescription()); + (yyval.PHIList) = new std::list >(); + Value* tmpVal = getVal(*(yyvsp[-5].TypeVal), (yyvsp[-3].ValIDVal)); + CHECK_FOR_ERROR + BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); + CHECK_FOR_ERROR + (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); + delete (yyvsp[-5].TypeVal); + ;} + break; + + case 256: +#line 2579 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.PHIList) = (yyvsp[-6].PHIList); + Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyvsp[-6].PHIList->push_back(std::make_pair(tmpVal, tmpBB)); - ; - break;} -case 254: -#line 2550 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (yyvsp[-6].PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); + ;} + break; + + case 257: +#line 2589 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); // Used for call and invoke instructions - yyval.ValueRefList = new ValueRefList(); - ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal); - yyval.ValueRefList->push_back(E); - ; - break;} -case 255: -#line 2558 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (yyval.ValueRefList) = new ValueRefList(); + ValueRefListEntry E; E.Attrs = (yyvsp[0].ParamAttrs); E.Val = getVal((yyvsp[-2].TypeVal)->get(), (yyvsp[-1].ValIDVal)); + (yyval.ValueRefList)->push_back(E); + ;} + break; + + case 258: +#line 2597 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); - yyval.ValueRefList = yyvsp[-4].ValueRefList; - ValueRefListEntry E; E.Attrs = yyvsp[0].ParamAttrs; E.Val = getVal(yyvsp[-2].TypeVal->get(), yyvsp[-1].ValIDVal); - yyval.ValueRefList->push_back(E); - CHECK_FOR_ERROR - ; - break;} -case 256: -#line 2566 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ValueRefList = new ValueRefList(); ; - break;} -case 257: -#line 2569 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ValueList = new std::vector(); ; - break;} -case 258: -#line 2570 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValueList = yyvsp[-2].ValueList; - yyval.ValueList->push_back(yyvsp[0].ValueVal); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); + (yyval.ValueRefList) = (yyvsp[-4].ValueRefList); + ValueRefListEntry E; E.Attrs = (yyvsp[0].ParamAttrs); E.Val = getVal((yyvsp[-2].TypeVal)->get(), (yyvsp[-1].ValIDVal)); + (yyval.ValueRefList)->push_back(E); CHECK_FOR_ERROR - ; - break;} -case 259: -#line 2577 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = true; + ;} + break; + + case 259: +#line 2605 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ValueRefList) = new ValueRefList(); ;} + break; + + case 260: +#line 2608 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { (yyval.ValueList) = new std::vector(); ;} + break; + + case 261: +#line 2609 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValueList) = (yyvsp[-2].ValueList); + (yyval.ValueList)->push_back((yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 260: -#line 2581 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = false; + ;} + break; + + case 262: +#line 2616 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = true; CHECK_FOR_ERROR - ; - break;} -case 261: -#line 2586 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 263: +#line 2620 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = false; + CHECK_FOR_ERROR + ;} + break; + + case 264: +#line 2625 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription()); - if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && - !isa((*yyvsp[-3].TypeVal).get())) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); + if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() && + !isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR( "Arithmetic operator requires integer, FP, or packed operands"); - if (isa((*yyvsp[-3].TypeVal).get()) && - (yyvsp[-4].BinaryOpVal == Instruction::URem || - yyvsp[-4].BinaryOpVal == Instruction::SRem || - yyvsp[-4].BinaryOpVal == Instruction::FRem)) + if (isa((*(yyvsp[-3].TypeVal)).get()) && + ((yyvsp[-4].BinaryOpVal) == Instruction::URem || + (yyvsp[-4].BinaryOpVal) == Instruction::SRem || + (yyvsp[-4].BinaryOpVal) == Instruction::FRem)) GEN_ERROR("Remainder not supported on vector types"); - Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), val1, val2); + if ((yyval.InstVal) == 0) GEN_ERROR("binary operator returned null"); - delete yyvsp[-3].TypeVal; - ; - break;} -case 262: -#line 2607 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + delete (yyvsp[-3].TypeVal); + ;} + break; + + case 265: +#line 2646 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription()); - if (!(*yyvsp[-3].TypeVal)->isInteger()) { - if (Instruction::isShift(yyvsp[-4].BinaryOpVal) || !isa(yyvsp[-3].TypeVal->get()) || - !cast(yyvsp[-3].TypeVal->get())->getElementType()->isInteger()) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); + if (!(*(yyvsp[-3].TypeVal))->isInteger()) { + if (Instruction::isShift((yyvsp[-4].BinaryOpVal)) || !isa((yyvsp[-3].TypeVal)->get()) || + !cast((yyvsp[-3].TypeVal)->get())->getElementType()->isInteger()) GEN_ERROR("Logical operator requires integral operands"); } - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("binary operator returned null"); - delete yyvsp[-3].TypeVal; - ; - break;} -case 263: -#line 2624 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + delete (yyvsp[-3].TypeVal); + ;} + break; + + case 266: +#line 2663 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription()); - if (isa((*yyvsp[-3].TypeVal).get())) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); + if (isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR("Vector types not supported by icmp instruction"); - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].IPredicate, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].IPredicate), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("icmp operator returned null"); - ; - break;} -case 264: -#line 2637 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 267: +#line 2676 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-3].TypeVal)->getDescription()); - if (isa((*yyvsp[-3].TypeVal).get())) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-3].TypeVal))->getDescription()); + if (isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR("Vector types not supported by fcmp instruction"); - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].FPredicate, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].FPredicate), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("fcmp operator returned null"); - ; - break;} -case 265: -#line 2650 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 268: +#line 2689 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); - Value* Val = yyvsp[-2].ValueVal; - const Type* DestTy = yyvsp[0].TypeVal->get(); - if (!CastInst::castIsValid(yyvsp[-3].CastOpVal, Val, DestTy)) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); + Value* Val = (yyvsp[-2].ValueVal); + const Type* DestTy = (yyvsp[0].TypeVal)->get(); + if (!CastInst::castIsValid((yyvsp[-3].CastOpVal), Val, DestTy)) GEN_ERROR("invalid cast opcode for cast from '" + Val->getType()->getDescription() + "' to '" + DestTy->getDescription() + "'"); - yyval.InstVal = CastInst::create(yyvsp[-3].CastOpVal, Val, DestTy); - delete yyvsp[0].TypeVal; - ; - break;} -case 266: -#line 2662 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-4].ValueVal->getType() != Type::Int1Ty) + (yyval.InstVal) = CastInst::create((yyvsp[-3].CastOpVal), Val, DestTy); + delete (yyvsp[0].TypeVal); + ;} + break; + + case 269: +#line 2701 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-4].ValueVal)->getType() != Type::Int1Ty) GEN_ERROR("select condition must be boolean"); - if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType()) + if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType()) GEN_ERROR("select value types should match"); - yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 267: -#line 2670 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 270: +#line 2709 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); - yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); - delete yyvsp[0].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 268: -#line 2677 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); + (yyval.InstVal) = new VAArgInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal)); + delete (yyvsp[0].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 271: +#line 2716 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid extractelement operands"); - yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 269: -#line 2683 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + ;} + break; + + case 272: +#line 2722 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid insertelement operands"); - yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 270: -#line 2689 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + ;} + break; + + case 273: +#line 2728 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid shufflevector operands"); - yyval.InstVal = new ShuffleVectorInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 271: -#line 2695 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const Type *Ty = yyvsp[0].PHIList->front().first->getType(); + ;} + break; + + case 274: +#line 2734 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + const Type *Ty = (yyvsp[0].PHIList)->front().first->getType(); if (!Ty->isFirstClassType()) GEN_ERROR("PHI node operands must be of first class type"); - yyval.InstVal = new PHINode(Ty); - ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size()); - while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) { - if (yyvsp[0].PHIList->front().first->getType() != Ty) + (yyval.InstVal) = new PHINode(Ty); + ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size()); + while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) { + if ((yyvsp[0].PHIList)->front().first->getType() != Ty) GEN_ERROR("All elements of a PHI node must be of the same type"); - cast(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second); - yyvsp[0].PHIList->pop_front(); + cast((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second); + (yyvsp[0].PHIList)->pop_front(); } - delete yyvsp[0].PHIList; // Free the list... + delete (yyvsp[0].PHIList); // Free the list... CHECK_FOR_ERROR - ; - break;} -case 272: -#line 2711 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 275: +#line 2750 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { // Handle the short syntax const PointerType *PFTy = 0; const FunctionType *Ty = 0; - if (!(PFTy = dyn_cast(yyvsp[-5].TypeVal->get())) || + if (!(PFTy = dyn_cast((yyvsp[-5].TypeVal)->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; FunctionType::ParamAttrsList ParamAttrs; - ParamAttrs.push_back(yyvsp[0].ParamAttrs); - for (ValueRefList::iterator I = yyvsp[-2].ValueRefList->begin(), E = yyvsp[-2].ValueRefList->end(); I != E; ++I) { + ParamAttrs.push_back((yyvsp[0].ParamAttrs)); + for (ValueRefList::iterator I = (yyvsp[-2].ValueRefList)->begin(), E = (yyvsp[-2].ValueRefList)->end(); I != E; ++I) { const Type *Ty = I->Val->getType(); if (Ty == Type::VoidTy) GEN_ERROR("Short call syntax cannot be used with varargs"); @@ -4560,16 +5441,16 @@ ParamAttrs.push_back(I->Attrs); } - Ty = FunctionType::get(yyvsp[-5].TypeVal->get(), ParamTypes, false, ParamAttrs); + Ty = FunctionType::get((yyvsp[-5].TypeVal)->get(), ParamTypes, false, ParamAttrs); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, yyvsp[-4].ValIDVal); // Get the function we're calling... + Value *V = getVal(PFTy, (yyvsp[-4].ValIDVal)); // Get the function we're calling... CHECK_FOR_ERROR // Check the arguments ValueList Args; - if (yyvsp[-2].ValueRefList->empty()) { // Has no arguments? + if ((yyvsp[-2].ValueRefList)->empty()) { // Has no arguments? // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " @@ -4580,7 +5461,7 @@ // FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - ValueRefList::iterator ArgI = yyvsp[-2].ValueRefList->begin(), ArgE = yyvsp[-2].ValueRefList->end(); + ValueRefList::iterator ArgI = (yyvsp[-2].ValueRefList)->begin(), ArgE = (yyvsp[-2].ValueRefList)->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) { if (ArgI->Val->getType() != *I) @@ -4597,365 +5478,428 @@ } // Create the call node CallInst *CI = new CallInst(V, &Args[0], Args.size()); - CI->setTailCall(yyvsp[-7].BoolVal); - CI->setCallingConv(yyvsp[-6].UIntVal); - yyval.InstVal = CI; - delete yyvsp[-2].ValueRefList; - delete yyvsp[-5].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 273: -#line 2774 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.InstVal = yyvsp[0].InstVal; + CI->setTailCall((yyvsp[-7].BoolVal)); + CI->setCallingConv((yyvsp[-6].UIntVal)); + (yyval.InstVal) = CI; + delete (yyvsp[-2].ValueRefList); + delete (yyvsp[-5].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 274: -#line 2779 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = true; + ;} + break; + + case 276: +#line 2813 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.InstVal) = (yyvsp[0].InstVal); CHECK_FOR_ERROR - ; - break;} -case 275: -#line 2783 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = false; + ;} + break; + + case 277: +#line 2818 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = true; CHECK_FOR_ERROR - ; - break;} -case 276: -#line 2790 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 278: +#line 2822 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = false; + CHECK_FOR_ERROR + ;} + break; + + case 279: +#line 2829 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 277: -#line 2797 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + (yyval.InstVal) = new MallocInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 280: +#line 2836 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription()); - Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription()); + Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); - delete yyvsp[-4].TypeVal; - ; - break;} -case 278: -#line 2805 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (yyval.InstVal) = new MallocInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); + delete (yyvsp[-4].TypeVal); + ;} + break; + + case 281: +#line 2844 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 279: -#line 2812 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + (yyval.InstVal) = new AllocaInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 282: +#line 2851 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-4].TypeVal)->getDescription()); - Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-4].TypeVal))->getDescription()); + Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); - delete yyvsp[-4].TypeVal; - ; - break;} -case 280: -#line 2820 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!isa(yyvsp[0].ValueVal->getType())) + (yyval.InstVal) = new AllocaInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); + delete (yyvsp[-4].TypeVal); + ;} + break; + + case 283: +#line 2859 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { + if (!isa((yyvsp[0].ValueVal)->getType())) GEN_ERROR("Trying to free nonpointer type " + - yyvsp[0].ValueVal->getType()->getDescription() + ""); - yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); + (yyvsp[0].ValueVal)->getType()->getDescription() + ""); + (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 281: -#line 2828 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 284: +#line 2867 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - if (!isa(yyvsp[-1].TypeVal->get())) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + if (!isa((yyvsp[-1].TypeVal)->get())) GEN_ERROR("Can't load from nonpointer type: " + - (*yyvsp[-1].TypeVal)->getDescription()); - if (!cast(yyvsp[-1].TypeVal->get())->getElementType()->isFirstClassType()) + (*(yyvsp[-1].TypeVal))->getDescription()); + if (!cast((yyvsp[-1].TypeVal)->get())->getElementType()->isFirstClassType()) GEN_ERROR("Can't load from pointer of non-first-class type: " + - (*yyvsp[-1].TypeVal)->getDescription()); - Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); + (*(yyvsp[-1].TypeVal))->getDescription()); + Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-3].BoolVal); - delete yyvsp[-1].TypeVal; - ; - break;} -case 282: -#line 2842 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal)); + delete (yyvsp[-1].TypeVal); + ;} + break; + + case 285: +#line 2881 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-1].TypeVal)->getDescription()); - const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-1].TypeVal))->getDescription()); + const PointerType *PT = dyn_cast((yyvsp[-1].TypeVal)->get()); if (!PT) GEN_ERROR("Can't store to a nonpointer type: " + - (*yyvsp[-1].TypeVal)->getDescription()); + (*(yyvsp[-1].TypeVal))->getDescription()); const Type *ElTy = PT->getElementType(); - if (ElTy != yyvsp[-3].ValueVal->getType()) - GEN_ERROR("Can't store '" + yyvsp[-3].ValueVal->getType()->getDescription() + + if (ElTy != (yyvsp[-3].ValueVal)->getType()) + GEN_ERROR("Can't store '" + (yyvsp[-3].ValueVal)->getType()->getDescription() + "' into space of type '" + ElTy->getDescription() + "'"); - Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, tmpVal, yyvsp[-5].BoolVal); - delete yyvsp[-1].TypeVal; - ; - break;} -case 283: -#line 2859 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (yyval.InstVal) = new StoreInst((yyvsp[-3].ValueVal), tmpVal, (yyvsp[-5].BoolVal)); + delete (yyvsp[-1].TypeVal); + ;} + break; + + case 286: +#line 2898 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[-2].TypeVal)->getDescription()); - if (!isa(yyvsp[-2].TypeVal->get())) + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[-2].TypeVal))->getDescription()); + if (!isa((yyvsp[-2].TypeVal)->get())) GEN_ERROR("getelementptr insn requires pointer operand"); - if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size(), true)) + if (!GetElementPtrInst::getIndexedType(*(yyvsp[-2].TypeVal), &(*(yyvsp[0].ValueList))[0], (yyvsp[0].ValueList)->size(), true)) GEN_ERROR("Invalid getelementptr indices for type '" + - (*yyvsp[-2].TypeVal)->getDescription()+ "'"); - Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal); + (*(yyvsp[-2].TypeVal))->getDescription()+ "'"); + Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new GetElementPtrInst(tmpVal, &(*yyvsp[0].ValueList)[0], yyvsp[0].ValueList->size()); - delete yyvsp[-2].TypeVal; - delete yyvsp[0].ValueList; - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + (yyval.InstVal) = new GetElementPtrInst(tmpVal, &(*(yyvsp[0].ValueList))[0], (yyvsp[0].ValueList)->size()); + delete (yyvsp[-2].TypeVal); + delete (yyvsp[0].ValueList); + ;} + break; + + + default: break; + } + +/* Line 1126 of yacc.c. */ +#line 5635 "llvmAsmParser.tab.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif + + YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + char *yymsg = 0; +# define YYERROR_VERBOSE_ARGS_MAXIMUM 5 + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; - if (count < 5) +#if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +#endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + + if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM) + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyf)) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror (YY_("syntax error")); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", yytoken, &yylval); + yychar = YYEMPTY; + } } - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; - goto yyerrhandle; -yyerrdefault: /* current state does not do anything special for the error token. */ +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (0) + goto yyerrorlab; -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif +yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; -yyerrpop: /* pop the current state because it cannot handle the error token */ - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ -#if YYDEBUG != 0 - if (yydebug) + for (;;) { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; + yydestruct ("Error: popping", yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } -#line 2876 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" + + +#line 2915 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" // common code from the two 'RunVMAsmParser' functions @@ -5004,3 +5948,4 @@ GenerateError(errMsg); return 0; } + Index: llvm/lib/AsmParser/llvmAsmParser.h.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.56 llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.57 --- llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.56 Mon Feb 19 01:44:24 2007 +++ llvm/lib/AsmParser/llvmAsmParser.h.cvs Tue Feb 27 20:24:54 2007 @@ -1,4 +1,306 @@ -typedef union { +/* A Bison parser, made by GNU Bison 2.1. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + ESAPINTVAL = 260, + EUAPINTVAL = 261, + LOCALVAL_ID = 262, + GLOBALVAL_ID = 263, + FPVAL = 264, + VOID = 265, + INTTYPE = 266, + FLOAT = 267, + DOUBLE = 268, + LABEL = 269, + TYPE = 270, + LOCALVAR = 271, + GLOBALVAR = 272, + LABELSTR = 273, + STRINGCONSTANT = 274, + ATSTRINGCONSTANT = 275, + IMPLEMENTATION = 276, + ZEROINITIALIZER = 277, + TRUETOK = 278, + FALSETOK = 279, + BEGINTOK = 280, + ENDTOK = 281, + DECLARE = 282, + DEFINE = 283, + GLOBAL = 284, + CONSTANT = 285, + SECTION = 286, + VOLATILE = 287, + TO = 288, + DOTDOTDOT = 289, + NULL_TOK = 290, + UNDEF = 291, + INTERNAL = 292, + LINKONCE = 293, + WEAK = 294, + APPENDING = 295, + DLLIMPORT = 296, + DLLEXPORT = 297, + EXTERN_WEAK = 298, + OPAQUE = 299, + EXTERNAL = 300, + TARGET = 301, + TRIPLE = 302, + ALIGN = 303, + DEPLIBS = 304, + CALL = 305, + TAIL = 306, + ASM_TOK = 307, + MODULE = 308, + SIDEEFFECT = 309, + CC_TOK = 310, + CCC_TOK = 311, + FASTCC_TOK = 312, + COLDCC_TOK = 313, + X86_STDCALLCC_TOK = 314, + X86_FASTCALLCC_TOK = 315, + DATALAYOUT = 316, + RET = 317, + BR = 318, + SWITCH = 319, + INVOKE = 320, + UNWIND = 321, + UNREACHABLE = 322, + ADD = 323, + SUB = 324, + MUL = 325, + UDIV = 326, + SDIV = 327, + FDIV = 328, + UREM = 329, + SREM = 330, + FREM = 331, + AND = 332, + OR = 333, + XOR = 334, + SHL = 335, + LSHR = 336, + ASHR = 337, + ICMP = 338, + FCMP = 339, + EQ = 340, + NE = 341, + SLT = 342, + SGT = 343, + SLE = 344, + SGE = 345, + ULT = 346, + UGT = 347, + ULE = 348, + UGE = 349, + OEQ = 350, + ONE = 351, + OLT = 352, + OGT = 353, + OLE = 354, + OGE = 355, + ORD = 356, + UNO = 357, + UEQ = 358, + UNE = 359, + MALLOC = 360, + ALLOCA = 361, + FREE = 362, + LOAD = 363, + STORE = 364, + GETELEMENTPTR = 365, + TRUNC = 366, + ZEXT = 367, + SEXT = 368, + FPTRUNC = 369, + FPEXT = 370, + BITCAST = 371, + UITOFP = 372, + SITOFP = 373, + FPTOUI = 374, + FPTOSI = 375, + INTTOPTR = 376, + PTRTOINT = 377, + PHI_TOK = 378, + SELECT = 379, + VAARG = 380, + EXTRACTELEMENT = 381, + INSERTELEMENT = 382, + SHUFFLEVECTOR = 383, + NORETURN = 384, + INREG = 385, + SRET = 386, + DEFAULT = 387, + HIDDEN = 388 + }; +#endif +/* Tokens. */ +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define ESAPINTVAL 260 +#define EUAPINTVAL 261 +#define LOCALVAL_ID 262 +#define GLOBALVAL_ID 263 +#define FPVAL 264 +#define VOID 265 +#define INTTYPE 266 +#define FLOAT 267 +#define DOUBLE 268 +#define LABEL 269 +#define TYPE 270 +#define LOCALVAR 271 +#define GLOBALVAR 272 +#define LABELSTR 273 +#define STRINGCONSTANT 274 +#define ATSTRINGCONSTANT 275 +#define IMPLEMENTATION 276 +#define ZEROINITIALIZER 277 +#define TRUETOK 278 +#define FALSETOK 279 +#define BEGINTOK 280 +#define ENDTOK 281 +#define DECLARE 282 +#define DEFINE 283 +#define GLOBAL 284 +#define CONSTANT 285 +#define SECTION 286 +#define VOLATILE 287 +#define TO 288 +#define DOTDOTDOT 289 +#define NULL_TOK 290 +#define UNDEF 291 +#define INTERNAL 292 +#define LINKONCE 293 +#define WEAK 294 +#define APPENDING 295 +#define DLLIMPORT 296 +#define DLLEXPORT 297 +#define EXTERN_WEAK 298 +#define OPAQUE 299 +#define EXTERNAL 300 +#define TARGET 301 +#define TRIPLE 302 +#define ALIGN 303 +#define DEPLIBS 304 +#define CALL 305 +#define TAIL 306 +#define ASM_TOK 307 +#define MODULE 308 +#define SIDEEFFECT 309 +#define CC_TOK 310 +#define CCC_TOK 311 +#define FASTCC_TOK 312 +#define COLDCC_TOK 313 +#define X86_STDCALLCC_TOK 314 +#define X86_FASTCALLCC_TOK 315 +#define DATALAYOUT 316 +#define RET 317 +#define BR 318 +#define SWITCH 319 +#define INVOKE 320 +#define UNWIND 321 +#define UNREACHABLE 322 +#define ADD 323 +#define SUB 324 +#define MUL 325 +#define UDIV 326 +#define SDIV 327 +#define FDIV 328 +#define UREM 329 +#define SREM 330 +#define FREM 331 +#define AND 332 +#define OR 333 +#define XOR 334 +#define SHL 335 +#define LSHR 336 +#define ASHR 337 +#define ICMP 338 +#define FCMP 339 +#define EQ 340 +#define NE 341 +#define SLT 342 +#define SGT 343 +#define SLE 344 +#define SGE 345 +#define ULT 346 +#define UGT 347 +#define ULE 348 +#define UGE 349 +#define OEQ 350 +#define ONE 351 +#define OLT 352 +#define OGT 353 +#define OLE 354 +#define OGE 355 +#define ORD 356 +#define UNO 357 +#define UEQ 358 +#define UNE 359 +#define MALLOC 360 +#define ALLOCA 361 +#define FREE 362 +#define LOAD 363 +#define STORE 364 +#define GETELEMENTPTR 365 +#define TRUNC 366 +#define ZEXT 367 +#define SEXT 368 +#define FPTRUNC 369 +#define FPEXT 370 +#define BITCAST 371 +#define UITOFP 372 +#define SITOFP 373 +#define FPTOUI 374 +#define FPTOSI 375 +#define INTTOPTR 376 +#define PTRTOINT 377 +#define PHI_TOK 378 +#define SELECT 379 +#define VAARG 380 +#define EXTRACTELEMENT 381 +#define INSERTELEMENT 382 +#define SHUFFLEVECTOR 383 +#define NORETURN 384 +#define INREG 385 +#define SRET 386 +#define DEFAULT 387 +#define HIDDEN 388 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 901 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; llvm::BasicBlock *BasicBlockVal; @@ -25,6 +327,7 @@ llvm::GlobalValue::LinkageTypes Linkage; llvm::GlobalValue::VisibilityTypes Visibility; llvm::FunctionType::ParameterAttributes ParamAttrs; + llvm::APInt *APIntVal; int64_t SInt64Val; uint64_t UInt64Val; int SIntVal; @@ -43,135 +346,14 @@ llvm::ICmpInst::Predicate IPredicate; llvm::FCmpInst::Predicate FPredicate; } YYSTYPE; -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define LOCALVAL_ID 259 -#define GLOBALVAL_ID 260 -#define FPVAL 261 -#define VOID 262 -#define INTTYPE 263 -#define FLOAT 264 -#define DOUBLE 265 -#define LABEL 266 -#define TYPE 267 -#define LOCALVAR 268 -#define GLOBALVAR 269 -#define LABELSTR 270 -#define STRINGCONSTANT 271 -#define ATSTRINGCONSTANT 272 -#define IMPLEMENTATION 273 -#define ZEROINITIALIZER 274 -#define TRUETOK 275 -#define FALSETOK 276 -#define BEGINTOK 277 -#define ENDTOK 278 -#define DECLARE 279 -#define DEFINE 280 -#define GLOBAL 281 -#define CONSTANT 282 -#define SECTION 283 -#define VOLATILE 284 -#define TO 285 -#define DOTDOTDOT 286 -#define NULL_TOK 287 -#define UNDEF 288 -#define INTERNAL 289 -#define LINKONCE 290 -#define WEAK 291 -#define APPENDING 292 -#define DLLIMPORT 293 -#define DLLEXPORT 294 -#define EXTERN_WEAK 295 -#define OPAQUE 296 -#define EXTERNAL 297 -#define TARGET 298 -#define TRIPLE 299 -#define ALIGN 300 -#define DEPLIBS 301 -#define CALL 302 -#define TAIL 303 -#define ASM_TOK 304 -#define MODULE 305 -#define SIDEEFFECT 306 -#define CC_TOK 307 -#define CCC_TOK 308 -#define FASTCC_TOK 309 -#define COLDCC_TOK 310 -#define X86_STDCALLCC_TOK 311 -#define X86_FASTCALLCC_TOK 312 -#define DATALAYOUT 313 -#define RET 314 -#define BR 315 -#define SWITCH 316 -#define INVOKE 317 -#define UNWIND 318 -#define UNREACHABLE 319 -#define ADD 320 -#define SUB 321 -#define MUL 322 -#define UDIV 323 -#define SDIV 324 -#define FDIV 325 -#define UREM 326 -#define SREM 327 -#define FREM 328 -#define AND 329 -#define OR 330 -#define XOR 331 -#define SHL 332 -#define LSHR 333 -#define ASHR 334 -#define ICMP 335 -#define FCMP 336 -#define EQ 337 -#define NE 338 -#define SLT 339 -#define SGT 340 -#define SLE 341 -#define SGE 342 -#define ULT 343 -#define UGT 344 -#define ULE 345 -#define UGE 346 -#define OEQ 347 -#define ONE 348 -#define OLT 349 -#define OGT 350 -#define OLE 351 -#define OGE 352 -#define ORD 353 -#define UNO 354 -#define UEQ 355 -#define UNE 356 -#define MALLOC 357 -#define ALLOCA 358 -#define FREE 359 -#define LOAD 360 -#define STORE 361 -#define GETELEMENTPTR 362 -#define TRUNC 363 -#define ZEXT 364 -#define SEXT 365 -#define FPTRUNC 366 -#define FPEXT 367 -#define BITCAST 368 -#define UITOFP 369 -#define SITOFP 370 -#define FPTOUI 371 -#define FPTOSI 372 -#define INTTOPTR 373 -#define PTRTOINT 374 -#define PHI_TOK 375 -#define SELECT 376 -#define VAARG 377 -#define EXTRACTELEMENT 378 -#define INSERTELEMENT 379 -#define SHUFFLEVECTOR 380 -#define NORETURN 381 -#define INREG 382 -#define SRET 383 -#define DEFAULT 384 -#define HIDDEN 385 - +/* Line 1447 of yacc.c. */ +#line 351 "llvmAsmParser.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif extern YYSTYPE llvmAsmlval; + + + Index: llvm/lib/AsmParser/llvmAsmParser.y.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.71 llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.72 --- llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.71 Mon Feb 19 01:44:24 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y.cvs Tue Feb 27 20:24:54 2007 @@ -925,6 +925,7 @@ llvm::GlobalValue::LinkageTypes Linkage; llvm::GlobalValue::VisibilityTypes Visibility; llvm::FunctionType::ParameterAttributes ParamAttrs; + llvm::APInt *APIntVal; int64_t SInt64Val; uint64_t UInt64Val; int SIntVal; @@ -978,6 +979,12 @@ // EUINT64VAL - A positive number within uns. long long range %token EUINT64VAL +// ESAPINTVAL - A negative number with arbitrary precision +%token ESAPINTVAL + +// EUAPINTVAL - A positive number with arbitrary precision +%token EUAPINTVAL + %token LOCALVAL_ID GLOBALVAL_ID // %123 @123 %token FPVAL // Float or Double constant @@ -1704,13 +1711,45 @@ | IntType ESINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) GEN_ERROR("Constant value doesn't fit in type"); - $$ = ConstantInt::get($1, $2); + APInt Val(64, $2); + uint32_t BitWidth = cast($1)->getBitWidth(); + if (BitWidth > 64) + Val.sext(BitWidth); + else if (BitWidth < 64) + Val.trunc(BitWidth); + $$ = ConstantInt::get($1, Val); + CHECK_FOR_ERROR + } + | IntType ESAPINTVAL { // arbitrary precision integer constants + uint32_t BitWidth = cast($1)->getBitWidth(); + if ($2->getBitWidth() > BitWidth) { + GEN_ERROR("Constant value does not fit in type"); + } else if ($2->getBitWidth() < BitWidth) + $2->sext(BitWidth); + else if ($2->getBitWidth() > BitWidth) + $2->trunc(BitWidth); + $$ = ConstantInt::get($1, *$2); + delete $2; CHECK_FOR_ERROR } | IntType EUINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) GEN_ERROR("Constant value doesn't fit in type"); - $$ = ConstantInt::get($1, $2); + uint32_t BitWidth = cast($1)->getBitWidth(); + APInt Val(BitWidth, $2); + $$ = ConstantInt::get($1, Val); + CHECK_FOR_ERROR + } + | IntType EUAPINTVAL { // arbitrary precision integer constants + uint32_t BitWidth = cast($1)->getBitWidth(); + if ($2->getBitWidth() > BitWidth) { + GEN_ERROR("Constant value does not fit in type"); + } else if ($2->getBitWidth() < BitWidth) + $2->zext(BitWidth); + else if ($2->getBitWidth() > BitWidth) + $2->trunc(BitWidth); + $$ = ConstantInt::get($1, *$2); + delete $2; CHECK_FOR_ERROR } | INTTYPE TRUETOK { // Boolean constants From reid at x10sys.com Tue Feb 27 20:25:36 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 20:25:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Writer/Writer.cpp Message-ID: <200702280225.l1S2Pa2P006171@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Writer: Writer.cpp updated: 1.168 -> 1.169 --- Log message: Implement writing of arbitrary precision integers. --- Diffs of the changes: (+14 -4) Writer.cpp | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) Index: llvm/lib/Bytecode/Writer/Writer.cpp diff -u llvm/lib/Bytecode/Writer/Writer.cpp:1.168 llvm/lib/Bytecode/Writer/Writer.cpp:1.169 --- llvm/lib/Bytecode/Writer/Writer.cpp:1.168 Wed Feb 14 20:26:09 2007 +++ llvm/lib/Bytecode/Writer/Writer.cpp Tue Feb 27 20:25:20 2007 @@ -307,13 +307,23 @@ switch (CPV->getType()->getTypeID()) { case Type::IntegerTyID: { // Integer types... + const ConstantInt *CI = cast(CPV); unsigned NumBits = cast(CPV->getType())->getBitWidth(); if (NumBits <= 32) - output_vbr(uint32_t(cast(CPV)->getZExtValue())); + output_vbr(uint32_t(CI->getZExtValue())); else if (NumBits <= 64) - output_vbr(uint64_t(cast(CPV)->getZExtValue())); - else - assert(0 && "Integer types > 64 bits not supported."); + output_vbr(uint64_t(CI->getZExtValue())); + else { + // We have an arbitrary precision integer value to write whose + // bit width is > 64. However, in canonical unsigned integer + // format it is likely that the high bits are going to be zero. + // So, we only write the number of active words. + uint32_t activeWords = CI->getValue().getActiveWords(); + const uint64_t *rawData = CI->getValue().getRawData(); + output_vbr(activeWords); + for (uint32_t i = 0; i < activeWords; ++i) + output_vbr(rawData[i]); + } break; } From reid at x10sys.com Tue Feb 27 20:26:05 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 20:26:05 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp Message-ID: <200702280226.l1S2Q5p4006190@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.cpp updated: 1.241 -> 1.242 --- Log message: Implement reading of arbitrary precision integers. --- Diffs of the changes: (+9 -4) Reader.cpp | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.241 llvm/lib/Bytecode/Reader/Reader.cpp:1.242 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.241 Wed Feb 14 21:39:18 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Tue Feb 27 20:25:48 2007 @@ -1264,8 +1264,14 @@ error("Invalid constant integer read."); Result = ConstantInt::get(IT, Val); if (Handler) Handler->handleConstantValue(Result); - } else - assert(0 && "Integer types > 64 bits not supported"); + } else { + uint32_t numWords = read_vbr_uint(); + uint64_t *data = new uint64_t[numWords]; + for (uint32_t i = 0; i < numWords; ++i) + data[i] = read_vbr_uint64(); + Result = ConstantInt::get(IT, APInt(IT->getBitWidth(), numWords, data)); + if (Handler) Handler->handleConstantValue(Result); + } break; } case Type::FloatTyID: { @@ -1356,8 +1362,7 @@ // to a null value in a way that isn't predicted when a .bc file is initially // produced. assert((!isa(Result) || !cast(Result)->isNullValue()) || - !hasImplicitNull(TypeID) && - "Cannot read null values from bytecode!"); + !hasImplicitNull(TypeID) && "Cannot read null values from bytecode!"); return Result; } From reid at x10sys.com Tue Feb 27 20:33:23 2007 From: reid at x10sys.com (Reid Spencer) Date: Tue, 27 Feb 2007 20:33:23 -0600 Subject: [llvm-commits] CVS: llvm/docs/BytecodeFormat.html Message-ID: <200702280233.l1S2XNhE006366@zion.cs.uiuc.edu> Changes in directory llvm/docs: BytecodeFormat.html updated: 1.66 -> 1.67 --- Log message: Describe how arbitrary precision integers are written to the bytecode. --- Diffs of the changes: (+13 -5) BytecodeFormat.html | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-) Index: llvm/docs/BytecodeFormat.html diff -u llvm/docs/BytecodeFormat.html:1.66 llvm/docs/BytecodeFormat.html:1.67 --- llvm/docs/BytecodeFormat.html:1.66 Wed Feb 14 21:08:48 2007 +++ llvm/docs/BytecodeFormat.html Tue Feb 27 20:33:06 2007 @@ -1275,10 +1275,18 @@