From lattner at cs.uiuc.edu Mon Dec 12 01:19:11 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 01:19:11 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/ScalarRepl/AggregatePromote.ll Message-ID: <200512120719.BAA19691@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/ScalarRepl: AggregatePromote.ll added (r1.1) --- Log message: new testcase: sra should be able to eliminate all of these alloca's, despite the presense of pointer casts --- Diffs of the changes: (+54 -0) AggregatePromote.ll | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 54 insertions(+) Index: llvm/test/Regression/Transforms/ScalarRepl/AggregatePromote.ll diff -c /dev/null llvm/test/Regression/Transforms/ScalarRepl/AggregatePromote.ll:1.1 *** /dev/null Mon Dec 12 01:19:09 2005 --- llvm/test/Regression/Transforms/ScalarRepl/AggregatePromote.ll Mon Dec 12 01:18:59 2005 *************** *** 0 **** --- 1,54 ---- + ; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | not grep alloca && + ; RUN: llvm-as < %s | opt -scalarrepl -disable-output + + target endian = big + target pointersize = 32 + target triple = "powerpc-apple-darwin8.0.0" + + long %test1(long %X) { + %A = alloca long + store long %X, long* %A + %B = cast long* %A to int* + %C = cast int* %B to sbyte* + store sbyte 0, sbyte* %C + %Y = load long *%A + ret long %Y + } + + + sbyte %test2(long %X) { + %X_addr = alloca long ; [#uses=2] + store long %X, long* %X_addr + %tmp.0 = cast long* %X_addr to int* ; [#uses=1] + %tmp.1 = getelementptr int* %tmp.0, int 1 ; [#uses=1] + %tmp.2 = cast int* %tmp.1 to sbyte* + %tmp.3 = getelementptr sbyte* %tmp.2, int 3 + %tmp.2 = load sbyte* %tmp.3 ; [#uses=1] + ret sbyte %tmp.2 + } + + short %crafty(long %X) { + %a = alloca { long } + %tmp.0 = getelementptr { long }* %a, int 0, uint 0 ; [#uses=1] + store long %X, long* %tmp.0 + %tmp.3 = cast { long }* %a to [4 x short]* ; <[4 x short]*> [#uses=2] + %tmp.4 = getelementptr [4 x short]* %tmp.3, int 0, int 3 ; [#uses=1] + %tmp.5 = load short* %tmp.4 ; [#uses=1] + %tmp.8 = getelementptr [4 x short]* %tmp.3, int 0, int 2 ; [#uses=1] + %tmp.9 = load short* %tmp.8 ; [#uses=1] + %tmp.10 = or short %tmp.9, %tmp.5 ; [#uses=1] + ret short %tmp.10 + } + + short %crafty2(long %X) { + %a = alloca long + store long %X, long* %a + %tmp.3 = cast long* %a to [4 x short]* ; <[4 x short]*> [#uses=2] + %tmp.4 = getelementptr [4 x short]* %tmp.3, int 0, int 3 ; [#uses=1] + %tmp.5 = load short* %tmp.4 ; [#uses=1] + %tmp.8 = getelementptr [4 x short]* %tmp.3, int 0, int 2 ; [#uses=1] + %tmp.9 = load short* %tmp.8 ; [#uses=1] + %tmp.10 = or short %tmp.9, %tmp.5 ; [#uses=1] + ret short %tmp.10 + } + From lattner at cs.uiuc.edu Mon Dec 12 01:19:25 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 01:19:25 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp Message-ID: <200512120719.BAA19704@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: ScalarReplAggregates.cpp updated: 1.32 -> 1.33 --- Log message: Implement a little hack for parity with GCC on crafty. This speeds up 186.crafty by about 16% (from 15.109s to 13.045s) on my system. This turns allocas with unions/casts into scalars. For example crafty has something like this: union doub { unsigned short i[4]; long long d; }; int f(long long a) { return ((union doub){.d=a}).i[1]; } Instead of generating loads and stores to an alloca, we now promote the whole thing to a scalar long value. This implements: Transforms/ScalarRepl/AggregatePromote.ll --- Diffs of the changes: (+277 -2) ScalarReplAggregates.cpp | 279 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 277 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp diff -u llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.32 llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.33 --- llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.32 Sat Nov 5 03:21:28 2005 +++ llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp Mon Dec 12 01:19:13 2005 @@ -26,9 +26,10 @@ #include "llvm/Pass.h" #include "llvm/Instructions.h" #include "llvm/Analysis/Dominators.h" -#include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Target/TargetData.h" #include "llvm/Transforms/Utils/PromoteMemToReg.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" +#include "llvm/Support/MathExtras.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" @@ -37,6 +38,8 @@ namespace { Statistic<> NumReplaced("scalarrepl", "Number of allocas broken up"); Statistic<> NumPromoted("scalarrepl", "Number of allocas promoted"); + Statistic<> NumConverted("scalarrepl", + "Number of aggregates converted to scalar"); struct SROA : public FunctionPass { bool runOnFunction(Function &F); @@ -59,6 +62,10 @@ int isSafeAllocaToScalarRepl(AllocationInst *AI); void CanonicalizeAllocaUsers(AllocationInst *AI); AllocaInst *AddNewAlloca(Function &F, const Type *Ty, AllocationInst *Base); + + const Type *CanConvertToScalar(Value *V, bool &IsNotTrivial); + void ConvertToScalar(AllocationInst *AI, const Type *Ty); + void ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset); }; RegisterOpt X("scalarrepl", "Scalar Replacement of Aggregates"); @@ -112,7 +119,6 @@ return Changed; } - // performScalarRepl - This algorithm is a simple worklist driven algorithm, // which runs on all of the malloc/alloca instructions in the function, removing // them if they are only used by getelementptr instructions. @@ -131,6 +137,16 @@ while (!WorkList.empty()) { AllocationInst *AI = WorkList.back(); WorkList.pop_back(); + + // If we can turn this aggregate value (potentially with casts) into a + // simple scalar value that can be mem2reg'd into a register value. + bool IsNotTrivial = false; + if (const Type *ActualType = CanConvertToScalar(AI, IsNotTrivial)) + if (IsNotTrivial) { + ConvertToScalar(AI, ActualType); + Changed = true; + continue; + } // We cannot transform the allocation instruction if it is an array // allocation (allocations OF arrays are ok though), and an allocation of a @@ -378,3 +394,262 @@ } } } + +/// MergeInType - Add the 'In' type to the accumulated type so far. If the +/// types are incompatible, return true, otherwise update Accum and return +/// false. +static bool MergeInType(const Type *In, const Type *&Accum) { + if (!In->isIntegral()) return true; + + // If this is our first type, just use it. + if (Accum == Type::VoidTy) { + Accum = In; + } else { + // Otherwise pick whichever type is larger. + if (In->getTypeID() > Accum->getTypeID()) + Accum = In; + } + return false; +} + +/// getUIntAtLeastAsBitAs - Return an unsigned integer type that is at least +/// as big as the specified type. If there is no suitable type, this returns +/// null. +const Type *getUIntAtLeastAsBitAs(unsigned NumBits) { + if (NumBits > 64) return 0; + if (NumBits > 32) return Type::ULongTy; + if (NumBits > 16) return Type::UIntTy; + if (NumBits > 8) return Type::UShortTy; + return Type::UByteTy; +} + +/// CanConvertToScalar - V is a pointer. If we can convert the pointee to a +/// single scalar integer type, return that type. Further, if the use is not +/// a completely trivial use that mem2reg could promote, set IsNotTrivial. If +/// there are no uses of this pointer, return Type::VoidTy to differentiate from +/// failure. +/// +const Type *SROA::CanConvertToScalar(Value *V, bool &IsNotTrivial) { + const Type *UsedType = Type::VoidTy; // No uses, no forced type. + const TargetData &TD = getAnalysis(); + const PointerType *PTy = cast(V->getType()); + + for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) { + Instruction *User = cast(*UI); + + if (LoadInst *LI = dyn_cast(User)) { + if (MergeInType(LI->getType(), UsedType)) + return 0; + + } else if (StoreInst *SI = dyn_cast(User)) { + // Storing the pointer, not the into the value? + if (SI->getOperand(0) == V) return 0; + + // NOTE: We could handle storing of FP imms here! + + if (MergeInType(SI->getOperand(0)->getType(), UsedType)) + return 0; + } else if (CastInst *CI = dyn_cast(User)) { + if (!isa(CI->getType())) return 0; + IsNotTrivial = true; + const Type *SubTy = CanConvertToScalar(CI, IsNotTrivial); + if (!SubTy || MergeInType(SubTy, UsedType)) return 0; + } else if (GetElementPtrInst *GEP = dyn_cast(User)) { + // Check to see if this is stepping over an element: GEP Ptr, int C + if (GEP->getNumOperands() == 2 && isa(GEP->getOperand(1))) { + unsigned Idx = cast(GEP->getOperand(1))->getRawValue(); + unsigned ElSize = TD.getTypeSize(PTy->getElementType()); + unsigned BitOffset = Idx*ElSize*8; + if (BitOffset > 64 || !isPowerOf2_32(ElSize)) return 0; + + IsNotTrivial = true; + const Type *SubElt = CanConvertToScalar(GEP, IsNotTrivial); + if (SubElt == 0) return 0; + if (SubElt != Type::VoidTy) { + const Type *NewTy = + getUIntAtLeastAsBitAs(SubElt->getPrimitiveSizeInBits()+BitOffset); + if (NewTy == 0 || MergeInType(NewTy, UsedType)) return 0; + continue; + } + } else if (GEP->getNumOperands() == 3 && + isa(GEP->getOperand(1)) && + isa(GEP->getOperand(2)) && + cast(GEP->getOperand(1))->isNullValue()) { + // We are stepping into an element, e.g. a structure or an array: + // GEP Ptr, int 0, uint C + const Type *AggTy = PTy->getElementType(); + unsigned Idx = cast(GEP->getOperand(2))->getRawValue(); + + if (const ArrayType *ATy = dyn_cast(AggTy)) { + if (Idx >= ATy->getNumElements()) return 0; // Out of range. + } else if (const PackedType *PTy = dyn_cast(AggTy)) { + if (Idx >= PTy->getNumElements()) return 0; // Out of range. + } else if (isa(AggTy)) { + // Structs are always ok. + } else { + return 0; + } + const Type *NTy = getUIntAtLeastAsBitAs(TD.getTypeSize(AggTy)*8); + if (NTy == 0 || MergeInType(NTy, UsedType)) return 0; + const Type *SubTy = CanConvertToScalar(GEP, IsNotTrivial); + if (SubTy == 0) return 0; + if (SubTy != Type::VoidTy && MergeInType(SubTy, UsedType)) + return 0; + continue; // Everything looks ok + } + return 0; + } else { + // Cannot handle this! + return 0; + } + } + + return UsedType; +} + +/// ConvertToScalar - The specified alloca passes the CanConvertToScalar +/// predicate and is non-trivial. Convert it to something that can be trivially +/// promoted into a register by mem2reg. +void SROA::ConvertToScalar(AllocationInst *AI, const Type *ActualTy) { + DEBUG(std::cerr << "CONVERT TO SCALAR: " << *AI << " TYPE = " + << *ActualTy << "\n"); + ++NumConverted; + + BasicBlock *EntryBlock = AI->getParent(); + assert(EntryBlock == &EntryBlock->getParent()->front() && + "Not in the entry block!"); + EntryBlock->getInstList().remove(AI); // Take the alloca out of the program. + + // Create and insert the alloca. + AllocaInst *NewAI = new AllocaInst(ActualTy->getUnsignedVersion(), 0, + AI->getName(), EntryBlock->begin()); + ConvertUsesToScalar(AI, NewAI, 0); + delete AI; +} + + +/// ConvertUsesToScalar - Convert all of the users of Ptr to use the new alloca +/// directly. Offset is an offset from the original alloca, in bits that need +/// to be shifted to the right. By the end of this, there should be no uses of +/// Ptr. +void SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset) { + while (!Ptr->use_empty()) { + Instruction *User = cast(Ptr->use_back()); + + if (LoadInst *LI = dyn_cast(User)) { + // The load is a bit extract from NewAI shifted right by Offset bits. + Value *NV = new LoadInst(NewAI, LI->getName(), LI); + if (Offset) + NV = new ShiftInst(Instruction::Shr, NV, + ConstantUInt::get(Type::UByteTy, Offset), + LI->getName(), LI); + if (NV->getType() != LI->getType()) + NV = new CastInst(NV, LI->getType(), LI->getName(), LI); + LI->replaceAllUsesWith(NV); + LI->eraseFromParent(); + } else if (StoreInst *SI = dyn_cast(User)) { + assert(SI->getOperand(0) != Ptr && "Consistency error!"); + + // Convert the stored type to the actual type, shift it left to insert + // then 'or' into place. + Value *SV = SI->getOperand(0); + if (SV->getType() == NewAI->getType()->getElementType()) { + assert(Offset == 0 && "Store out of bounds!"); + } else { + Value *Old = new LoadInst(NewAI, NewAI->getName()+".in", SI); + // If SV is signed, convert it to unsigned, so that the next cast zero + // extends the value. + if (SV->getType()->isSigned()) + SV = new CastInst(SV, SV->getType()->getUnsignedVersion(), + SV->getName(), SI); + SV = new CastInst(SV, Old->getType(), SV->getName(), SI); + if (Offset) + SV = new ShiftInst(Instruction::Shl, SV, + ConstantUInt::get(Type::UByteTy, Offset), + SV->getName()+".adj", SI); + // Mask out the bits we are about to insert from the old value. + unsigned TotalBits = SV->getType()->getPrimitiveSizeInBits(); + unsigned InsertBits = + SI->getOperand(0)->getType()->getPrimitiveSizeInBits(); + if (TotalBits != InsertBits) { + assert(TotalBits > InsertBits); + uint64_t Mask = ~(((1ULL << InsertBits)-1) << Offset); + if (TotalBits != 64) + Mask = Mask & ((1ULL << TotalBits)-1); + Old = BinaryOperator::createAnd(Old, + ConstantUInt::get(Old->getType(), Mask), + Old->getName()+".mask", SI); + SV = BinaryOperator::createOr(Old, SV, SV->getName()+".ins", SI); + } + } + new StoreInst(SV, NewAI, SI); + SI->eraseFromParent(); + + } else if (CastInst *CI = dyn_cast(User)) { + unsigned NewOff = Offset; + const TargetData &TD = getAnalysis(); + if (TD.isBigEndian()) { + // Adjust the pointer. For example, storing 16-bits into a 32-bit + // alloca with just a cast makes it modify the top 16-bits. + const Type *SrcTy = cast(Ptr->getType())->getElementType(); + const Type *DstTy = cast(CI->getType())->getElementType(); + int PtrDiffBits = TD.getTypeSize(SrcTy)*8-TD.getTypeSize(DstTy)*8; + NewOff += PtrDiffBits; + } + ConvertUsesToScalar(CI, NewAI, NewOff); + CI->eraseFromParent(); + } else if (GetElementPtrInst *GEP = dyn_cast(User)) { + const PointerType *AggPtrTy = + cast(GEP->getOperand(0)->getType()); + const TargetData &TD = getAnalysis(); + unsigned AggSizeInBits = TD.getTypeSize(AggPtrTy->getElementType())*8; + + // Check to see if this is stepping over an element: GEP Ptr, int C + unsigned NewOffset = Offset; + if (GEP->getNumOperands() == 2) { + unsigned Idx = cast(GEP->getOperand(1))->getRawValue(); + unsigned BitOffset = Idx*AggSizeInBits; + + if (TD.isLittleEndian()) + NewOffset += BitOffset; + else + NewOffset -= BitOffset; + + } else if (GEP->getNumOperands() == 3) { + // We know that operand #2 is zero. + unsigned Idx = cast(GEP->getOperand(2))->getRawValue(); + const Type *AggTy = AggPtrTy->getElementType(); + if (const SequentialType *SeqTy = dyn_cast(AggTy)) { + unsigned ElSizeBits = TD.getTypeSize(SeqTy->getElementType())*8; + + if (TD.isLittleEndian()) + NewOffset += ElSizeBits*Idx; + else + NewOffset += AggSizeInBits-ElSizeBits*(Idx+1); + } else if (const StructType *STy = dyn_cast(AggTy)) { + unsigned EltBitOffset = TD.getStructLayout(STy)->MemberOffsets[Idx]*8; + + if (TD.isLittleEndian()) + NewOffset += EltBitOffset; + else { + const PointerType *ElPtrTy = cast(GEP->getType()); + unsigned ElSizeBits = TD.getTypeSize(ElPtrTy->getElementType())*8; + NewOffset += AggSizeInBits-(EltBitOffset+ElSizeBits); + } + + } else { + assert(0 && "Unsupported operation!"); + abort(); + } + } else { + assert(0 && "Unsupported operation!"); + abort(); + } + ConvertUsesToScalar(GEP, NewAI, NewOffset); + GEP->eraseFromParent(); + } else { + assert(0 && "Unsupported operation!"); + abort(); + } + } +} From alenhar2 at cs.uiuc.edu Mon Dec 12 11:44:12 2005 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 12 Dec 2005 11:44:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Message-ID: <200512121744.LAA20052@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelDAGToDAG.cpp updated: 1.16 -> 1.17 --- Log message: restore a more restricted select --- Diffs of the changes: (+32 -0) AlphaISelDAGToDAG.cpp | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+) Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.16 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.17 --- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.16 Sat Dec 10 21:54:31 2005 +++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Mon Dec 12 11:43:52 2005 @@ -401,6 +401,38 @@ } break; + case ISD::SELECT: + if (MVT::isFloatingPoint(N->getValueType(0)) && + (N->getOperand(0).getOpcode() != ISD::SETCC || + !MVT::isFloatingPoint(N->getOperand(0).getOperand(1).getValueType()))) { + //This should be the condition not covered by the Patterns + //FIXME: Don't have SelectCode die, but rather return something testable + // so that things like this can be caught in fall though code + //move int to fp + bool isDouble = N->getValueType(0) == MVT::f64; + SDOperand LD, + cond = Select(N->getOperand(0)), + TV = Select(N->getOperand(1)), + FV = Select(N->getOperand(2)); + + if (AlphaLowering.hasITOF()) { + LD = CurDAG->getNode(AlphaISD::ITOFT_, MVT::f64, cond); + } else { + int FrameIdx = + CurDAG->getMachineFunction().getFrameInfo()->CreateStackObject(8, 8); + SDOperand FI = CurDAG->getFrameIndex(FrameIdx, MVT::i64); + SDOperand ST = CurDAG->getTargetNode(Alpha::STQ, MVT::Other, + cond, FI, CurDAG->getRegister(Alpha::R31, MVT::i64)); + LD = CurDAG->getTargetNode(Alpha::LDT, MVT::f64, FI, + CurDAG->getRegister(Alpha::R31, MVT::i64), + ST); + } + SDOperand FP = CurDAG->getTargetNode(isDouble?Alpha::FCMOVEQT:Alpha::FCMOVEQS, + MVT::f64, FV, TV, LD); + return FP; + } + break; + } return SelectCode(Op); From evan.cheng at apple.com Mon Dec 12 13:37:55 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 13:37:55 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512121937.NAA30898@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.94 -> 1.95 --- Log message: Bug fix: finding the correct incoming chain for pattern with nested src operand. And a minor change to make output code slightly more readible. --- Diffs of the changes: (+17 -14) DAGISelEmitter.cpp | 31 +++++++++++++++++-------------- 1 files changed, 17 insertions(+), 14 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.94 llvm/utils/TableGen/DAGISelEmitter.cpp:1.95 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.94 Fri Dec 9 20:36:00 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Dec 12 13:37:43 2005 @@ -1040,14 +1040,15 @@ for (unsigned i = 0; i != NumValues; ++i) { TreePatternNode *Dest = Pat->getChild(i); if (!Dest->isLeaf()) - I->error("set destination should be a virtual register!"); + I->error("set destination should be a register!"); DefInit *Val = dynamic_cast(Dest->getLeafValue()); if (!Val) - I->error("set destination should be a virtual register!"); + I->error("set destination should be a register!"); - if (!Val->getDef()->isSubClassOf("RegisterClass")) - I->error("set destination should be a virtual register!"); + if (!Val->getDef()->isSubClassOf("RegisterClass") && + !Val->getDef()->isSubClassOf("Register")) + I->error("set destination should be a register!"); if (Dest->getName().empty()) I->error("set destination must have a name!"); if (InstResults.count(Dest->getName())) @@ -1726,10 +1727,9 @@ std::ostream &OS; // Node to name mapping std::map VariableMap; - // Name of the inner most node which produces a chain. - std::string InnerChain; // Names of all the folded nodes which produce chains. std::vector FoldedChains; + bool FoundChain; bool InFlag; unsigned TmpNo; @@ -1737,7 +1737,7 @@ PatternCodeEmitter(DAGISelEmitter &ise, TreePatternNode *lhs, unsigned PatNum, std::ostream &os) : ISE(ise), LHS(lhs), PatternNo(PatNum), OS(os), - InFlag(false), TmpNo(0) {}; + FoundChain(false), InFlag(false), TmpNo(0) {}; /// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo /// if the match fails. At this point, we already know that the opcode for N @@ -1776,7 +1776,8 @@ // Emit code to load the child nodes and match their contents recursively. unsigned OpNo = 0; - if (NodeHasChain(N, ISE)) { + bool HasChain = NodeHasChain(N, ISE); + if (HasChain) { OpNo = 1; if (!isRoot) { const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator()); @@ -1786,11 +1787,6 @@ << ".getValue(" << CInfo.getNumResults() << "))) goto P" << PatternNo << "Fail; // Already selected for a chain use?\n"; } - if (InnerChain.empty()) { - OS << " SDOperand " << RootName << "0 = " << RootName - << ".getOperand(0);\n"; - InnerChain = RootName + "0"; - } } for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { @@ -1862,6 +1858,13 @@ } } + if (HasChain) { + if (!FoundChain) { + OS << " SDOperand Chain = " << RootName << ".getOperand(0);\n"; + FoundChain = true; + } + } + // If there is a node predicate for this, emit the call. if (!N->getPredicateFn().empty()) OS << " if (!" << N->getPredicateFn() << "(" << RootName @@ -1988,7 +1991,7 @@ // Emit all the chain and CopyToReg stuff. if (II.hasCtrlDep) - OS << " SDOperand Chain = Select(" << InnerChain << ");\n"; + OS << " Chain = Select(Chain);\n"; EmitCopyToRegs(LHS, "N", II.hasCtrlDep); const DAGInstruction &Inst = ISE.getInstruction(Op); From evan.cheng at apple.com Mon Dec 12 13:45:35 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 13:45:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512121945.NAA30937@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.152 -> 1.153 --- Log message: Add a few more add / store patterns. e.g. ADD32mi8. --- Diffs of the changes: (+18 -10) X86InstrInfo.td | 28 ++++++++++++++++++---------- 1 files changed, 18 insertions(+), 10 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.152 llvm/lib/Target/X86/X86InstrInfo.td:1.153 --- llvm/lib/Target/X86/X86InstrInfo.td:1.152 Fri Dec 9 18:48:20 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 13:45:23 2005 @@ -1206,21 +1206,29 @@ let isTwoAddress = 0 in { def ADD8mr : I<0x00, MRMDestMem, (ops i8mem :$dst, R8 :$src2), - "add{b} {$src2, $dst|$dst, $src2}", []>; + "add{b} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), R8:$src2), addr:$dst)]>; def ADD16mr : I<0x01, MRMDestMem, (ops i16mem:$dst, R16:$src2), - "add{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + "add{w} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), R16:$src2), addr:$dst)]>, OpSize; def ADD32mr : I<0x01, MRMDestMem, (ops i32mem:$dst, R32:$src2), - "add{l} {$src2, $dst|$dst, $src2}", []>; + "add{l} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), R32:$src2), addr:$dst)]>; def ADD8mi : Ii8<0x80, MRM0m, (ops i8mem :$dst, i8imm :$src2), - "add{b} {$src2, $dst|$dst, $src2}", []>; + "add{b} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), (i8 imm:$src2)), addr:$dst)]>; def ADD16mi : Ii16<0x81, MRM0m, (ops i16mem:$dst, i16imm:$src2), - "add{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + "add{w} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, OpSize; def ADD32mi : Ii32<0x81, MRM0m, (ops i32mem:$dst, i32imm:$src2), - "add{l} {$src2, $dst|$dst, $src2}", []>; - def ADD16mi8 : Ii8<0x83, MRM0m, (ops i16mem:$dst, i8imm :$src2), - "add{w} {$src2, $dst|$dst, $src2}", []>, OpSize; - def ADD32mi8 : Ii8<0x83, MRM0m, (ops i32mem:$dst, i8imm :$src2), - "add{l} {$src2, $dst|$dst, $src2}", []>; + "add{l} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; + def ADD16mi8 : Ii8<0x83, MRM0m, (ops i16mem:$dst, i16i8imm :$src2), + "add{w} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), (i16 immSExt8:$src2)), addr:$dst)]>, OpSize; + def ADD32mi8 : Ii8<0x83, MRM0m, (ops i32mem:$dst, i32i8imm :$src2), + "add{l} {$src2, $dst|$dst, $src2}", + [(store (add (load addr:$dst), (i32 immSExt8:$src2)), addr:$dst)]>; } let isCommutable = 1 in { // X = ADC Y, Z --> X = ADC Z, Y From lattner at cs.uiuc.edu Mon Dec 12 14:12:32 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 14:12:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86.h X86PeepholeOpt.cpp X86TargetMachine.cpp Message-ID: <200512122012.OAA31096@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86.h updated: 1.37 -> 1.38 X86PeepholeOpt.cpp updated: 1.40 -> 1.41 X86TargetMachine.cpp updated: 1.89 -> 1.90 --- Log message: remove some never-completed and now-obsolete code. --- Diffs of the changes: (+0 -358) X86.h | 5 X86PeepholeOpt.cpp | 342 --------------------------------------------------- X86TargetMachine.cpp | 11 - 3 files changed, 358 deletions(-) Index: llvm/lib/Target/X86/X86.h diff -u llvm/lib/Target/X86/X86.h:1.37 llvm/lib/Target/X86/X86.h:1.38 --- llvm/lib/Target/X86/X86.h:1.37 Mon Nov 14 18:40:24 2005 +++ llvm/lib/Target/X86/X86.h Mon Dec 12 14:12:20 2005 @@ -43,11 +43,6 @@ /// FunctionPass *createX86ISelDag(TargetMachine &TM); -/// createX86SSAPeepholeOptimizerPass - Create a pass to perform SSA-based X86 -/// specific peephole optimizations. -/// -FunctionPass *createX86SSAPeepholeOptimizerPass(); - /// createX86PeepholeOptimizer - Create a pass to perform X86 specific peephole /// optimizations. /// Index: llvm/lib/Target/X86/X86PeepholeOpt.cpp diff -u llvm/lib/Target/X86/X86PeepholeOpt.cpp:1.40 llvm/lib/Target/X86/X86PeepholeOpt.cpp:1.41 --- llvm/lib/Target/X86/X86PeepholeOpt.cpp:1.40 Wed Jul 27 01:12:34 2005 +++ llvm/lib/Target/X86/X86PeepholeOpt.cpp Mon Dec 12 14:12:20 2005 @@ -19,7 +19,6 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/STLExtras.h" - using namespace llvm; namespace { @@ -96,33 +95,6 @@ } return false; -#if 0 - case X86::IMUL16rmi: case X86::IMUL32rmi: - assert(MI->getNumOperands() == 6 && "These should all have 6 operands!"); - if (MI->getOperand(5).isImmediate()) { - int Val = MI->getOperand(5).getImmedValue(); - // If the value is the same when signed extended from 8 bits... - if (Val == (signed int)(signed char)Val) { - unsigned Opcode; - switch (MI->getOpcode()) { - default: assert(0 && "Unknown opcode value!"); - case X86::IMUL16rmi: Opcode = X86::IMUL16rmi8; break; - case X86::IMUL32rmi: Opcode = X86::IMUL32rmi8; break; - } - unsigned R0 = MI->getOperand(0).getReg(); - unsigned R1 = MI->getOperand(1).getReg(); - unsigned Scale = MI->getOperand(2).getImmedValue(); - unsigned R2 = MI->getOperand(3).getReg(); - unsigned Offset = MI->getOperand(4).getImmedValue(); - I = MBB.insert(MBB.erase(I), - BuildMI(Opcode, 5, R0).addReg(R1).addZImm(Scale). - addReg(R2).addSImm(Offset).addZImm((char)Val)); - return true; - } - } - return false; -#endif - case X86::ADD16ri: case X86::ADD32ri: case X86::ADC32ri: case X86::SUB16ri: case X86::SUB32ri: case X86::SBB16ri: case X86::SBB32ri: @@ -208,321 +180,7 @@ } } return false; - -#if 0 - case X86::MOV32ri: Size++; - case X86::MOV16ri: Size++; - case X86::MOV8ri: - // FIXME: We can only do this transformation if we know that flags are not - // used here, because XOR clobbers the flags! - if (MI->getOperand(1).isImmediate()) { // avoid mov EAX, - int Val = MI->getOperand(1).getImmedValue(); - if (Val == 0) { // mov EAX, 0 -> xor EAX, EAX - static const unsigned Opcode[] ={X86::XOR8rr,X86::XOR16rr,X86::XOR32rr}; - unsigned Reg = MI->getOperand(0).getReg(); - I = MBB.insert(MBB.erase(I), - BuildMI(Opcode[Size], 2, Reg).addReg(Reg).addReg(Reg)); - return true; - } else if (Val == -1) { // mov EAX, -1 -> or EAX, -1 - // TODO: 'or Reg, -1' has a smaller encoding than 'mov Reg, -1' - } - } - return false; -#endif - case X86::BSWAP32r: // Change bswap EAX, bswap EAX into nothing - if (Next->getOpcode() == X86::BSWAP32r && - MI->getOperand(0).getReg() == Next->getOperand(0).getReg()) { - I = MBB.erase(MBB.erase(I)); - return true; - } - return false; default: return false; } } - -namespace { - class UseDefChains : public MachineFunctionPass { - std::vector DefiningInst; - public: - // getDefinition - Return the machine instruction that defines the specified - // SSA virtual register. - MachineInstr *getDefinition(unsigned Reg) { - assert(MRegisterInfo::isVirtualRegister(Reg) && - "use-def chains only exist for SSA registers!"); - assert(Reg - MRegisterInfo::FirstVirtualRegister < DefiningInst.size() && - "Unknown register number!"); - assert(DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister] && - "Unknown register number!"); - return DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister]; - } - - // setDefinition - Update the use-def chains to indicate that MI defines - // register Reg. - void setDefinition(unsigned Reg, MachineInstr *MI) { - if (Reg-MRegisterInfo::FirstVirtualRegister >= DefiningInst.size()) - DefiningInst.resize(Reg-MRegisterInfo::FirstVirtualRegister+1); - DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister] = MI; - } - - // removeDefinition - Update the use-def chains to forget about Reg - // entirely. - void removeDefinition(unsigned Reg) { - assert(getDefinition(Reg)); // Check validity - DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister] = 0; - } - - virtual bool runOnMachineFunction(MachineFunction &MF) { - for (MachineFunction::iterator BI = MF.begin(), E = MF.end(); BI!=E; ++BI) - for (MachineBasicBlock::iterator I = BI->begin(); I != BI->end(); ++I) { - for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) { - MachineOperand &MO = I->getOperand(i); - if (MO.isRegister() && MO.isDef() && !MO.isUse() && - MRegisterInfo::isVirtualRegister(MO.getReg())) - setDefinition(MO.getReg(), I); - } - } - return false; - } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - MachineFunctionPass::getAnalysisUsage(AU); - } - - virtual void releaseMemory() { - std::vector().swap(DefiningInst); - } - }; - - RegisterAnalysis X("use-def-chains", - "use-def chain construction for machine code"); -} - - -namespace { - Statistic<> NumSSAPHOpts("x86-ssa-peephole", - "Number of SSA peephole optimization performed"); - - /// SSAPH - This pass is an X86-specific, SSA-based, peephole optimizer. This - /// pass is really a bad idea: a better instruction selector should completely - /// supersume it. However, that will take some time to develop, and the - /// simple things this can do are important now. - class SSAPH : public MachineFunctionPass { - UseDefChains *UDC; - public: - virtual bool runOnMachineFunction(MachineFunction &MF); - - bool PeepholeOptimize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator &I); - - virtual const char *getPassName() const { - return "X86 SSA-based Peephole Optimizer"; - } - - /// Propagate - Set MI[DestOpNo] = Src[SrcOpNo], optionally change the - /// opcode of the instruction, then return true. - bool Propagate(MachineInstr *MI, unsigned DestOpNo, - MachineInstr *Src, unsigned SrcOpNo, unsigned NewOpcode = 0){ - MI->getOperand(DestOpNo) = Src->getOperand(SrcOpNo); - if (NewOpcode) MI->setOpcode(NewOpcode); - return true; - } - - /// OptimizeAddress - If we can fold the addressing arithmetic for this - /// memory instruction into the instruction itself, do so and return true. - bool OptimizeAddress(MachineInstr *MI, unsigned OpNo); - - /// getDefininingInst - If the specified operand is a read of an SSA - /// register, return the machine instruction defining it, otherwise, return - /// null. - MachineInstr *getDefiningInst(MachineOperand &MO) { - if (MO.isDef() || !MO.isRegister() || - !MRegisterInfo::isVirtualRegister(MO.getReg())) return 0; - return UDC->getDefinition(MO.getReg()); - } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequired(); - AU.addPreserved(); - MachineFunctionPass::getAnalysisUsage(AU); - } - }; -} - -FunctionPass *llvm::createX86SSAPeepholeOptimizerPass() { return new SSAPH(); } - -bool SSAPH::runOnMachineFunction(MachineFunction &MF) { - bool Changed = false; - bool LocalChanged; - - UDC = &getAnalysis(); - - do { - LocalChanged = false; - - for (MachineFunction::iterator BI = MF.begin(), E = MF.end(); BI != E; ++BI) - for (MachineBasicBlock::iterator I = BI->begin(); I != BI->end(); ) - if (PeepholeOptimize(*BI, I)) { - LocalChanged = true; - ++NumSSAPHOpts; - } else - ++I; - Changed |= LocalChanged; - } while (LocalChanged); - - return Changed; -} - -static bool isValidScaleAmount(unsigned Scale) { - return Scale == 1 || Scale == 2 || Scale == 4 || Scale == 8; -} - -/// OptimizeAddress - If we can fold the addressing arithmetic for this -/// memory instruction into the instruction itself, do so and return true. -bool SSAPH::OptimizeAddress(MachineInstr *MI, unsigned OpNo) { - MachineOperand &BaseRegOp = MI->getOperand(OpNo+0); - MachineOperand &ScaleOp = MI->getOperand(OpNo+1); - MachineOperand &IndexRegOp = MI->getOperand(OpNo+2); - MachineOperand &DisplacementOp = MI->getOperand(OpNo+3); - - unsigned BaseReg = BaseRegOp.hasAllocatedReg() ? BaseRegOp.getReg() : 0; - unsigned Scale = ScaleOp.getImmedValue(); - unsigned IndexReg = IndexRegOp.hasAllocatedReg() ? IndexRegOp.getReg() : 0; - - bool Changed = false; - - // If the base register is unset, and the index register is set with a scale - // of 1, move it to be the base register. - if (BaseRegOp.hasAllocatedReg() && BaseReg == 0 && - Scale == 1 && IndexReg != 0) { - BaseRegOp.setReg(IndexReg); - IndexRegOp.setReg(0); - return true; - } - - // Attempt to fold instructions used by the base register into the instruction - if (MachineInstr *DefInst = getDefiningInst(BaseRegOp)) { - switch (DefInst->getOpcode()) { - case X86::MOV32ri: - // If there is no displacement set for this instruction set one now. - // FIXME: If we can fold two immediates together, we should do so! - if (DisplacementOp.isImmediate() && !DisplacementOp.getImmedValue()) { - if (DefInst->getOperand(1).isImmediate()) { - BaseRegOp.setReg(0); - return Propagate(MI, OpNo+3, DefInst, 1); - } - } - break; - - case X86::ADD32rr: - // If the source is a register-register add, and we do not yet have an - // index register, fold the add into the memory address. - if (IndexReg == 0) { - BaseRegOp = DefInst->getOperand(1); - IndexRegOp = DefInst->getOperand(2); - ScaleOp.setImmedValue(1); - return true; - } - break; - - case X86::SHL32ri: - // If this shift could be folded into the index portion of the address if - // it were the index register, move it to the index register operand now, - // so it will be folded in below. - if ((Scale == 1 || (IndexReg == 0 && IndexRegOp.hasAllocatedReg())) && - DefInst->getOperand(2).getImmedValue() < 4) { - std::swap(BaseRegOp, IndexRegOp); - ScaleOp.setImmedValue(1); Scale = 1; - std::swap(IndexReg, BaseReg); - Changed = true; - break; - } - } - } - - // Attempt to fold instructions used by the index into the instruction - if (MachineInstr *DefInst = getDefiningInst(IndexRegOp)) { - switch (DefInst->getOpcode()) { - case X86::SHL32ri: { - // Figure out what the resulting scale would be if we folded this shift. - unsigned ResScale = Scale * (1 << DefInst->getOperand(2).getImmedValue()); - if (isValidScaleAmount(ResScale)) { - IndexRegOp = DefInst->getOperand(1); - ScaleOp.setImmedValue(ResScale); - return true; - } - break; - } - } - } - - return Changed; -} - -bool SSAPH::PeepholeOptimize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator &I) { - MachineBasicBlock::iterator NextI = next(I); - - MachineInstr *MI = I; - MachineInstr *Next = (NextI != MBB.end()) ? &*NextI : (MachineInstr*)0; - - bool Changed = false; - - const TargetInstrInfo &TII = *MBB.getParent()->getTarget().getInstrInfo(); - - // Scan the operands of this instruction. If any operands are - // register-register copies, replace the operand with the source. - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) - // Is this an SSA register use? - if (MachineInstr *DefInst = getDefiningInst(MI->getOperand(i))) { - // If the operand is a vreg-vreg copy, it is always safe to replace the - // source value with the input operand. - unsigned Source, Dest; - if (TII.isMoveInstr(*DefInst, Source, Dest)) { - // Don't propagate physical registers into any instructions. - if (DefInst->getOperand(1).isRegister() && - MRegisterInfo::isVirtualRegister(Source)) { - MI->getOperand(i).setReg(Source); - Changed = true; - ++NumPHMoves; - } - } - } - - - // Perform instruction specific optimizations. - switch (MI->getOpcode()) { - - // Register to memory stores. Format: , srcreg - case X86::MOV32mr: case X86::MOV16mr: case X86::MOV8mr: - case X86::MOV32mi: case X86::MOV16mi: case X86::MOV8mi: - // Check to see if we can fold the source instruction into this one... - if (MachineInstr *SrcInst = getDefiningInst(MI->getOperand(4))) { - switch (SrcInst->getOpcode()) { - // Fold the immediate value into the store, if possible. - case X86::MOV8ri: return Propagate(MI, 4, SrcInst, 1, X86::MOV8mi); - case X86::MOV16ri: return Propagate(MI, 4, SrcInst, 1, X86::MOV16mi); - case X86::MOV32ri: return Propagate(MI, 4, SrcInst, 1, X86::MOV32mi); - default: break; - } - } - - // If we can optimize the addressing expression, do so now. - if (OptimizeAddress(MI, 0)) - return true; - break; - - case X86::MOV32rm: - case X86::MOV16rm: - case X86::MOV8rm: - // If we can optimize the addressing expression, do so now. - if (OptimizeAddress(MI, 1)) - return true; - break; - - default: break; - } - - return Changed; -} Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.89 llvm/lib/Target/X86/X86TargetMachine.cpp:1.90 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.89 Tue Nov 15 19:54:32 2005 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Mon Dec 12 14:12:20 2005 @@ -36,9 +36,6 @@ int X86TargetMachineModule = 0; namespace { - cl::opt NoSSAPeephole("disable-ssa-peephole", cl::init(true), - cl::desc("Disable the ssa-based peephole optimizer " - "(defaults to disabled)")); cl::opt DisableOutput("disable-x86-llc-output", cl::Hidden, cl::desc("Disable the X86 asm printer, for use " "when profiling the code generator.")); @@ -132,10 +129,6 @@ else PM.add(createX86ISelPattern(*this)); - // Run optional SSA-based machine code optimizations next... - if (!NoSSAPeephole) - PM.add(createX86SSAPeepholeOptimizerPass()); - // Print the instruction selected machine code... if (PrintMachineCode) PM.add(createMachineFunctionPrinterPass(&std::cerr)); @@ -203,10 +196,6 @@ else PM.add(createX86ISelPattern(TM)); - // Run optional SSA-based machine code optimizations next... - if (!NoSSAPeephole) - PM.add(createX86SSAPeepholeOptimizerPass()); - // FIXME: Add SSA based peephole optimizer here. // Print the instruction selected machine code... From alenhar2 at cs.uiuc.edu Mon Dec 12 14:30:29 2005 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 12 Dec 2005 14:30:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp AlphaInstrInfo.td Message-ID: <200512122030.OAA20244@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelDAGToDAG.cpp updated: 1.17 -> 1.18 AlphaInstrInfo.td updated: 1.83 -> 1.84 --- Log message: fix FP selects --- Diffs of the changes: (+14 -14) AlphaISelDAGToDAG.cpp | 2 +- AlphaInstrInfo.td | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.17 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.18 --- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.17 Mon Dec 12 11:43:52 2005 +++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Mon Dec 12 14:30:09 2005 @@ -427,7 +427,7 @@ CurDAG->getRegister(Alpha::R31, MVT::i64), ST); } - SDOperand FP = CurDAG->getTargetNode(isDouble?Alpha::FCMOVEQT:Alpha::FCMOVEQS, + SDOperand FP = CurDAG->getTargetNode(isDouble?Alpha::FCMOVNET:Alpha::FCMOVNES, MVT::f64, FV, TV, LD); return FP; } Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.83 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.84 --- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.83 Sat Dec 10 21:54:31 2005 +++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Mon Dec 12 14:30:09 2005 @@ -188,7 +188,7 @@ // and constants (which require inverted conditions as legalize puts the constant in the // wrong field for the instruction definition def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2), - (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; + (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>; def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC", @@ -600,30 +600,30 @@ //misc FP selects //Select double def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf), - (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>; -def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf), (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>; +def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf), + (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>; def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf), - (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>; + (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>; def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf), - (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>; + (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>; def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf), - (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>; + (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>; def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf), - (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>; + (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>; //Select single def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf), - (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>; -def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf), (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>; +def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf), + (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>; def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf), - (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>; + (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>; def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf), - (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>; + (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>; def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf), - (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>; + (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>; def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf), - (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>; + (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>; From evan.cheng at apple.com Mon Dec 12 14:32:30 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 14:32:30 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200512122032.OAA31275@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.8 -> 1.9 --- Log message: For ISD::RET, if # of operands >= 2, try selection the real data dep. operand first before the chain. e.g. int X; int foo(int x) { x += X + 37; return x; } If chain operand is selected first, we would generate: movl X, %eax movl 4(%esp), %ecx leal 37(%ecx,%eax), %eax rather than movl $37, %eax addl 4(%esp), %eax addl X, %eax which does not require %ecx. (Due to ADD32rm not matching.) --- Diffs of the changes: (+10 -2) X86ISelDAGToDAG.cpp | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.8 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.9 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.8 Fri Dec 9 18:48:20 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Dec 12 14:32:18 2005 @@ -356,15 +356,22 @@ break; case ISD::RET: { - SDOperand Chain = Select(N->getOperand(0)); // Token chain. - switch (N->getNumOperands()) { + SDOperand Chain = N->getOperand(0); // Token chain. + unsigned NumOps = N->getNumOperands(); + + // Note: A bit of a hack / optimization... Try to delay chain selection + // as much as possible. So it's more likely it has already been selected + // for a real use. + switch (NumOps) { default: assert(0 && "Unknown return instruction!"); case 3: + Chain = Select(Chain); assert(0 && "Not yet handled return instruction!"); break; case 2: { SDOperand Val = Select(N->getOperand(1)); + Chain = Select(Chain); switch (N->getOperand(1).getValueType()) { default: assert(0 && "All other types should have been promoted!!"); @@ -378,6 +385,7 @@ } } case 1: + Chain = Select(Chain); break; } if (X86Lowering.getBytesToPopOnReturn() == 0) From evan.cheng at apple.com Mon Dec 12 15:49:51 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 15:49:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200512122149.PAA31531@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.9 -> 1.10 --- Log message: When SelectLEAAddr() fails, it shouldn't cause the side effect of having the base or index operands being selected. --- Diffs of the changes: (+48 -17) X86ISelDAGToDAG.cpp | 65 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 48 insertions(+), 17 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.9 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.10 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.9 Mon Dec 12 14:32:18 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Dec 12 15:49:40 2005 @@ -101,6 +101,17 @@ bool SelectLEAAddr(SDOperand N, SDOperand &Base, SDOperand &Scale, SDOperand &Index, SDOperand &Disp); + inline void getAddressOperands(X86ISelAddressMode &AM, SDOperand &Base, + SDOperand &Scale, SDOperand &Index, + SDOperand &Disp) { + Base = (AM.BaseType == X86ISelAddressMode::FrameIndexBase) ? + CurDAG->getTargetFrameIndex(AM.Base.FrameIndex, MVT::i32) : AM.Base.Reg; + Scale = getI8Imm (AM.Scale); + Index = AM.IndexReg; + Disp = AM.GV ? CurDAG->getTargetGlobalAddress(AM.GV, MVT::i32, AM.Disp) + : getI32Imm(AM.Disp); + } + /// getI8Imm - Return a target constant with the specified value, of type /// i8. inline SDOperand getI8Imm(unsigned Imm) { @@ -285,12 +296,7 @@ else AM.IndexReg = CurDAG->getRegister(0, MVT::i32); - Base = (AM.BaseType == X86ISelAddressMode::FrameIndexBase) ? - CurDAG->getTargetFrameIndex(AM.Base.FrameIndex, MVT::i32) : AM.Base.Reg; - Scale = getI8Imm (AM.Scale); - Index = AM.IndexReg; - Disp = AM.GV ? CurDAG->getTargetGlobalAddress(AM.GV, MVT::i32, AM.Disp) - : getI32Imm(AM.Disp); + getAddressOperands(AM, Base, Scale, Index, Disp); return true; } return false; @@ -308,24 +314,49 @@ /// For X86, it always is unless it's just a (Reg + const). bool X86DAGToDAGISel::SelectLEAAddr(SDOperand N, SDOperand &Base, SDOperand &Scale, SDOperand &Index, SDOperand &Disp) { - if (SelectAddr(N, Base, Scale, Index, Disp)) { - if (!isRegister0(Base)) { + X86ISelAddressMode AM; + if (!MatchAddress(N, AM)) { + bool SelectBase = false; + bool SelectIndex = false; + bool Check = false; + if (AM.BaseType == X86ISelAddressMode::RegBase) { + if (AM.Base.Reg.Val) { + Check = true; + SelectBase = true; + } else { + AM.Base.Reg = CurDAG->getRegister(0, MVT::i32); + } + } + + if (AM.IndexReg.Val) { + SelectIndex = true; + } else { + AM.IndexReg = CurDAG->getRegister(0, MVT::i32); + } + + if (Check) { unsigned Complexity = 0; - if ((unsigned)cast(Scale)->getValue() > 1) + if (AM.Scale > 1) Complexity++; - if (!isRegister0(Index)) + if (SelectIndex) Complexity++; - if (ConstantSDNode *CN = dyn_cast(Disp)) { - if (!CN->isNullValue()) Complexity++; - } else { + if (AM.GV) Complexity++; - } - return (Complexity > 1); + else if (AM.Disp > 1) + Complexity++; + if (Complexity <= 1) + return false; } + + if (SelectBase) + AM.Base.Reg = Select(AM.Base.Reg); + if (SelectIndex) + AM.IndexReg = Select(AM.IndexReg); + + getAddressOperands(AM, Base, Scale, Index, Disp); return true; - } else { - return false; } + return false; } SDOperand X86DAGToDAGISel::Select(SDOperand Op) { From evan.cheng at apple.com Mon Dec 12 15:54:17 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 15:54:17 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512122154.PAA31559@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.153 -> 1.154 --- Log message: Add some sub patterns. --- Diffs of the changes: (+24 -13) X86InstrInfo.td | 37 ++++++++++++++++++++++++------------- 1 files changed, 24 insertions(+), 13 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.153 llvm/lib/Target/X86/X86InstrInfo.td:1.154 --- llvm/lib/Target/X86/X86InstrInfo.td:1.153 Mon Dec 12 13:45:23 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 15:54:05 2005 @@ -1261,11 +1261,14 @@ "sub{l} {$src2, $dst|$dst, $src2}", [(set R32:$dst, (sub R32:$src1, R32:$src2))]>; def SUB8rm : I<0x2A, MRMSrcMem, (ops R8 :$dst, R8 :$src1, i8mem :$src2), - "sub{b} {$src2, $dst|$dst, $src2}", []>; + "sub{b} {$src2, $dst|$dst, $src2}", + [(set R8:$dst, (sub R8:$src1, (load addr:$src2)))]>; def SUB16rm : I<0x2B, MRMSrcMem, (ops R16:$dst, R16:$src1, i16mem:$src2), - "sub{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + "sub{w} {$src2, $dst|$dst, $src2}", + [(set R16:$dst, (sub R16:$src1, (load addr:$src2)))]>, OpSize; def SUB32rm : I<0x2B, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2), - "sub{l} {$src2, $dst|$dst, $src2}", []>; + "sub{l} {$src2, $dst|$dst, $src2}", + [(set R32:$dst, (sub R32:$src1, (load addr:$src2)))]>; def SUB8ri : Ii8 <0x80, MRM5r, (ops R8:$dst, R8:$src1, i8imm:$src2), "sub{b} {$src2, $dst|$dst, $src2}", @@ -1284,21 +1287,29 @@ [(set R32:$dst, (sub R32:$src1, immSExt8:$src2))]>; let isTwoAddress = 0 in { def SUB8mr : I<0x28, MRMDestMem, (ops i8mem :$dst, R8 :$src2), - "sub{b} {$src2, $dst|$dst, $src2}", []>; + "sub{b} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), R8:$src2), addr:$dst)]>; def SUB16mr : I<0x29, MRMDestMem, (ops i16mem:$dst, R16:$src2), - "sub{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + "sub{w} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), R16:$src2), addr:$dst)]>, OpSize; def SUB32mr : I<0x29, MRMDestMem, (ops i32mem:$dst, R32:$src2), - "sub{l} {$src2, $dst|$dst, $src2}", []>; + "sub{l} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), R32:$src2), addr:$dst)]>; def SUB8mi : Ii8<0x80, MRM5m, (ops i8mem :$dst, i8imm:$src2), - "sub{b} {$src2, $dst|$dst, $src2}", []>; + "sub{b} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), (i8 imm:$src2)), addr:$dst)]>; def SUB16mi : Ii16<0x81, MRM5m, (ops i16mem:$dst, i16imm:$src2), - "sub{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + "sub{w} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, OpSize; def SUB32mi : Ii32<0x81, MRM5m, (ops i32mem:$dst, i32imm:$src2), - "sub{l} {$src2, $dst|$dst, $src2}", []>; - def SUB16mi8 : Ii8<0x83, MRM5m, (ops i16mem:$dst, i8imm :$src2), - "sub{w} {$src2, $dst|$dst, $src2}", []>, OpSize; - def SUB32mi8 : Ii8<0x83, MRM5m, (ops i32mem:$dst, i8imm :$src2), - "sub{l} {$src2, $dst|$dst, $src2}", []>; + "sub{l} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; + def SUB16mi8 : Ii8<0x83, MRM5m, (ops i16mem:$dst, i16i8imm :$src2), + "sub{w} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), (i16 immSExt8:$src2)), addr:$dst)]>, OpSize; + def SUB32mi8 : Ii8<0x83, MRM5m, (ops i32mem:$dst, i32i8imm :$src2), + "sub{l} {$src2, $dst|$dst, $src2}", + [(store (sub (load addr:$dst), (i32 immSExt8:$src2)), addr:$dst)]>; } def SBB32rr : I<0x19, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2), From lattner at cs.uiuc.edu Mon Dec 12 16:27:34 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 16:27:34 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/2005-12-12-ExpandSextInreg.ll Message-ID: <200512122227.QAA31902@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Generic: 2005-12-12-ExpandSextInreg.ll added (r1.1) --- Log message: Testcase for a problem that reid ran into --- Diffs of the changes: (+7 -0) 2005-12-12-ExpandSextInreg.ll | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/test/Regression/CodeGen/Generic/2005-12-12-ExpandSextInreg.ll diff -c /dev/null llvm/test/Regression/CodeGen/Generic/2005-12-12-ExpandSextInreg.ll:1.1 *** /dev/null Mon Dec 12 16:27:32 2005 --- llvm/test/Regression/CodeGen/Generic/2005-12-12-ExpandSextInreg.ll Mon Dec 12 16:27:22 2005 *************** *** 0 **** --- 1,7 ---- + ; RUN: llvm-as < %s | llc + + long %test(long %A) { + %B = cast long %A to sbyte + %C = cast sbyte %B to long + ret long %C + } From lattner at cs.uiuc.edu Mon Dec 12 16:27:55 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 16:27:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512122227.QAA31933@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.226 -> 1.227 --- Log message: Fix CodeGen/Generic/2005-12-12-ExpandSextInreg.ll --- Diffs of the changes: (+10 -0) LegalizeDAG.cpp | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.226 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.227 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.226 Fri Dec 9 20:36:00 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Dec 12 16:27:43 2005 @@ -3196,6 +3196,16 @@ Lo = LegalizeOp(Node->getOperand(0)); Hi = LegalizeOp(Node->getOperand(1)); break; + + case ISD::SIGN_EXTEND_INREG: + ExpandOp(Node->getOperand(0), Lo, Hi); + // Sign extend the lo-part. + Hi = DAG.getNode(ISD::SRA, NVT, Lo, + DAG.getConstant(MVT::getSizeInBits(NVT)-1, + TLI.getShiftAmountTy())); + // sext_inreg the low part if needed. + Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Lo, Node->getOperand(1)); + break; case ISD::CTPOP: ExpandOp(Node->getOperand(0), Lo, Hi); From lattner at cs.uiuc.edu Mon Dec 12 16:51:28 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 16:51:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200512122251.QAA32091@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.114 -> 1.115 --- Log message: Accept and ignore prefetches for now --- Diffs of the changes: (+3 -0) SelectionDAGISel.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.114 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.115 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.114 Sun Dec 11 03:05:13 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Dec 12 16:51:16 2005 @@ -992,6 +992,9 @@ getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1)))); return 0; + case Intrinsic::prefetch: + // FIXME: Currently discarding prefetches. + return 0; default: std::cerr << I; assert(0 && "This intrinsic is not implemented yet!"); From evan.cheng at apple.com Mon Dec 12 17:23:00 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 17:23:00 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512122323.RAA32251@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.95 -> 1.96 --- Log message: At top of generated isel SelectCode() is this: if (!N.Val->hasOneUse()) { std::map::iterator CGMI = CodeGenMap.find(N); if (CGMI != CodeGenMap.end()) return CGMI->second; } Suppose a DAG like this: X ^ ^ / \ USE1 USE2 Suppose USE1 is being selected first and during which X is selected and returned a new node. After this, USE1 is no longer an use of X. During USE2 selection, X will be selected again since it has only one use! The fix is to always query CodeGenMap. --- Diffs of the changes: (+2 -4) DAGISelEmitter.cpp | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.95 llvm/utils/TableGen/DAGISelEmitter.cpp:1.96 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.95 Mon Dec 12 13:37:43 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Dec 12 17:22:48 2005 @@ -2234,10 +2234,8 @@ << " N.getOpcode() < (ISD::BUILTIN_OP_END+" << InstNS << "INSTRUCTION_LIST_END))\n" << " return N; // Already selected.\n\n" - << " if (!N.Val->hasOneUse()) {\n" - << " std::map::iterator CGMI = CodeGenMap.find(N);\n" - << " if (CGMI != CodeGenMap.end()) return CGMI->second;\n" - << " }\n" + << " std::map::iterator CGMI = CodeGenMap.find(N);\n" + << " if (CGMI != CodeGenMap.end()) return CGMI->second;\n" << " switch (N.getOpcode()) {\n" << " default: break;\n" << " case ISD::EntryToken: // These leaves remain the same.\n" From evan.cheng at apple.com Mon Dec 12 17:45:33 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 17:45:33 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512122345.RAA32350@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.96 -> 1.97 --- Log message: Bug fix: CodeGenMap[N] = ... -> CodeGenMap[N.getValue(0)] = ... --- Diffs of the changes: (+1 -1) DAGISelEmitter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.96 llvm/utils/TableGen/DAGISelEmitter.cpp:1.97 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.96 Mon Dec 12 17:22:48 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Dec 12 17:45:21 2005 @@ -2026,7 +2026,7 @@ OS << ", InFlag"; OS << ");\n"; if (NumResults != 0) { - OS << " CodeGenMap[N] = Result;\n"; + OS << " CodeGenMap[N.getValue(0)] = Result;\n"; } OS << " Chain "; if (NodeHasChain(LHS, ISE)) From evan.cheng at apple.com Mon Dec 12 17:47:58 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 17:47:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512122347.RAA32433@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.154 -> 1.155 --- Log message: Add some integer mul patterns. --- Diffs of the changes: (+17 -11) X86InstrInfo.td | 28 +++++++++++++++++----------- 1 files changed, 17 insertions(+), 11 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.154 llvm/lib/Target/X86/X86InstrInfo.td:1.155 --- llvm/lib/Target/X86/X86InstrInfo.td:1.154 Mon Dec 12 15:54:05 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 17:47:46 2005 @@ -1353,9 +1353,11 @@ [(set R32:$dst, (mul R32:$src1, R32:$src2))]>, TB; } def IMUL16rm : I<0xAF, MRMSrcMem, (ops R16:$dst, R16:$src1, i16mem:$src2), - "imul{w} {$src2, $dst|$dst, $src2}", []>, TB, OpSize; + "imul{w} {$src2, $dst|$dst, $src2}", + [(set R16:$dst, (mul R16:$src1, (load addr:$src2)))]>, TB, OpSize; def IMUL32rm : I<0xAF, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2), - "imul{l} {$src2, $dst|$dst, $src2}", []>, TB; + "imul{l} {$src2, $dst|$dst, $src2}", + [(set R32:$dst, (mul R32:$src1, (load addr:$src2)))]>, TB; } // end Two Address instructions @@ -1363,8 +1365,7 @@ def IMUL16rri : Ii16<0x69, MRMSrcReg, // R16 = R16*I16 (ops R16:$dst, R16:$src1, i16imm:$src2), "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R16:$dst, (mul R16:$src1, imm:$src2))]>, - OpSize; + [(set R16:$dst, (mul R16:$src1, imm:$src2))]>, OpSize; def IMUL32rri : Ii32<0x69, MRMSrcReg, // R32 = R32*I32 (ops R32:$dst, R32:$src1, i32imm:$src2), "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", @@ -1379,17 +1380,22 @@ [(set R32:$dst, (mul R32:$src1, immSExt8:$src2))]>; def IMUL16rmi : Ii16<0x69, MRMSrcMem, // R16 = [mem16]*I16 - (ops R32:$dst, i16mem:$src1, i16imm:$src2), - "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", []>, OpSize; + (ops R16:$dst, i16mem:$src1, i16imm:$src2), + "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", + [(set R16:$dst, (mul (load addr:$src1), imm:$src2))]>, + OpSize; def IMUL32rmi : Ii32<0x69, MRMSrcMem, // R32 = [mem32]*I32 (ops R32:$dst, i32mem:$src1, i32imm:$src2), - "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", []>; + "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", + [(set R32:$dst, (mul (load addr:$src1), imm:$src2))]>; def IMUL16rmi8 : Ii8<0x6B, MRMSrcMem, // R16 = [mem16]*I8 - (ops R32:$dst, i16mem:$src1, i8imm :$src2), - "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", []>, OpSize; + (ops R16:$dst, i16mem:$src1, i16i8imm :$src2), + "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", + [(set R16:$dst, (mul (load addr:$src1), immSExt8:$src2))]>, OpSize; def IMUL32rmi8 : Ii8<0x6B, MRMSrcMem, // R32 = [mem32]*I8 - (ops R32:$dst, i32mem:$src1, i8imm: $src2), - "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", []>; + (ops R32:$dst, i32mem:$src1, i32i8imm: $src2), + "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", + [(set R32:$dst, (mul (load addr:$src1), immSExt8:$src2))]>; //===----------------------------------------------------------------------===// // Test instructions are just like AND, except they don't generate a result. From evan.cheng at apple.com Mon Dec 12 18:01:21 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 18:01:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130001.SAA32553@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.155 -> 1.156 --- Log message: * Split immSExt8 to i16SExt8 and i32SExt8 for i16 and i32 immediate operands. This enables the removal of some explicit type casts. * Rename immZExt8 to i16ZExt8 as well. --- Diffs of the changes: (+33 -27) X86InstrInfo.td | 60 ++++++++++++++++++++++++++++++-------------------------- 1 files changed, 33 insertions(+), 27 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.155 llvm/lib/Target/X86/X86InstrInfo.td:1.156 --- llvm/lib/Target/X86/X86InstrInfo.td:1.155 Mon Dec 12 17:47:46 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 18:01:09 2005 @@ -143,15 +143,21 @@ //===----------------------------------------------------------------------===// // Pattern fragments... // -def immSExt8 : PatLeaf<(imm), [{ - // immSExt8 predicate - True if the immediate fits in a 8-bit sign extended - // field. +def i16SExt8 : PatLeaf<(i16 imm), [{ + // i16SExt8 predicate - True if the 16-bit immediate fits in a 8-bit + // sign extended field. return (int)N->getValue() == (signed char)N->getValue(); }]>; -def immZExt8 : PatLeaf<(imm), [{ - // immZExt8 predicate - True if the immediate fits in a 8-bit zero extended - // field. +def i32SExt8 : PatLeaf<(i32 imm), [{ + // i32SExt8 predicate - True if the 32-bit immediate fits in a 8-bit + // sign extended field. + return (int)N->getValue() == (signed char)N->getValue(); +}]>; + +def i16ZExt8 : PatLeaf<(i16 imm), [{ + // i16ZExt8 predicate - True if the 16-bit immediate fits in a 8-bit zero + // extended field. return (unsigned)N->getValue() == (unsigned char)N->getValue(); }]>; @@ -348,15 +354,15 @@ def OUT8ir : Ii8<0xE6, RawFrm, (ops i16i8imm:$port), "out{b} {%al, $port|$port, %AL}", - [(writeport AL, (i16 immZExt8:$port))]>, + [(writeport AL, (i16 i16ZExt8:$port))]>, Imp<[AL], []>; def OUT16ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{w} {%ax, $port|$port, %AX}", - [(writeport AX, (i16 immZExt8:$port))]>, + [(writeport AX, (i16 i16ZExt8:$port))]>, Imp<[AX], []>, OpSize; def OUT32ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{l} {%eax, $port|$port, %EAX}", - [(writeport EAX, (i16 immZExt8:$port))]>, + [(writeport EAX, (i16 i16ZExt8:$port))]>, Imp<[EAX], []>; //===----------------------------------------------------------------------===// @@ -764,11 +770,11 @@ def AND16ri8 : Ii8<0x83, MRM4r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "and{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (and R16:$src1, immSExt8:$src2))]>, OpSize; + [(set R16:$dst, (and R16:$src1, i16SExt8:$src2))]>, OpSize; def AND32ri8 : Ii8<0x83, MRM4r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "and{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (and R32:$src1, immSExt8:$src2))]>; + [(set R32:$dst, (and R32:$src1, i32SExt8:$src2))]>; let isTwoAddress = 0 in { def AND8mr : I<0x20, MRMDestMem, @@ -828,10 +834,10 @@ def OR16ri8 : Ii8<0x83, MRM1r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "or{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (or R16:$src1, immSExt8:$src2))]>, OpSize; + [(set R16:$dst, (or R16:$src1, i16SExt8:$src2))]>, OpSize; def OR32ri8 : Ii8<0x83, MRM1r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "or{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (or R32:$src1, immSExt8:$src2))]>; + [(set R32:$dst, (or R32:$src1, i32SExt8:$src2))]>; let isTwoAddress = 0 in { def OR8mr : I<0x08, MRMDestMem, (ops i8mem:$dst, R8:$src), "or{b} {$src, $dst|$dst, $src}", []>; @@ -892,11 +898,11 @@ def XOR16ri8 : Ii8<0x83, MRM6r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "xor{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (xor R16:$src1, immSExt8:$src2))]>, OpSize; + [(set R16:$dst, (xor R16:$src1, i16SExt8:$src2))]>, OpSize; def XOR32ri8 : Ii8<0x83, MRM6r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "xor{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (xor R32:$src1, immSExt8:$src2))]>; + [(set R32:$dst, (xor R32:$src1, i32SExt8:$src2))]>; let isTwoAddress = 0 in { def XOR8mr : I<0x30, MRMDestMem, (ops i8mem :$dst, R8 :$src), @@ -1199,10 +1205,10 @@ // FIXME: move ADD16ri8 above ADD16ri to optimize for space. def ADD16ri8 : Ii8<0x83, MRM0r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "add{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (add R16:$src1, immSExt8:$src2))]>, OpSize; + [(set R16:$dst, (add R16:$src1, i16SExt8:$src2))]>, OpSize; def ADD32ri8 : Ii8<0x83, MRM0r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "add{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (add R32:$src1, immSExt8:$src2))]>; + [(set R32:$dst, (add R32:$src1, i32SExt8:$src2))]>; let isTwoAddress = 0 in { def ADD8mr : I<0x00, MRMDestMem, (ops i8mem :$dst, R8 :$src2), @@ -1225,10 +1231,10 @@ [(store (add (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; def ADD16mi8 : Ii8<0x83, MRM0m, (ops i16mem:$dst, i16i8imm :$src2), "add{w} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), (i16 immSExt8:$src2)), addr:$dst)]>, OpSize; + [(store (add (load addr:$dst), i16SExt8:$src2), addr:$dst)]>, OpSize; def ADD32mi8 : Ii8<0x83, MRM0m, (ops i32mem:$dst, i32i8imm :$src2), "add{l} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), (i32 immSExt8:$src2)), addr:$dst)]>; + [(store (add (load addr:$dst), i32SExt8:$src2), addr:$dst)]>; } let isCommutable = 1 in { // X = ADC Y, Z --> X = ADC Z, Y @@ -1281,10 +1287,10 @@ [(set R32:$dst, (sub R32:$src1, imm:$src2))]>; def SUB16ri8 : Ii8<0x83, MRM5r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "sub{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (sub R16:$src1, immSExt8:$src2))]>, OpSize; + [(set R16:$dst, (sub R16:$src1, i16SExt8:$src2))]>, OpSize; def SUB32ri8 : Ii8<0x83, MRM5r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "sub{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (sub R32:$src1, immSExt8:$src2))]>; + [(set R32:$dst, (sub R32:$src1, i32SExt8:$src2))]>; let isTwoAddress = 0 in { def SUB8mr : I<0x28, MRMDestMem, (ops i8mem :$dst, R8 :$src2), "sub{b} {$src2, $dst|$dst, $src2}", @@ -1306,10 +1312,10 @@ [(store (sub (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; def SUB16mi8 : Ii8<0x83, MRM5m, (ops i16mem:$dst, i16i8imm :$src2), "sub{w} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), (i16 immSExt8:$src2)), addr:$dst)]>, OpSize; + [(store (sub (load addr:$dst), i16SExt8:$src2), addr:$dst)]>, OpSize; def SUB32mi8 : Ii8<0x83, MRM5m, (ops i32mem:$dst, i32i8imm :$src2), "sub{l} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), (i32 immSExt8:$src2)), addr:$dst)]>; + [(store (sub (load addr:$dst), i32SExt8:$src2), addr:$dst)]>; } def SBB32rr : I<0x19, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2), @@ -1373,11 +1379,11 @@ def IMUL16rri8 : Ii8<0x6B, MRMSrcReg, // R16 = R16*I8 (ops R16:$dst, R16:$src1, i16i8imm:$src2), "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R16:$dst, (mul R16:$src1, immSExt8:$src2))]>, OpSize; + [(set R16:$dst, (mul R16:$src1, i16SExt8:$src2))]>, OpSize; def IMUL32rri8 : Ii8<0x6B, MRMSrcReg, // R32 = R32*I8 (ops R32:$dst, R32:$src1, i32i8imm:$src2), "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R32:$dst, (mul R32:$src1, immSExt8:$src2))]>; + [(set R32:$dst, (mul R32:$src1, i32SExt8:$src2))]>; def IMUL16rmi : Ii16<0x69, MRMSrcMem, // R16 = [mem16]*I16 (ops R16:$dst, i16mem:$src1, i16imm:$src2), @@ -1391,11 +1397,11 @@ def IMUL16rmi8 : Ii8<0x6B, MRMSrcMem, // R16 = [mem16]*I8 (ops R16:$dst, i16mem:$src1, i16i8imm :$src2), "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R16:$dst, (mul (load addr:$src1), immSExt8:$src2))]>, OpSize; + [(set R16:$dst, (mul (load addr:$src1), i16SExt8:$src2))]>, OpSize; def IMUL32rmi8 : Ii8<0x6B, MRMSrcMem, // R32 = [mem32]*I8 (ops R32:$dst, i32mem:$src1, i32i8imm: $src2), "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R32:$dst, (mul (load addr:$src1), immSExt8:$src2))]>; + [(set R32:$dst, (mul (load addr:$src1), i32SExt8:$src2))]>; //===----------------------------------------------------------------------===// // Test instructions are just like AND, except they don't generate a result. From evan.cheng at apple.com Mon Dec 12 18:14:23 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 18:14:23 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130014.SAA32599@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.156 -> 1.157 --- Log message: Fix some bad choice of names: i16SExt8 ->i16immSExt8, etc. --- Diffs of the changes: (+47 -34) X86InstrInfo.td | 81 ++++++++++++++++++++++++++++++++------------------------ 1 files changed, 47 insertions(+), 34 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.156 llvm/lib/Target/X86/X86InstrInfo.td:1.157 --- llvm/lib/Target/X86/X86InstrInfo.td:1.156 Mon Dec 12 18:01:09 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 18:14:11 2005 @@ -143,20 +143,20 @@ //===----------------------------------------------------------------------===// // Pattern fragments... // -def i16SExt8 : PatLeaf<(i16 imm), [{ - // i16SExt8 predicate - True if the 16-bit immediate fits in a 8-bit +def i16immSExt8 : PatLeaf<(i16 imm), [{ + // i16immSExt8 predicate - True if the 16-bit immediate fits in a 8-bit // sign extended field. return (int)N->getValue() == (signed char)N->getValue(); }]>; -def i32SExt8 : PatLeaf<(i32 imm), [{ - // i32SExt8 predicate - True if the 32-bit immediate fits in a 8-bit +def i32immSExt8 : PatLeaf<(i32 imm), [{ + // i32immSExt8 predicate - True if the 32-bit immediate fits in a 8-bit // sign extended field. return (int)N->getValue() == (signed char)N->getValue(); }]>; -def i16ZExt8 : PatLeaf<(i16 imm), [{ - // i16ZExt8 predicate - True if the 16-bit immediate fits in a 8-bit zero +def i16immZExt8 : PatLeaf<(i16 imm), [{ + // i16immZExt8 predicate - True if the 16-bit immediate fits in a 8-bit zero // extended field. return (unsigned)N->getValue() == (unsigned char)N->getValue(); }]>; @@ -354,15 +354,15 @@ def OUT8ir : Ii8<0xE6, RawFrm, (ops i16i8imm:$port), "out{b} {%al, $port|$port, %AL}", - [(writeport AL, (i16 i16ZExt8:$port))]>, + [(writeport AL, (i16 i16immZExt8:$port))]>, Imp<[AL], []>; def OUT16ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{w} {%ax, $port|$port, %AX}", - [(writeport AX, (i16 i16ZExt8:$port))]>, + [(writeport AX, (i16 i16immZExt8:$port))]>, Imp<[AX], []>, OpSize; def OUT32ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{l} {%eax, $port|$port, %EAX}", - [(writeport EAX, (i16 i16ZExt8:$port))]>, + [(writeport EAX, (i16 i16immZExt8:$port))]>, Imp<[EAX], []>; //===----------------------------------------------------------------------===// @@ -770,11 +770,12 @@ def AND16ri8 : Ii8<0x83, MRM4r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "and{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (and R16:$src1, i16SExt8:$src2))]>, OpSize; + [(set R16:$dst, (and R16:$src1, i16immSExt8:$src2))]>, + OpSize; def AND32ri8 : Ii8<0x83, MRM4r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "and{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (and R32:$src1, i32SExt8:$src2))]>; + [(set R32:$dst, (and R32:$src1, i32immSExt8:$src2))]>; let isTwoAddress = 0 in { def AND8mr : I<0x20, MRMDestMem, @@ -834,10 +835,10 @@ def OR16ri8 : Ii8<0x83, MRM1r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "or{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (or R16:$src1, i16SExt8:$src2))]>, OpSize; + [(set R16:$dst, (or R16:$src1, i16immSExt8:$src2))]>, OpSize; def OR32ri8 : Ii8<0x83, MRM1r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "or{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (or R32:$src1, i32SExt8:$src2))]>; + [(set R32:$dst, (or R32:$src1, i32immSExt8:$src2))]>; let isTwoAddress = 0 in { def OR8mr : I<0x08, MRMDestMem, (ops i8mem:$dst, R8:$src), "or{b} {$src, $dst|$dst, $src}", []>; @@ -898,11 +899,12 @@ def XOR16ri8 : Ii8<0x83, MRM6r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "xor{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (xor R16:$src1, i16SExt8:$src2))]>, OpSize; + [(set R16:$dst, (xor R16:$src1, i16immSExt8:$src2))]>, + OpSize; def XOR32ri8 : Ii8<0x83, MRM6r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "xor{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (xor R32:$src1, i32SExt8:$src2))]>; + [(set R32:$dst, (xor R32:$src1, i32immSExt8:$src2))]>; let isTwoAddress = 0 in { def XOR8mr : I<0x30, MRMDestMem, (ops i8mem :$dst, R8 :$src), @@ -1205,10 +1207,11 @@ // FIXME: move ADD16ri8 above ADD16ri to optimize for space. def ADD16ri8 : Ii8<0x83, MRM0r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "add{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (add R16:$src1, i16SExt8:$src2))]>, OpSize; + [(set R16:$dst, (add R16:$src1, i16immSExt8:$src2))]>, + OpSize; def ADD32ri8 : Ii8<0x83, MRM0r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "add{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (add R32:$src1, i32SExt8:$src2))]>; + [(set R32:$dst, (add R32:$src1, i32immSExt8:$src2))]>; let isTwoAddress = 0 in { def ADD8mr : I<0x00, MRMDestMem, (ops i8mem :$dst, R8 :$src2), @@ -1216,7 +1219,8 @@ [(store (add (load addr:$dst), R8:$src2), addr:$dst)]>; def ADD16mr : I<0x01, MRMDestMem, (ops i16mem:$dst, R16:$src2), "add{w} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), R16:$src2), addr:$dst)]>, OpSize; + [(store (add (load addr:$dst), R16:$src2), addr:$dst)]>, + OpSize; def ADD32mr : I<0x01, MRMDestMem, (ops i32mem:$dst, R32:$src2), "add{l} {$src2, $dst|$dst, $src2}", [(store (add (load addr:$dst), R32:$src2), addr:$dst)]>; @@ -1225,16 +1229,18 @@ [(store (add (load addr:$dst), (i8 imm:$src2)), addr:$dst)]>; def ADD16mi : Ii16<0x81, MRM0m, (ops i16mem:$dst, i16imm:$src2), "add{w} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, OpSize; + [(store (add (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, + OpSize; def ADD32mi : Ii32<0x81, MRM0m, (ops i32mem:$dst, i32imm:$src2), "add{l} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; + [(store (add (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; def ADD16mi8 : Ii8<0x83, MRM0m, (ops i16mem:$dst, i16i8imm :$src2), "add{w} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), i16SExt8:$src2), addr:$dst)]>, OpSize; + [(store (add (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>, + OpSize; def ADD32mi8 : Ii8<0x83, MRM0m, (ops i32mem:$dst, i32i8imm :$src2), "add{l} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), i32SExt8:$src2), addr:$dst)]>; + [(store (add (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>; } let isCommutable = 1 in { // X = ADC Y, Z --> X = ADC Z, Y @@ -1287,17 +1293,19 @@ [(set R32:$dst, (sub R32:$src1, imm:$src2))]>; def SUB16ri8 : Ii8<0x83, MRM5r, (ops R16:$dst, R16:$src1, i16i8imm:$src2), "sub{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (sub R16:$src1, i16SExt8:$src2))]>, OpSize; + [(set R16:$dst, (sub R16:$src1, i16immSExt8:$src2))]>, + OpSize; def SUB32ri8 : Ii8<0x83, MRM5r, (ops R32:$dst, R32:$src1, i32i8imm:$src2), "sub{l} {$src2, $dst|$dst, $src2}", - [(set R32:$dst, (sub R32:$src1, i32SExt8:$src2))]>; + [(set R32:$dst, (sub R32:$src1, i32immSExt8:$src2))]>; let isTwoAddress = 0 in { def SUB8mr : I<0x28, MRMDestMem, (ops i8mem :$dst, R8 :$src2), "sub{b} {$src2, $dst|$dst, $src2}", [(store (sub (load addr:$dst), R8:$src2), addr:$dst)]>; def SUB16mr : I<0x29, MRMDestMem, (ops i16mem:$dst, R16:$src2), "sub{w} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), R16:$src2), addr:$dst)]>, OpSize; + [(store (sub (load addr:$dst), R16:$src2), addr:$dst)]>, + OpSize; def SUB32mr : I<0x29, MRMDestMem, (ops i32mem:$dst, R32:$src2), "sub{l} {$src2, $dst|$dst, $src2}", [(store (sub (load addr:$dst), R32:$src2), addr:$dst)]>; @@ -1306,16 +1314,18 @@ [(store (sub (load addr:$dst), (i8 imm:$src2)), addr:$dst)]>; def SUB16mi : Ii16<0x81, MRM5m, (ops i16mem:$dst, i16imm:$src2), "sub{w} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, OpSize; + [(store (sub (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, + OpSize; def SUB32mi : Ii32<0x81, MRM5m, (ops i32mem:$dst, i32imm:$src2), "sub{l} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; + [(store (sub (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; def SUB16mi8 : Ii8<0x83, MRM5m, (ops i16mem:$dst, i16i8imm :$src2), "sub{w} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), i16SExt8:$src2), addr:$dst)]>, OpSize; + [(store (sub (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>, + OpSize; def SUB32mi8 : Ii8<0x83, MRM5m, (ops i32mem:$dst, i32i8imm :$src2), "sub{l} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), i32SExt8:$src2), addr:$dst)]>; + [(store (sub (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>; } def SBB32rr : I<0x19, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2), @@ -1360,7 +1370,8 @@ } def IMUL16rm : I<0xAF, MRMSrcMem, (ops R16:$dst, R16:$src1, i16mem:$src2), "imul{w} {$src2, $dst|$dst, $src2}", - [(set R16:$dst, (mul R16:$src1, (load addr:$src2)))]>, TB, OpSize; + [(set R16:$dst, (mul R16:$src1, (load addr:$src2)))]>, + TB, OpSize; def IMUL32rm : I<0xAF, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2), "imul{l} {$src2, $dst|$dst, $src2}", [(set R32:$dst, (mul R32:$src1, (load addr:$src2)))]>, TB; @@ -1379,11 +1390,12 @@ def IMUL16rri8 : Ii8<0x6B, MRMSrcReg, // R16 = R16*I8 (ops R16:$dst, R16:$src1, i16i8imm:$src2), "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R16:$dst, (mul R16:$src1, i16SExt8:$src2))]>, OpSize; + [(set R16:$dst, (mul R16:$src1, i16immSExt8:$src2))]>, + OpSize; def IMUL32rri8 : Ii8<0x6B, MRMSrcReg, // R32 = R32*I8 (ops R32:$dst, R32:$src1, i32i8imm:$src2), "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R32:$dst, (mul R32:$src1, i32SExt8:$src2))]>; + [(set R32:$dst, (mul R32:$src1, i32immSExt8:$src2))]>; def IMUL16rmi : Ii16<0x69, MRMSrcMem, // R16 = [mem16]*I16 (ops R16:$dst, i16mem:$src1, i16imm:$src2), @@ -1397,11 +1409,12 @@ def IMUL16rmi8 : Ii8<0x6B, MRMSrcMem, // R16 = [mem16]*I8 (ops R16:$dst, i16mem:$src1, i16i8imm :$src2), "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R16:$dst, (mul (load addr:$src1), i16SExt8:$src2))]>, OpSize; + [(set R16:$dst, (mul (load addr:$src1), i16immSExt8:$src2))]>, + OpSize; def IMUL32rmi8 : Ii8<0x6B, MRMSrcMem, // R32 = [mem32]*I8 (ops R32:$dst, i32mem:$src1, i32i8imm: $src2), "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}", - [(set R32:$dst, (mul (load addr:$src1), i32SExt8:$src2))]>; + [(set R32:$dst, (mul (load addr:$src1), i32immSExt8:$src2))]>; //===----------------------------------------------------------------------===// // Test instructions are just like AND, except they don't generate a result. From evan.cheng at apple.com Mon Dec 12 18:25:18 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 18:25:18 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130025.SAA32667@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.157 -> 1.158 --- Log message: Missed a couple redundant explicit type casts. --- Diffs of the changes: (+3 -3) X86InstrInfo.td | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.157 llvm/lib/Target/X86/X86InstrInfo.td:1.158 --- llvm/lib/Target/X86/X86InstrInfo.td:1.157 Mon Dec 12 18:14:11 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 18:25:07 2005 @@ -354,15 +354,15 @@ def OUT8ir : Ii8<0xE6, RawFrm, (ops i16i8imm:$port), "out{b} {%al, $port|$port, %AL}", - [(writeport AL, (i16 i16immZExt8:$port))]>, + [(writeport AL, i16immZExt8:$port)]>, Imp<[AL], []>; def OUT16ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{w} {%ax, $port|$port, %AX}", - [(writeport AX, (i16 i16immZExt8:$port))]>, + [(writeport AX, i16immZExt8:$port)]>, Imp<[AX], []>, OpSize; def OUT32ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{l} {%eax, $port|$port, %EAX}", - [(writeport EAX, (i16 i16immZExt8:$port))]>, + [(writeport EAX, i16immZExt8:$port)]>, Imp<[EAX], []>; //===----------------------------------------------------------------------===// From evan.cheng at apple.com Mon Dec 12 18:54:56 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 18:54:56 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130054.SAA00317@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.158 -> 1.159 --- Log message: Add neg and not patterns which fold load + stores. --- Diffs of the changes: (+12 -6) X86InstrInfo.td | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.158 llvm/lib/Target/X86/X86InstrInfo.td:1.159 --- llvm/lib/Target/X86/X86InstrInfo.td:1.158 Mon Dec 12 18:25:07 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 18:54:44 2005 @@ -682,9 +682,12 @@ def NEG32r : I<0xF7, MRM3r, (ops R32:$dst, R32:$src), "neg{l} $dst", [(set R32:$dst, (ineg R32:$src))]>; let isTwoAddress = 0 in { - def NEG8m : I<0xF6, MRM3m, (ops i8mem :$dst), "neg{b} $dst", []>; - def NEG16m : I<0xF7, MRM3m, (ops i16mem:$dst), "neg{w} $dst", []>, OpSize; - def NEG32m : I<0xF7, MRM3m, (ops i32mem:$dst), "neg{l} $dst", []>; + def NEG8m : I<0xF6, MRM3m, (ops i8mem :$dst), "neg{b} $dst", + [(store (ineg (i8 (load addr:$dst))), addr:$dst)]>; + def NEG16m : I<0xF7, MRM3m, (ops i16mem:$dst), "neg{w} $dst", + [(store (ineg (i16 (load addr:$dst))), addr:$dst)]>, OpSize; + def NEG32m : I<0xF7, MRM3m, (ops i32mem:$dst), "neg{l} $dst", + [(store (ineg (i32 (load addr:$dst))), addr:$dst)]>; } def NOT8r : I<0xF6, MRM2r, (ops R8 :$dst, R8 :$src), "not{b} $dst", @@ -694,9 +697,12 @@ def NOT32r : I<0xF7, MRM2r, (ops R32:$dst, R32:$src), "not{l} $dst", [(set R32:$dst, (not R32:$src))]>; let isTwoAddress = 0 in { - def NOT8m : I<0xF6, MRM2m, (ops i8mem :$dst), "not{b} $dst", []>; - def NOT16m : I<0xF7, MRM2m, (ops i16mem:$dst), "not{w} $dst", []>, OpSize; - def NOT32m : I<0xF7, MRM2m, (ops i32mem:$dst), "not{l} $dst", []>; + def NOT8m : I<0xF6, MRM2m, (ops i8mem :$dst), "not{b} $dst", + [(store (not (i8 (load addr:$dst))), addr:$dst)]>; + def NOT16m : I<0xF7, MRM2m, (ops i16mem:$dst), "not{w} $dst", + [(store (not (i16 (load addr:$dst))), addr:$dst)]>, OpSize; + def NOT32m : I<0xF7, MRM2m, (ops i32mem:$dst), "not{l} $dst", + [(store (not (i32 (load addr:$dst))), addr:$dst)]>; } // TODO: inc/dec is slow for P4, but fast for Pentium-M. From evan.cheng at apple.com Mon Dec 12 19:02:58 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 19:02:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130102.TAA00374@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.159 -> 1.160 --- Log message: Add inc + dec patterns which fold load + stores. --- Diffs of the changes: (+12 -6) X86InstrInfo.td | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.159 llvm/lib/Target/X86/X86InstrInfo.td:1.160 --- llvm/lib/Target/X86/X86InstrInfo.td:1.159 Mon Dec 12 18:54:44 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 19:02:47 2005 @@ -715,9 +715,12 @@ [(set R32:$dst, (add R32:$src, 1))]>; } let isTwoAddress = 0 in { - def INC8m : I<0xFE, MRM0m, (ops i8mem :$dst), "inc{b} $dst", []>; - def INC16m : I<0xFF, MRM0m, (ops i16mem:$dst), "inc{w} $dst", []>, OpSize; - def INC32m : I<0xFF, MRM0m, (ops i32mem:$dst), "inc{l} $dst", []>; + def INC8m : I<0xFE, MRM0m, (ops i8mem :$dst), "inc{b} $dst", + [(store (add (i8 (load addr:$dst)), 1), addr:$dst)]>; + def INC16m : I<0xFF, MRM0m, (ops i16mem:$dst), "inc{w} $dst", + [(store (add (i16 (load addr:$dst)), 1), addr:$dst)]>, OpSize; + def INC32m : I<0xFF, MRM0m, (ops i32mem:$dst), "inc{l} $dst", + [(store (add (i32 (load addr:$dst)), 1), addr:$dst)]>; } def DEC8r : I<0xFE, MRM1r, (ops R8 :$dst, R8 :$src), "dec{b} $dst", @@ -730,9 +733,12 @@ } let isTwoAddress = 0 in { - def DEC8m : I<0xFE, MRM1m, (ops i8mem :$dst), "dec{b} $dst", []>; - def DEC16m : I<0xFF, MRM1m, (ops i16mem:$dst), "dec{w} $dst", []>, OpSize; - def DEC32m : I<0xFF, MRM1m, (ops i32mem:$dst), "dec{l} $dst", []>; + def DEC8m : I<0xFE, MRM1m, (ops i8mem :$dst), "dec{b} $dst", + [(store (add (i8 (load addr:$dst)), -1), addr:$dst)]>; + def DEC16m : I<0xFF, MRM1m, (ops i16mem:$dst), "dec{w} $dst", + [(store (add (i16 (load addr:$dst)), -1), addr:$dst)]>, OpSize; + def DEC32m : I<0xFF, MRM1m, (ops i32mem:$dst), "dec{l} $dst", + [(store (add (i32 (load addr:$dst)), -1), addr:$dst)]>; } // Logical operators... From evan.cheng at apple.com Mon Dec 12 19:41:47 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 19:41:47 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130141.TAA00523@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.160 -> 1.161 --- Log message: Add and, or, and xor patterns which fold load + stores. --- Diffs of the changes: (+82 -41) X86InstrInfo.td | 123 +++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 82 insertions(+), 41 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.160 llvm/lib/Target/X86/X86InstrInfo.td:1.161 --- llvm/lib/Target/X86/X86InstrInfo.td:1.160 Mon Dec 12 19:02:47 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 19:41:36 2005 @@ -759,13 +759,16 @@ def AND8rm : I<0x22, MRMSrcMem, (ops R8 :$dst, R8 :$src1, i8mem :$src2), - "and{b} {$src2, $dst|$dst, $src2}",[]>; + "and{b} {$src2, $dst|$dst, $src2}", + [(set R8:$dst, (and R8:$src1, (load addr:$src2)))]>; def AND16rm : I<0x23, MRMSrcMem, (ops R16:$dst, R16:$src1, i16mem:$src2), - "and{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + "and{w} {$src2, $dst|$dst, $src2}", + [(set R16:$dst, (and R16:$src1, (load addr:$src2)))]>, OpSize; def AND32rm : I<0x23, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2), - "and{l} {$src2, $dst|$dst, $src2}", []>; + "and{l} {$src2, $dst|$dst, $src2}", + [(set R32:$dst, (and R32:$src1, (load addr:$src2)))]>; def AND8ri : Ii8<0x80, MRM4r, (ops R8 :$dst, R8 :$src1, i8imm :$src2), @@ -792,28 +795,39 @@ let isTwoAddress = 0 in { def AND8mr : I<0x20, MRMDestMem, (ops i8mem :$dst, R8 :$src), - "and{b} {$src, $dst|$dst, $src}", []>; + "and{b} {$src, $dst|$dst, $src}", + [(store (and (load addr:$dst), R8:$src), addr:$dst)]>; def AND16mr : I<0x21, MRMDestMem, (ops i16mem:$dst, R16:$src), - "and{w} {$src, $dst|$dst, $src}", []>, OpSize; + "and{w} {$src, $dst|$dst, $src}", + [(store (and (load addr:$dst), R16:$src), addr:$dst)]>, + OpSize; def AND32mr : I<0x21, MRMDestMem, (ops i32mem:$dst, R32:$src), - "and{l} {$src, $dst|$dst, $src}", []>; + "and{l} {$src, $dst|$dst, $src}", + [(store (and (load addr:$dst), R32:$src), addr:$dst)]>; def AND8mi : Ii8<0x80, MRM4m, (ops i8mem :$dst, i8imm :$src), - "and{b} {$src, $dst|$dst, $src}", []>; + "and{b} {$src, $dst|$dst, $src}", + [(store (and (load addr:$dst), (i8 imm:$src)), addr:$dst)]>; def AND16mi : Ii16<0x81, MRM4m, (ops i16mem:$dst, i16imm:$src), - "and{w} {$src, $dst|$dst, $src}", []>, OpSize; + "and{w} {$src, $dst|$dst, $src}", + [(store (and (load addr:$dst), (i16 imm:$src)), addr:$dst)]>, + OpSize; def AND32mi : Ii32<0x81, MRM4m, (ops i32mem:$dst, i32imm:$src), - "and{l} {$src, $dst|$dst, $src}", []>; + "and{l} {$src, $dst|$dst, $src}", + [(store (and (load addr:$dst), (i32 imm:$src)), addr:$dst)]>; def AND16mi8 : Ii8<0x83, MRM4m, - (ops i16mem:$dst, i8imm :$src), - "and{w} {$src, $dst|$dst, $src}", []>, OpSize; + (ops i16mem:$dst, i16i8imm :$src), + "and{w} {$src, $dst|$dst, $src}", + [(store (and (load addr:$dst), i16immSExt8:$src), addr:$dst)]>, + OpSize; def AND32mi8 : Ii8<0x83, MRM4m, - (ops i32mem:$dst, i8imm :$src), - "and{l} {$src, $dst|$dst, $src}", []>; + (ops i32mem:$dst, i32i8imm :$src), + "and{l} {$src, $dst|$dst, $src}", + [(store (add (load addr:$dst), i32immSExt8:$src), addr:$dst)]>; } @@ -829,11 +843,14 @@ [(set R32:$dst, (or R32:$src1, R32:$src2))]>; } def OR8rm : I<0x0A, MRMSrcMem , (ops R8 :$dst, R8 :$src1, i8mem :$src2), - "or{b} {$src2, $dst|$dst, $src2}", []>; + "or{b} {$src2, $dst|$dst, $src2}", + [(set R8:$dst, (or R8:$src1, (load addr:$src2)))]>; def OR16rm : I<0x0B, MRMSrcMem , (ops R16:$dst, R16:$src1, i16mem:$src2), - "or{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + "or{w} {$src2, $dst|$dst, $src2}", + [(set R16:$dst, (or R16:$src1, (load addr:$src2)))]>, OpSize; def OR32rm : I<0x0B, MRMSrcMem , (ops R32:$dst, R32:$src1, i32mem:$src2), - "or{l} {$src2, $dst|$dst, $src2}", []>; + "or{l} {$src2, $dst|$dst, $src2}", + [(set R32:$dst, (or R32:$src1, (load addr:$src2)))]>; def OR8ri : Ii8 <0x80, MRM1r, (ops R8 :$dst, R8 :$src1, i8imm:$src2), "or{b} {$src2, $dst|$dst, $src2}", @@ -853,21 +870,31 @@ [(set R32:$dst, (or R32:$src1, i32immSExt8:$src2))]>; let isTwoAddress = 0 in { def OR8mr : I<0x08, MRMDestMem, (ops i8mem:$dst, R8:$src), - "or{b} {$src, $dst|$dst, $src}", []>; + "or{b} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), R8:$src), addr:$dst)]>; def OR16mr : I<0x09, MRMDestMem, (ops i16mem:$dst, R16:$src), - "or{w} {$src, $dst|$dst, $src}", []>, OpSize; + "or{w} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), R16:$src), addr:$dst)]>, OpSize; def OR32mr : I<0x09, MRMDestMem, (ops i32mem:$dst, R32:$src), - "or{l} {$src, $dst|$dst, $src}", []>; + "or{l} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), R32:$src), addr:$dst)]>; def OR8mi : Ii8<0x80, MRM1m, (ops i8mem :$dst, i8imm:$src), - "or{b} {$src, $dst|$dst, $src}", []>; + "or{b} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), (i8 imm:$src)), addr:$dst)]>; def OR16mi : Ii16<0x81, MRM1m, (ops i16mem:$dst, i16imm:$src), - "or{w} {$src, $dst|$dst, $src}", []>, OpSize; + "or{w} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), (i16 imm:$src)), addr:$dst)]>, + OpSize; def OR32mi : Ii32<0x81, MRM1m, (ops i32mem:$dst, i32imm:$src), - "or{l} {$src, $dst|$dst, $src}", []>; - def OR16mi8 : Ii8<0x83, MRM1m, (ops i16mem:$dst, i8imm:$src), - "or{w} {$src, $dst|$dst, $src}", []>, OpSize; - def OR32mi8 : Ii8<0x83, MRM1m, (ops i32mem:$dst, i8imm:$src), - "or{l} {$src, $dst|$dst, $src}", []>; + "or{l} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), (i32 imm:$src)), addr:$dst)]>; + def OR16mi8 : Ii8<0x83, MRM1m, (ops i16mem:$dst, i16i8imm:$src), + "or{w} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), i16immSExt8:$src), addr:$dst)]>, + OpSize; + def OR32mi8 : Ii8<0x83, MRM1m, (ops i32mem:$dst, i32i8imm:$src), + "or{l} {$src, $dst|$dst, $src}", + [(store (or (load addr:$dst), i32immSExt8:$src), addr:$dst)]>; } @@ -888,13 +915,16 @@ def XOR8rm : I<0x32, MRMSrcMem , (ops R8 :$dst, R8:$src1, i8mem :$src2), - "xor{b} {$src2, $dst|$dst, $src2}", []>; + "xor{b} {$src2, $dst|$dst, $src2}", + [(set R8:$dst, (xor R8:$src1, (load addr:$src2)))]>; def XOR16rm : I<0x33, MRMSrcMem , - (ops R16:$dst, R8:$src1, i16mem:$src2), - "xor{w} {$src2, $dst|$dst, $src2}", []>, OpSize; + (ops R16:$dst, R16:$src1, i16mem:$src2), + "xor{w} {$src2, $dst|$dst, $src2}", + [(set R16:$dst, (xor R16:$src1, (load addr:$src2)))]>, OpSize; def XOR32rm : I<0x33, MRMSrcMem , - (ops R32:$dst, R8:$src1, i32mem:$src2), - "xor{l} {$src2, $dst|$dst, $src2}", []>; + (ops R32:$dst, R32:$src1, i32mem:$src2), + "xor{l} {$src2, $dst|$dst, $src2}", + [(set R32:$dst, (xor R32:$src1, (load addr:$src2)))]>; def XOR8ri : Ii8<0x80, MRM6r, (ops R8:$dst, R8:$src1, i8imm:$src2), @@ -920,28 +950,39 @@ let isTwoAddress = 0 in { def XOR8mr : I<0x30, MRMDestMem, (ops i8mem :$dst, R8 :$src), - "xor{b} {$src, $dst|$dst, $src}", []>; + "xor{b} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), R8:$src), addr:$dst)]>; def XOR16mr : I<0x31, MRMDestMem, (ops i16mem:$dst, R16:$src), - "xor{w} {$src, $dst|$dst, $src}", []>, OpSize; + "xor{w} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), R16:$src), addr:$dst)]>, + OpSize; def XOR32mr : I<0x31, MRMDestMem, (ops i32mem:$dst, R32:$src), - "xor{l} {$src, $dst|$dst, $src}", []>; + "xor{l} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), R32:$src), addr:$dst)]>; def XOR8mi : Ii8<0x80, MRM6m, (ops i8mem :$dst, i8imm :$src), - "xor{b} {$src, $dst|$dst, $src}", []>; + "xor{b} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), (i8 imm:$src)), addr:$dst)]>; def XOR16mi : Ii16<0x81, MRM6m, (ops i16mem:$dst, i16imm:$src), - "xor{w} {$src, $dst|$dst, $src}", []>, OpSize; + "xor{w} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), (i16 imm:$src)), addr:$dst)]>, + OpSize; def XOR32mi : Ii32<0x81, MRM6m, (ops i32mem:$dst, i32imm:$src), - "xor{l} {$src, $dst|$dst, $src}", []>; + "xor{l} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), (i32 imm:$src)), addr:$dst)]>; def XOR16mi8 : Ii8<0x83, MRM6m, - (ops i16mem:$dst, i8imm :$src), - "xor{w} {$src, $dst|$dst, $src}", []>, OpSize; + (ops i16mem:$dst, i16i8imm :$src), + "xor{w} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), i16immSExt8:$src), addr:$dst)]>, + OpSize; def XOR32mi8 : Ii8<0x83, MRM6m, - (ops i32mem:$dst, i8imm :$src), - "xor{l} {$src, $dst|$dst, $src}", []>; + (ops i32mem:$dst, i32i8imm :$src), + "xor{l} {$src, $dst|$dst, $src}", + [(store (xor (load addr:$dst), i32immSExt8:$src), addr:$dst)]>; } // Shift instructions From evan.cheng at apple.com Mon Dec 12 19:58:03 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 19:58:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130158.TAA00579@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.161 -> 1.162 --- Log message: A few helper fragments for loads. e.g. (i8 (load addr:$src)) -> (loadi8 addr:$src). Only to improve readibility. --- Diffs of the changes: (+18 -12) X86InstrInfo.td | 30 ++++++++++++++++++------------ 1 files changed, 18 insertions(+), 12 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.161 llvm/lib/Target/X86/X86InstrInfo.td:1.162 --- llvm/lib/Target/X86/X86InstrInfo.td:1.161 Mon Dec 12 19:41:36 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 19:57:51 2005 @@ -161,6 +161,11 @@ return (unsigned)N->getValue() == (unsigned char)N->getValue(); }]>; +// Helper fragments for loads. +def loadi8 : PatFrag<(ops node:$in), (i8 (load node:$in))>; +def loadi16 : PatFrag<(ops node:$in), (i16 (load node:$in))>; +def loadi32 : PatFrag<(ops node:$in), (i32 (load node:$in))>; + //===----------------------------------------------------------------------===// // Instruction templates... @@ -683,11 +688,12 @@ [(set R32:$dst, (ineg R32:$src))]>; let isTwoAddress = 0 in { def NEG8m : I<0xF6, MRM3m, (ops i8mem :$dst), "neg{b} $dst", - [(store (ineg (i8 (load addr:$dst))), addr:$dst)]>; + [(store (ineg (loadi8 addr:$dst)), addr:$dst)]>; def NEG16m : I<0xF7, MRM3m, (ops i16mem:$dst), "neg{w} $dst", - [(store (ineg (i16 (load addr:$dst))), addr:$dst)]>, OpSize; + [(store (ineg (loadi16 addr:$dst)), addr:$dst)]>, OpSize; def NEG32m : I<0xF7, MRM3m, (ops i32mem:$dst), "neg{l} $dst", - [(store (ineg (i32 (load addr:$dst))), addr:$dst)]>; + [(store (ineg (loadi32 addr:$dst)), addr:$dst)]>; + } def NOT8r : I<0xF6, MRM2r, (ops R8 :$dst, R8 :$src), "not{b} $dst", @@ -698,11 +704,11 @@ [(set R32:$dst, (not R32:$src))]>; let isTwoAddress = 0 in { def NOT8m : I<0xF6, MRM2m, (ops i8mem :$dst), "not{b} $dst", - [(store (not (i8 (load addr:$dst))), addr:$dst)]>; + [(store (not (loadi8 addr:$dst)), addr:$dst)]>; def NOT16m : I<0xF7, MRM2m, (ops i16mem:$dst), "not{w} $dst", - [(store (not (i16 (load addr:$dst))), addr:$dst)]>, OpSize; + [(store (not (loadi16 addr:$dst)), addr:$dst)]>, OpSize; def NOT32m : I<0xF7, MRM2m, (ops i32mem:$dst), "not{l} $dst", - [(store (not (i32 (load addr:$dst))), addr:$dst)]>; + [(store (not (loadi32 addr:$dst)), addr:$dst)]>; } // TODO: inc/dec is slow for P4, but fast for Pentium-M. @@ -716,11 +722,11 @@ } let isTwoAddress = 0 in { def INC8m : I<0xFE, MRM0m, (ops i8mem :$dst), "inc{b} $dst", - [(store (add (i8 (load addr:$dst)), 1), addr:$dst)]>; + [(store (add (loadi8 addr:$dst), 1), addr:$dst)]>; def INC16m : I<0xFF, MRM0m, (ops i16mem:$dst), "inc{w} $dst", - [(store (add (i16 (load addr:$dst)), 1), addr:$dst)]>, OpSize; + [(store (add (loadi16 addr:$dst), 1), addr:$dst)]>, OpSize; def INC32m : I<0xFF, MRM0m, (ops i32mem:$dst), "inc{l} $dst", - [(store (add (i32 (load addr:$dst)), 1), addr:$dst)]>; + [(store (add (loadi32 addr:$dst), 1), addr:$dst)]>; } def DEC8r : I<0xFE, MRM1r, (ops R8 :$dst, R8 :$src), "dec{b} $dst", @@ -734,11 +740,11 @@ let isTwoAddress = 0 in { def DEC8m : I<0xFE, MRM1m, (ops i8mem :$dst), "dec{b} $dst", - [(store (add (i8 (load addr:$dst)), -1), addr:$dst)]>; + [(store (add (loadi8 addr:$dst), -1), addr:$dst)]>; def DEC16m : I<0xFF, MRM1m, (ops i16mem:$dst), "dec{w} $dst", - [(store (add (i16 (load addr:$dst)), -1), addr:$dst)]>, OpSize; + [(store (add (loadi16 addr:$dst), -1), addr:$dst)]>, OpSize; def DEC32m : I<0xFF, MRM1m, (ops i32mem:$dst), "dec{l} $dst", - [(store (add (i32 (load addr:$dst)), -1), addr:$dst)]>; + [(store (add (loadi32 addr:$dst), -1), addr:$dst)]>; } // Logical operators... From evan.cheng at apple.com Mon Dec 12 20:35:03 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 20:35:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130235.UAA00740@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.162 -> 1.163 --- Log message: Some shl patterns which do load + store folding. --- Diffs of the changes: (+16 -6) X86InstrInfo.td | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.162 llvm/lib/Target/X86/X86InstrInfo.td:1.163 --- llvm/lib/Target/X86/X86InstrInfo.td:1.162 Mon Dec 12 19:57:51 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 20:34:51 2005 @@ -1017,17 +1017,27 @@ let isTwoAddress = 0 in { def SHL8mCL : I<0xD2, MRM4m, (ops i8mem :$dst), - "shl{b} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>; + "shl{b} {%cl, $dst|$dst, %CL}", + [(store (shl (loadi8 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>; def SHL16mCL : I<0xD3, MRM4m, (ops i16mem:$dst), - "shl{w} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>, OpSize; + "shl{w} {%cl, $dst|$dst, %CL}", + [(store (shl (loadi16 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>, OpSize; def SHL32mCL : I<0xD3, MRM4m, (ops i32mem:$dst), - "shl{l} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>; + "shl{l} {%cl, $dst|$dst, %CL}", + [(store (shl (loadi32 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>; def SHL8mi : Ii8<0xC0, MRM4m, (ops i8mem :$dst, i8imm:$src), - "shl{b} {$src, $dst|$dst, $src}", []>; + "shl{b} {$src, $dst|$dst, $src}", + [(store (shl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>; def SHL16mi : Ii8<0xC1, MRM4m, (ops i16mem:$dst, i8imm:$src), - "shl{w} {$src, $dst|$dst, $src}", []>, OpSize; + "shl{w} {$src, $dst|$dst, $src}", + [(store (shl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>, + OpSize; def SHL32mi : Ii8<0xC1, MRM4m, (ops i32mem:$dst, i8imm:$src), - "shl{l} {$src, $dst|$dst, $src}", []>; + "shl{l} {$src, $dst|$dst, $src}", + [(store (shl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>; } def SHR8rCL : I<0xD2, MRM5r, (ops R8 :$dst, R8 :$src), From evan.cheng at apple.com Mon Dec 12 20:40:31 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 12 Dec 2005 20:40:31 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130240.UAA00794@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.163 -> 1.164 --- Log message: Beautify a few patterns. --- Diffs of the changes: (+15 -15) X86InstrInfo.td | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.163 llvm/lib/Target/X86/X86InstrInfo.td:1.164 --- llvm/lib/Target/X86/X86InstrInfo.td:1.163 Mon Dec 12 20:34:51 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 12 20:40:18 2005 @@ -815,16 +815,16 @@ def AND8mi : Ii8<0x80, MRM4m, (ops i8mem :$dst, i8imm :$src), "and{b} {$src, $dst|$dst, $src}", - [(store (and (load addr:$dst), (i8 imm:$src)), addr:$dst)]>; + [(store (and (loadi8 addr:$dst), imm:$src), addr:$dst)]>; def AND16mi : Ii16<0x81, MRM4m, (ops i16mem:$dst, i16imm:$src), "and{w} {$src, $dst|$dst, $src}", - [(store (and (load addr:$dst), (i16 imm:$src)), addr:$dst)]>, + [(store (and (loadi16 addr:$dst), imm:$src), addr:$dst)]>, OpSize; def AND32mi : Ii32<0x81, MRM4m, (ops i32mem:$dst, i32imm:$src), "and{l} {$src, $dst|$dst, $src}", - [(store (and (load addr:$dst), (i32 imm:$src)), addr:$dst)]>; + [(store (and (loadi32 addr:$dst), imm:$src), addr:$dst)]>; def AND16mi8 : Ii8<0x83, MRM4m, (ops i16mem:$dst, i16i8imm :$src), "and{w} {$src, $dst|$dst, $src}", @@ -886,14 +886,14 @@ [(store (or (load addr:$dst), R32:$src), addr:$dst)]>; def OR8mi : Ii8<0x80, MRM1m, (ops i8mem :$dst, i8imm:$src), "or{b} {$src, $dst|$dst, $src}", - [(store (or (load addr:$dst), (i8 imm:$src)), addr:$dst)]>; + [(store (or (loadi8 addr:$dst), imm:$src), addr:$dst)]>; def OR16mi : Ii16<0x81, MRM1m, (ops i16mem:$dst, i16imm:$src), "or{w} {$src, $dst|$dst, $src}", - [(store (or (load addr:$dst), (i16 imm:$src)), addr:$dst)]>, + [(store (or (loadi16 addr:$dst), imm:$src), addr:$dst)]>, OpSize; def OR32mi : Ii32<0x81, MRM1m, (ops i32mem:$dst, i32imm:$src), "or{l} {$src, $dst|$dst, $src}", - [(store (or (load addr:$dst), (i32 imm:$src)), addr:$dst)]>; + [(store (or (loadi32 addr:$dst), imm:$src), addr:$dst)]>; def OR16mi8 : Ii8<0x83, MRM1m, (ops i16mem:$dst, i16i8imm:$src), "or{w} {$src, $dst|$dst, $src}", [(store (or (load addr:$dst), i16immSExt8:$src), addr:$dst)]>, @@ -970,16 +970,16 @@ def XOR8mi : Ii8<0x80, MRM6m, (ops i8mem :$dst, i8imm :$src), "xor{b} {$src, $dst|$dst, $src}", - [(store (xor (load addr:$dst), (i8 imm:$src)), addr:$dst)]>; + [(store (xor (loadi8 addr:$dst), imm:$src), addr:$dst)]>; def XOR16mi : Ii16<0x81, MRM6m, (ops i16mem:$dst, i16imm:$src), "xor{w} {$src, $dst|$dst, $src}", - [(store (xor (load addr:$dst), (i16 imm:$src)), addr:$dst)]>, + [(store (xor (loadi16 addr:$dst), imm:$src), addr:$dst)]>, OpSize; def XOR32mi : Ii32<0x81, MRM6m, (ops i32mem:$dst, i32imm:$src), "xor{l} {$src, $dst|$dst, $src}", - [(store (xor (load addr:$dst), (i32 imm:$src)), addr:$dst)]>; + [(store (xor (loadi32 addr:$dst), imm:$src), addr:$dst)]>; def XOR16mi8 : Ii8<0x83, MRM6m, (ops i16mem:$dst, i16i8imm :$src), "xor{w} {$src, $dst|$dst, $src}", @@ -1295,14 +1295,14 @@ [(store (add (load addr:$dst), R32:$src2), addr:$dst)]>; def ADD8mi : Ii8<0x80, MRM0m, (ops i8mem :$dst, i8imm :$src2), "add{b} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), (i8 imm:$src2)), addr:$dst)]>; + [(store (add (loadi8 addr:$dst), imm:$src2), addr:$dst)]>; def ADD16mi : Ii16<0x81, MRM0m, (ops i16mem:$dst, i16imm:$src2), "add{w} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, + [(store (add (loadi16 addr:$dst), imm:$src2), addr:$dst)]>, OpSize; def ADD32mi : Ii32<0x81, MRM0m, (ops i32mem:$dst, i32imm:$src2), "add{l} {$src2, $dst|$dst, $src2}", - [(store (add (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; + [(store (add (loadi32 addr:$dst), imm:$src2), addr:$dst)]>; def ADD16mi8 : Ii8<0x83, MRM0m, (ops i16mem:$dst, i16i8imm :$src2), "add{w} {$src2, $dst|$dst, $src2}", [(store (add (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>, @@ -1380,14 +1380,14 @@ [(store (sub (load addr:$dst), R32:$src2), addr:$dst)]>; def SUB8mi : Ii8<0x80, MRM5m, (ops i8mem :$dst, i8imm:$src2), "sub{b} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), (i8 imm:$src2)), addr:$dst)]>; + [(store (sub (loadi8 addr:$dst), imm:$src2), addr:$dst)]>; def SUB16mi : Ii16<0x81, MRM5m, (ops i16mem:$dst, i16imm:$src2), "sub{w} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), (i16 imm:$src2)), addr:$dst)]>, + [(store (sub (loadi16 addr:$dst), imm:$src2), addr:$dst)]>, OpSize; def SUB32mi : Ii32<0x81, MRM5m, (ops i32mem:$dst, i32imm:$src2), "sub{l} {$src2, $dst|$dst, $src2}", - [(store (sub (load addr:$dst), (i32 imm:$src2)), addr:$dst)]>; + [(store (sub (loadi32 addr:$dst), imm:$src2), addr:$dst)]>; def SUB16mi8 : Ii8<0x83, MRM5m, (ops i16mem:$dst, i16i8imm :$src2), "sub{w} {$src2, $dst|$dst, $src2}", [(store (sub (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>, From natebegeman at mac.com Mon Dec 12 21:03:34 2005 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 12 Dec 2005 21:03:34 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512130303.VAA00903@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.227 -> 1.228 --- Log message: Lowering constant pool entries on ppc exposed a bug in the recently added ConstantVec legalizing code, which would return constantpool nodes that were not of the target's pointer type. --- Diffs of the changes: (+1 -1) LegalizeDAG.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.227 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.228 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.227 Mon Dec 12 16:27:43 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Dec 12 21:03:23 2005 @@ -714,7 +714,7 @@ cast(OpN)->getValue())); } Constant *CP = ConstantPacked::get(CV); - SDOperand CPIdx = DAG.getConstantPool(CP, Node->getValueType(0)); + SDOperand CPIdx = LegalizeOp(DAG.getConstantPool(CP, TLI.getPointerTy())); Result = DAG.getLoad(VT, DAG.getEntryNode(), CPIdx, DAG.getSrcValue(NULL)); break; } From lattner at cs.uiuc.edu Mon Dec 12 22:34:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 22:34:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200512130434.WAA01536@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.124 -> 1.125 --- Log message: reindent a loop, unswitch a loop. No functionality changes --- Diffs of the changes: (+109 -105) PPCAsmPrinter.cpp | 214 +++++++++++++++++++++++++++--------------------------- 1 files changed, 109 insertions(+), 105 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.124 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.125 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.124 Sun Dec 11 01:45:47 2005 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Mon Dec 12 22:33:58 2005 @@ -435,113 +435,116 @@ // Print out module-level global variables here. for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); - I != E; ++I) - if (I->hasInitializer()) { // External global require no code - // Check to see if this is a special global used by LLVM. - if (I->hasAppendingLinkage()) { - if (I->getName() == "llvm.used") - continue; // No need to emit this at all. - if (I->getName() == "llvm.global_ctors") { - SwitchSection(".mod_init_func", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } else if (I->getName() == "llvm.global_dtors") { - SwitchSection(".mod_term_func", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } + I != E; ++I) { + if (!I->hasInitializer()) continue; // External global require no code + + // Check to see if this is a special global used by LLVM. + if (I->hasAppendingLinkage()) { + if (I->getName() == "llvm.used") + continue; // No need to emit this at all. + if (I->getName() == "llvm.global_ctors") { + SwitchSection(".mod_init_func", 0); + EmitAlignment(2, 0); + EmitXXStructorList(I->getInitializer()); + continue; + } else if (I->getName() == "llvm.global_dtors") { + SwitchSection(".mod_term_func", 0); + EmitAlignment(2, 0); + EmitXXStructorList(I->getInitializer()); + continue; } - - O << '\n'; - std::string name = Mang->getValueName(I); - Constant *C = I->getInitializer(); - unsigned Size = TD.getTypeSize(C->getType()); - unsigned Align = TD.getTypeAlignmentShift(C->getType()); - - if (C->isNullValue() && /* FIXME: Verify correct */ - (I->hasInternalLinkage() || I->hasWeakLinkage() || - I->hasLinkOnceLinkage())) { + } + + O << '\n'; + std::string name = Mang->getValueName(I); + Constant *C = I->getInitializer(); + unsigned Size = TD.getTypeSize(C->getType()); + unsigned Align = TD.getTypeAlignmentShift(C->getType()); + + if (C->isNullValue() && /* FIXME: Verify correct */ + (I->hasInternalLinkage() || I->hasWeakLinkage() || + I->hasLinkOnceLinkage())) { + SwitchSection(".data", I); + if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. + if (I->hasInternalLinkage()) + O << LCOMMDirective << name << "," << Size << "," << Align; + else + O << ".comm " << name << "," << Size; + O << "\t\t; '" << I->getName() << "'\n"; + } else { + switch (I->getLinkage()) { + case GlobalValue::LinkOnceLinkage: + SwitchSection("", 0); + O << ".section __TEXT,__textcoal_nt,coalesced,no_toc\n" + << ".weak_definition " << name << '\n' + << ".private_extern " << name << '\n' + << ".section __DATA,__datacoal_nt,coalesced,no_toc\n"; + LinkOnceStubs.insert(name); + break; + case GlobalValue::WeakLinkage: + O << ".weak_definition " << name << '\n' + << ".private_extern " << name << '\n'; + break; + case GlobalValue::AppendingLinkage: + // FIXME: appending linkage variables should go into a section of + // their name or something. For now, just emit them as external. + case GlobalValue::ExternalLinkage: + // If external or appending, declare as a global symbol + O << "\t.globl " << name << "\n"; + // FALL THROUGH + case GlobalValue::InternalLinkage: SwitchSection(".data", I); - if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. - if (I->hasInternalLinkage()) - O << LCOMMDirective << name << "," << Size << "," << Align; - else - O << ".comm " << name << "," << Size; - O << "\t\t; '" << I->getName() << "'\n"; - } else { - switch (I->getLinkage()) { - case GlobalValue::LinkOnceLinkage: - SwitchSection("", 0); - O << ".section __TEXT,__textcoal_nt,coalesced,no_toc\n" - << ".weak_definition " << name << '\n' - << ".private_extern " << name << '\n' - << ".section __DATA,__datacoal_nt,coalesced,no_toc\n"; - LinkOnceStubs.insert(name); - break; - case GlobalValue::WeakLinkage: - O << ".weak_definition " << name << '\n' - << ".private_extern " << name << '\n'; - break; - case GlobalValue::AppendingLinkage: - // FIXME: appending linkage variables should go into a section of - // their name or something. For now, just emit them as external. - case GlobalValue::ExternalLinkage: - // If external or appending, declare as a global symbol - O << "\t.globl " << name << "\n"; - // FALL THROUGH - case GlobalValue::InternalLinkage: - SwitchSection(".data", I); - break; - default: - std::cerr << "Unknown linkage type!"; - abort(); - } - - EmitAlignment(Align, I); - O << name << ":\t\t\t\t; '" << I->getName() << "'\n"; - EmitGlobalConstant(C); + break; + default: + std::cerr << "Unknown linkage type!"; + abort(); } + + EmitAlignment(Align, I); + O << name << ":\t\t\t\t; '" << I->getName() << "'\n"; + EmitGlobalConstant(C); } + } // Output stubs for dynamically-linked functions - for (std::set::iterator i = FnStubs.begin(), e = FnStubs.end(); - i != e; ++i) - { - if (PICEnabled) { - O << ".data\n"; - O << ".section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32\n"; - EmitAlignment(2); - O << "L" << *i << "$stub:\n"; - O << "\t.indirect_symbol " << *i << "\n"; - O << "\tmflr r0\n"; - O << "\tbcl 20,31,L0$" << *i << "\n"; - O << "L0$" << *i << ":\n"; - O << "\tmflr r11\n"; - O << "\taddis r11,r11,ha16(L" << *i << "$lazy_ptr-L0$" << *i << ")\n"; - O << "\tmtlr r0\n"; - O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n"; - O << "\tmtctr r12\n"; - O << "\tbctr\n"; - O << ".data\n"; - O << ".lazy_symbol_pointer\n"; - O << "L" << *i << "$lazy_ptr:\n"; - O << "\t.indirect_symbol " << *i << "\n"; - O << "\t.long dyld_stub_binding_helper\n"; - } else { - O << "\t.section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16\n"; - EmitAlignment(4); - O << "L" << *i << "$stub:\n"; - O << "\t.indirect_symbol " << *i << "\n"; - O << "\tlis r11,ha16(L" << *i << "$lazy_ptr)\n"; - O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n"; - O << "\tmtctr r12\n"; - O << "\tbctr\n"; - O << "\t.lazy_symbol_pointer\n"; - O << "L" << *i << "$lazy_ptr:\n"; - O << "\t.indirect_symbol " << *i << "\n"; - O << "\t.long dyld_stub_binding_helper\n"; + if (PICEnabled) { + for (std::set::iterator i = FnStubs.begin(), e = FnStubs.end(); + i != e; ++i) { + O << ".data\n"; + O<<".section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32\n"; + EmitAlignment(2); + O << "L" << *i << "$stub:\n"; + O << "\t.indirect_symbol " << *i << "\n"; + O << "\tmflr r0\n"; + O << "\tbcl 20,31,L0$" << *i << "\n"; + O << "L0$" << *i << ":\n"; + O << "\tmflr r11\n"; + O << "\taddis r11,r11,ha16(L" << *i << "$lazy_ptr-L0$" << *i << ")\n"; + O << "\tmtlr r0\n"; + O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n"; + O << "\tmtctr r12\n"; + O << "\tbctr\n"; + O << ".data\n"; + O << ".lazy_symbol_pointer\n"; + O << "L" << *i << "$lazy_ptr:\n"; + O << "\t.indirect_symbol " << *i << "\n"; + O << "\t.long dyld_stub_binding_helper\n"; + } + } else { + for (std::set::iterator i = FnStubs.begin(), e = FnStubs.end(); + i != e; ++i) { + O<<"\t.section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16\n"; + EmitAlignment(4); + O << "L" << *i << "$stub:\n"; + O << "\t.indirect_symbol " << *i << "\n"; + O << "\tlis r11,ha16(L" << *i << "$lazy_ptr)\n"; + O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n"; + O << "\tmtctr r12\n"; + O << "\tbctr\n"; + O << "\t.lazy_symbol_pointer\n"; + O << "L" << *i << "$lazy_ptr:\n"; + O << "\t.indirect_symbol " << *i << "\n"; + O << "\t.long dyld_stub_binding_helper\n"; } } @@ -558,12 +561,13 @@ } // Output stubs for link-once variables - if (LinkOnceStubs.begin() != LinkOnceStubs.end()) + if (LinkOnceStubs.begin() != LinkOnceStubs.end()) { O << ".data\n.align 2\n"; - for (std::set::iterator i = LinkOnceStubs.begin(), + for (std::set::iterator i = LinkOnceStubs.begin(), e = LinkOnceStubs.end(); i != e; ++i) { - O << "L" << *i << "$non_lazy_ptr:\n" - << "\t.long\t" << *i << '\n'; + O << "L" << *i << "$non_lazy_ptr:\n" + << "\t.long\t" << *i << '\n'; + } } // Funny Darwin hack: This flag tells the linker that no global symbols From lattner at cs.uiuc.edu Mon Dec 12 22:54:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Dec 2005 22:54:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86AsmPrinter.cpp X86AsmPrinter.h Message-ID: <200512130454.WAA01657@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86AsmPrinter.cpp updated: 1.157 -> 1.158 X86AsmPrinter.h updated: 1.8 -> 1.9 --- Log message: Add ELF and darwin support for static ctors and dtors --- Diffs of the changes: (+40 -0) X86AsmPrinter.cpp | 39 +++++++++++++++++++++++++++++++++++++++ X86AsmPrinter.h | 1 + 2 files changed, 40 insertions(+) Index: llvm/lib/Target/X86/X86AsmPrinter.cpp diff -u llvm/lib/Target/X86/X86AsmPrinter.cpp:1.157 llvm/lib/Target/X86/X86AsmPrinter.cpp:1.158 --- llvm/lib/Target/X86/X86AsmPrinter.cpp:1.157 Mon Nov 21 17:06:54 2005 +++ llvm/lib/Target/X86/X86AsmPrinter.cpp Mon Dec 12 22:53:51 2005 @@ -18,6 +18,7 @@ #include "X86IntelAsmPrinter.h" #include "X86Subtarget.h" #include "X86.h" +#include "llvm/Constants.h" #include "llvm/Module.h" #include "llvm/Type.h" #include "llvm/Assembly/Writer.h" @@ -73,6 +74,21 @@ return AsmPrinter::doInitialization(M); } +/// EmitXXStructorList - Emit the ctor or dtor list. On darwin, this just +/// prints out the function pointers. +void X86SharedAsmPrinter::EmitXXStructorList(Constant *List) { + // Should be an array of '{ int, void ()* }' structs. The first value is the + // init priority, which we ignore. + if (!isa(List)) return; + ConstantArray *InitList = cast(List); + for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) + if (ConstantStruct *CS = dyn_cast(InitList->getOperand(i))){ + if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. + // Emit the function pointer. + EmitGlobalConstant(CS->getOperand(1)); + } +} + bool X86SharedAsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); @@ -81,6 +97,29 @@ E = M.global_end(); I != E; ++I) { if (!I->hasInitializer()) continue; // External global require no code + // Check to see if this is a special global used by LLVM. + if (I->hasAppendingLinkage()) { + if (I->getName() == "llvm.used") + continue; // No need to emit this at all. + if (I->getName() == "llvm.global_ctors") { + if (forDarwin) + SwitchSection(".mod_init_func", 0); + else + SwitchSection(".ctors,\"aw\", at progbits", 0); + EmitAlignment(2, 0); + EmitXXStructorList(I->getInitializer()); + continue; + } else if (I->getName() == "llvm.global_dtors") { + if (forDarwin) + SwitchSection(".mod_term_func", 0); + else + SwitchSection(".dtors,\"aw\", at progbits", 0); + EmitAlignment(2, 0); + EmitXXStructorList(I->getInitializer()); + continue; + } + } + O << "\n\n"; std::string name = Mang->getValueName(I); Constant *C = I->getInitializer(); Index: llvm/lib/Target/X86/X86AsmPrinter.h diff -u llvm/lib/Target/X86/X86AsmPrinter.h:1.8 llvm/lib/Target/X86/X86AsmPrinter.h:1.9 --- llvm/lib/Target/X86/X86AsmPrinter.h:1.8 Mon Nov 21 17:06:54 2005 +++ llvm/lib/Target/X86/X86AsmPrinter.h Mon Dec 12 22:53:51 2005 @@ -33,6 +33,7 @@ bool doInitialization(Module &M); bool doFinalization(Module &M); + void EmitXXStructorList(Constant *List); bool forDarwin; // FIXME: eliminate. From lattner at cs.uiuc.edu Tue Dec 13 00:31:52 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Dec 2005 00:31:52 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/AsmPrinter.h Message-ID: <200512130631.AAA02248@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: AsmPrinter.h updated: 1.22 -> 1.23 --- Log message: Add a couple more fields, move ctor init list to .cpp file, add support for emitting the ctor/dtor list for common targets. --- Diffs of the changes: (+26 -26) AsmPrinter.h | 52 ++++++++++++++++++++++++++-------------------------- 1 files changed, 26 insertions(+), 26 deletions(-) Index: llvm/include/llvm/CodeGen/AsmPrinter.h diff -u llvm/include/llvm/CodeGen/AsmPrinter.h:1.22 llvm/include/llvm/CodeGen/AsmPrinter.h:1.23 --- llvm/include/llvm/CodeGen/AsmPrinter.h:1.22 Mon Nov 21 17:06:08 2005 +++ llvm/include/llvm/CodeGen/AsmPrinter.h Tue Dec 13 00:31:41 2005 @@ -22,6 +22,7 @@ namespace llvm { class Constant; class Mangler; + class GlobalVariable; class AsmPrinter : public MachineFunctionPass { /// CurrentSection - The current section we are emitting to. This is @@ -134,6 +135,16 @@ /// before emitting the constant pool for a function. const char *ConstantPoolSection; // Defaults to "\t.section .rodata\n" + /// StaticCtorsSection - This is the directive that is emitted to switch to + /// a section to emit the static constructor list. + /// Defaults to "\t.section .ctors,\"aw\", at progbits". + const char *StaticCtorsSection; + + /// StaticDtorsSection - This is the directive that is emitted to switch to + /// a section to emit the static destructor list. + /// Defaults to "\t.section .dtors,\"aw\", at progbits". + const char *StaticDtorsSection; + //===--- Global Variable Emission Directives --------------------------===// /// LCOMMDirective - This is the name of a directive (if supported) that can @@ -152,32 +163,8 @@ /// directives, this is true for most ELF targets. bool HasDotTypeDotSizeDirective; // Defaults to true. - AsmPrinter(std::ostream &o, TargetMachine &tm) - : FunctionNumber(0), O(o), TM(tm), - CommentString("#"), - GlobalPrefix(""), - PrivateGlobalPrefix("."), - GlobalVarAddrPrefix(""), - GlobalVarAddrSuffix(""), - FunctionAddrPrefix(""), - FunctionAddrSuffix(""), - ZeroDirective("\t.zero\t"), - AsciiDirective("\t.ascii\t"), - AscizDirective("\t.asciz\t"), - Data8bitsDirective("\t.byte\t"), - Data16bitsDirective("\t.short\t"), - Data32bitsDirective("\t.long\t"), - Data64bitsDirective("\t.quad\t"), - AlignDirective("\t.align\t"), - AlignmentIsInBytes(true), - SwitchToSectionDirective("\t.section\t"), - ConstantPoolSection("\t.section .rodata\n"), - LCOMMDirective(0), - COMMDirective("\t.comm\t"), - COMMDirectiveTakesAlignment(true), - HasDotTypeDotSizeDirective(true) { - } - + AsmPrinter(std::ostream &o, TargetMachine &TM); + /// SwitchSection - Switch to the specified section of the executable if we /// are not already in it! If GV is non-null and if the global has an /// explicitly requested section, we switch to the section indicated for the @@ -210,8 +197,18 @@ /// is being processed from runOnMachineFunction. void SetupMachineFunction(MachineFunction &MF); + /// EmitConstantPool - Print to the current output stream assembly + /// representations of the constants in the constant pool MCP. This is + /// used to print out constants which have been "spilled to memory" by + /// the code generator. + /// void EmitConstantPool(MachineConstantPool *MCP); + /// EmitSpecialLLVMGlobal - Check to see if the specified global is a + /// special global used by LLVM. If so, emit it and return true, otherwise + /// do nothing and return false. + bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); + /// EmitAlignment - Emit an alignment directive to the specified power of /// two boundary. For example, if you pass in 3 here, you will get an 8 /// byte alignment. If a global value is specified, and if that global has @@ -229,6 +226,9 @@ /// EmitGlobalConstant - Print a general LLVM constant to the .s file. /// void EmitGlobalConstant(const Constant* CV); + + private: + void EmitXXStructorList(Constant *List); }; } From lattner at cs.uiuc.edu Tue Dec 13 00:32:22 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Dec 2005 00:32:22 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp Message-ID: <200512130632.AAA02287@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: AsmPrinter.cpp updated: 1.31 -> 1.32 --- Log message: Add a couple more fields, move ctor init list to .cpp file, add support for emitting the ctor/dtor list for common targets. --- Diffs of the changes: (+70 -0) AsmPrinter.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 70 insertions(+) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.31 llvm/lib/CodeGen/AsmPrinter.cpp:1.32 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.31 Fri Dec 9 13:28:49 2005 +++ llvm/lib/CodeGen/AsmPrinter.cpp Tue Dec 13 00:32:10 2005 @@ -21,6 +21,35 @@ #include "llvm/Target/TargetMachine.h" using namespace llvm; +AsmPrinter::AsmPrinter(std::ostream &o, TargetMachine &tm) +: FunctionNumber(0), O(o), TM(tm), + CommentString("#"), + GlobalPrefix(""), + PrivateGlobalPrefix("."), + GlobalVarAddrPrefix(""), + GlobalVarAddrSuffix(""), + FunctionAddrPrefix(""), + FunctionAddrSuffix(""), + ZeroDirective("\t.zero\t"), + AsciiDirective("\t.ascii\t"), + AscizDirective("\t.asciz\t"), + Data8bitsDirective("\t.byte\t"), + Data16bitsDirective("\t.short\t"), + Data32bitsDirective("\t.long\t"), + Data64bitsDirective("\t.quad\t"), + AlignDirective("\t.align\t"), + AlignmentIsInBytes(true), + SwitchToSectionDirective("\t.section\t"), + ConstantPoolSection("\t.section .rodata\n"), + StaticCtorsSection("\t.section .ctors,\"aw\", at progbits"), + StaticDtorsSection("\t.section .dtors,\"aw\", at progbits"), + LCOMMDirective(0), + COMMDirective("\t.comm\t"), + COMMDirectiveTakesAlignment(true), + HasDotTypeDotSizeDirective(true) { +} + + /// SwitchSection - Switch to the specified section of the executable if we /// are not already in it! /// @@ -80,6 +109,47 @@ } } +/// EmitSpecialLLVMGlobal - Check to see if the specified global is a +/// special global used by LLVM. If so, emit it and return true, otherwise +/// do nothing and return false. +bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { + assert(GV->hasInitializer() && GV->hasAppendingLinkage() && + "Not a special LLVM global!"); + + if (GV->getName() == "llvm.used") + return true; // No need to emit this at all. + + if (GV->getName() == "llvm.global_ctors") { + SwitchSection(StaticCtorsSection, 0); + EmitAlignment(2, 0); + EmitXXStructorList(GV->getInitializer()); + return true; + } + + if (GV->getName() == "llvm.global_dtors") { + SwitchSection(StaticDtorsSection, 0); + EmitAlignment(2, 0); + EmitXXStructorList(GV->getInitializer()); + return true; + } + + return false; +} + +/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the +/// function pointers, ignoring the init priority. +void AsmPrinter::EmitXXStructorList(Constant *List) { + // Should be an array of '{ int, void ()* }' structs. The first value is the + // init priority, which we ignore. + if (!isa(List)) return; + ConstantArray *InitList = cast(List); + for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) + if (ConstantStruct *CS = dyn_cast(InitList->getOperand(i))){ + if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. + // Emit the function pointer. + EmitGlobalConstant(CS->getOperand(1)); + } +} // EmitAlignment - Emit an alignment directive to the specified power of two. From lattner at cs.uiuc.edu Tue Dec 13 00:33:02 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Dec 2005 00:33:02 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200512130633.AAA02347@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.125 -> 1.126 --- Log message: Use the shared asmprinter code for printing special llvm globals --- Diffs of the changes: (+5 -33) PPCAsmPrinter.cpp | 38 +++++--------------------------------- 1 files changed, 5 insertions(+), 33 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.125 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.126 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.125 Mon Dec 12 22:33:58 2005 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Tue Dec 13 00:32:50 2005 @@ -198,14 +198,14 @@ AlignmentIsInBytes = false; // Alignment is by power of 2. ConstantPoolSection = "\t.const\t"; LCOMMDirective = "\t.lcomm\t"; + StaticCtorsSection = ".mod_init_func"; + StaticDtorsSection = ".mod_term_func"; } virtual const char *getPassName() const { return "Darwin PPC Assembly Printer"; } - void EmitXXStructorList(Constant *List); - bool runOnMachineFunction(MachineFunction &F); bool doInitialization(Module &M); bool doFinalization(Module &M); @@ -415,21 +415,6 @@ return false; } -/// EmitXXStructorList - Emit the ctor or dtor list. On darwin, this just -/// prints out the function pointers. -void DarwinAsmPrinter::EmitXXStructorList(Constant *List) { - // Should be an array of '{ int, void ()* }' structs. The first value is the - // init priority, which we ignore. - if (!isa(List)) return; - ConstantArray *InitList = cast(List); - for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) - if (ConstantStruct *CS = dyn_cast(InitList->getOperand(i))){ - if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. - // Emit the function pointer. - EmitGlobalConstant(CS->getOperand(1)); - } -} - bool DarwinAsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); @@ -438,22 +423,9 @@ I != E; ++I) { if (!I->hasInitializer()) continue; // External global require no code - // Check to see if this is a special global used by LLVM. - if (I->hasAppendingLinkage()) { - if (I->getName() == "llvm.used") - continue; // No need to emit this at all. - if (I->getName() == "llvm.global_ctors") { - SwitchSection(".mod_init_func", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } else if (I->getName() == "llvm.global_dtors") { - SwitchSection(".mod_term_func", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } - } + // Check to see if this is a special global used by LLVM, if so, emit it. + if (I->hasAppendingLinkage() && EmitSpecialLLVMGlobal(I)) + continue; O << '\n'; std::string name = Mang->getValueName(I); From lattner at cs.uiuc.edu Tue Dec 13 00:33:02 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Dec 2005 00:33:02 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86AsmPrinter.cpp X86AsmPrinter.h Message-ID: <200512130633.AAA02353@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86AsmPrinter.cpp updated: 1.158 -> 1.159 X86AsmPrinter.h updated: 1.9 -> 1.10 --- Log message: Use the shared asmprinter code for printing special llvm globals --- Diffs of the changes: (+5 -38) X86AsmPrinter.cpp | 42 +++++------------------------------------- X86AsmPrinter.h | 1 - 2 files changed, 5 insertions(+), 38 deletions(-) Index: llvm/lib/Target/X86/X86AsmPrinter.cpp diff -u llvm/lib/Target/X86/X86AsmPrinter.cpp:1.158 llvm/lib/Target/X86/X86AsmPrinter.cpp:1.159 --- llvm/lib/Target/X86/X86AsmPrinter.cpp:1.158 Mon Dec 12 22:53:51 2005 +++ llvm/lib/Target/X86/X86AsmPrinter.cpp Tue Dec 13 00:32:50 2005 @@ -58,6 +58,8 @@ COMMDirectiveTakesAlignment = false; HasDotTypeDotSizeDirective = false; forDarwin = true; + StaticCtorsSection = ".mod_init_func"; + StaticDtorsSection = ".mod_term_func"; break; case X86Subtarget::isCygwin: GlobalPrefix = "_"; @@ -74,21 +76,6 @@ return AsmPrinter::doInitialization(M); } -/// EmitXXStructorList - Emit the ctor or dtor list. On darwin, this just -/// prints out the function pointers. -void X86SharedAsmPrinter::EmitXXStructorList(Constant *List) { - // Should be an array of '{ int, void ()* }' structs. The first value is the - // init priority, which we ignore. - if (!isa(List)) return; - ConstantArray *InitList = cast(List); - for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) - if (ConstantStruct *CS = dyn_cast(InitList->getOperand(i))){ - if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. - // Emit the function pointer. - EmitGlobalConstant(CS->getOperand(1)); - } -} - bool X86SharedAsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); @@ -97,28 +84,9 @@ E = M.global_end(); I != E; ++I) { if (!I->hasInitializer()) continue; // External global require no code - // Check to see if this is a special global used by LLVM. - if (I->hasAppendingLinkage()) { - if (I->getName() == "llvm.used") - continue; // No need to emit this at all. - if (I->getName() == "llvm.global_ctors") { - if (forDarwin) - SwitchSection(".mod_init_func", 0); - else - SwitchSection(".ctors,\"aw\", at progbits", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } else if (I->getName() == "llvm.global_dtors") { - if (forDarwin) - SwitchSection(".mod_term_func", 0); - else - SwitchSection(".dtors,\"aw\", at progbits", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } - } + // Check to see if this is a special global used by LLVM, if so, emit it. + if (I->hasAppendingLinkage() && EmitSpecialLLVMGlobal(I)) + continue; O << "\n\n"; std::string name = Mang->getValueName(I); Index: llvm/lib/Target/X86/X86AsmPrinter.h diff -u llvm/lib/Target/X86/X86AsmPrinter.h:1.9 llvm/lib/Target/X86/X86AsmPrinter.h:1.10 --- llvm/lib/Target/X86/X86AsmPrinter.h:1.9 Mon Dec 12 22:53:51 2005 +++ llvm/lib/Target/X86/X86AsmPrinter.h Tue Dec 13 00:32:50 2005 @@ -33,7 +33,6 @@ bool doInitialization(Module &M); bool doFinalization(Module &M); - void EmitXXStructorList(Constant *List); bool forDarwin; // FIXME: eliminate. From evan.cheng at apple.com Tue Dec 13 01:24:34 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 13 Dec 2005 01:24:34 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512130724.BAA02639@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.164 -> 1.165 --- Log message: Add load + store folding srl and sra patterns. --- Diffs of the changes: (+32 -12) X86InstrInfo.td | 44 ++++++++++++++++++++++++++++++++------------ 1 files changed, 32 insertions(+), 12 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.164 llvm/lib/Target/X86/X86InstrInfo.td:1.165 --- llvm/lib/Target/X86/X86InstrInfo.td:1.164 Mon Dec 12 20:40:18 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Dec 13 01:24:22 2005 @@ -1062,17 +1062,27 @@ let isTwoAddress = 0 in { def SHR8mCL : I<0xD2, MRM5m, (ops i8mem :$dst), - "shr{b} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>; + "shr{b} {%cl, $dst|$dst, %CL}", + [(store (srl (loadi8 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>; def SHR16mCL : I<0xD3, MRM5m, (ops i16mem:$dst), - "shr{w} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>, OpSize; + "shr{w} {%cl, $dst|$dst, %CL}", + [(store (srl (loadi16 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>, OpSize; def SHR32mCL : I<0xD3, MRM5m, (ops i32mem:$dst), - "shr{l} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>; + "shr{l} {%cl, $dst|$dst, %CL}", + [(store (srl (loadi32 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>; def SHR8mi : Ii8<0xC0, MRM5m, (ops i8mem :$dst, i8imm:$src), - "shr{b} {$src, $dst|$dst, $src}", []>; + "shr{b} {$src, $dst|$dst, $src}", + [(store (srl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>; def SHR16mi : Ii8<0xC1, MRM5m, (ops i16mem:$dst, i8imm:$src), - "shr{w} {$src, $dst|$dst, $src}", []>, OpSize; + "shr{w} {$src, $dst|$dst, $src}", + [(store (srl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>, + OpSize; def SHR32mi : Ii8<0xC1, MRM5m, (ops i32mem:$dst, i8imm:$src), - "shr{l} {$src, $dst|$dst, $src}", []>; + "shr{l} {$src, $dst|$dst, $src}", + [(store (srl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>; } def SAR8rCL : I<0xD2, MRM7r, (ops R8 :$dst, R8 :$src), @@ -1097,17 +1107,27 @@ [(set R32:$dst, (sra R32:$src1, (i8 imm:$src2)))]>; let isTwoAddress = 0 in { def SAR8mCL : I<0xD2, MRM7m, (ops i8mem :$dst), - "sar{b} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>; + "sar{b} {%cl, $dst|$dst, %CL}", + [(store (sra (loadi8 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>; def SAR16mCL : I<0xD3, MRM7m, (ops i16mem:$dst), - "sar{w} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>, OpSize; + "sar{w} {%cl, $dst|$dst, %CL}", + [(store (sra (loadi16 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>, OpSize; def SAR32mCL : I<0xD3, MRM7m, (ops i32mem:$dst), - "sar{l} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>; + "sar{l} {%cl, $dst|$dst, %CL}", + [(store (sra (loadi32 addr:$dst), CL), addr:$dst)]>, + Imp<[CL],[]>; def SAR8mi : Ii8<0xC0, MRM7m, (ops i8mem :$dst, i8imm:$src), - "sar{b} {$src, $dst|$dst, $src}", []>; + "sar{b} {$src, $dst|$dst, $src}", + [(store (sra (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>; def SAR16mi : Ii8<0xC1, MRM7m, (ops i16mem:$dst, i8imm:$src), - "sar{w} {$src, $dst|$dst, $src}", []>, OpSize; + "sar{w} {$src, $dst|$dst, $src}", + [(store (sra (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>, + OpSize; def SAR32mi : Ii8<0xC1, MRM7m, (ops i32mem:$dst, i8imm:$src), - "sar{l} {$src, $dst|$dst, $src}", []>; + "sar{l} {$src, $dst|$dst, $src}", + [(store (sra (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>; } // Rotate instructions From lattner at cs.uiuc.edu Tue Dec 13 11:40:45 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Dec 2005 11:40:45 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200512131740.LAA13473@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.115 -> 1.116 --- Log message: Don't lump the filename and working dir together --- Diffs of the changes: (+16 -15) SelectionDAGISel.cpp | 31 ++++++++++++++++--------------- 1 files changed, 16 insertions(+), 15 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.115 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.116 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.115 Mon Dec 12 16:51:16 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Dec 13 11:40:33 2005 @@ -895,23 +895,13 @@ getValue(I.getOperand(2)))); return 0; - case Intrinsic::dbg_stoppoint: - { + case Intrinsic::dbg_stoppoint: { if (TLI.getTargetMachine().getIntrinsicLowering().EmitDebugFunctions()) return "llvm_debugger_stop"; std::string fname = ""; std::vector Ops; - // Pull the filename out of the the compilation unit. - const GlobalVariable *cunit = dyn_cast(I.getOperand(4)); - if (cunit && cunit->hasInitializer()) { - ConstantStruct *CS = dyn_cast(cunit->getInitializer()); - if (CS->getNumOperands() > 0) { - std::string dirname = getStringValue(CS->getOperand(4)); - fname = dirname + "/" + getStringValue(CS->getOperand(3)); - } - } // Input Chain Ops.push_back(getRoot()); @@ -921,10 +911,21 @@ // column Ops.push_back(getValue(I.getOperand(3))); - // filename - Ops.push_back(DAG.getString(fname)); - Ops.push_back(DAG.getString("")); - DAG.setRoot(DAG.getNode(ISD::LOCATION, MVT::Other, Ops)); + // filename/working dir + // Pull the filename out of the the compilation unit. + const GlobalVariable *cunit = dyn_cast(I.getOperand(4)); + if (cunit && cunit->hasInitializer()) { + if (ConstantStruct *CS = + dyn_cast(cunit->getInitializer())) { + if (CS->getNumOperands() > 0) { + Ops.push_back(DAG.getString(getStringValue(CS->getOperand(4)))); + Ops.push_back(DAG.getString(getStringValue(CS->getOperand(3)))); + } + } + } + + if (Ops.size() == 5) // Found filename/workingdir. + DAG.setRoot(DAG.getNode(ISD::LOCATION, MVT::Other, Ops)); setValue(&I, DAG.getNode(ISD::UNDEF, TLI.getValueType(I.getType()))); return 0; } From reid at x10sys.com Tue Dec 13 13:57:02 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 13 Dec 2005 13:57:02 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/FunctionResolution.cpp Message-ID: <200512131957.NAA14100@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: FunctionResolution.cpp updated: 1.57 -> 1.58 --- Log message: Improve ResolveFunctions to: a) use better local variable names (OldMT -> OldFT) where "M" is used to mean "Function" (perhaps it was previously "Method"?) b) print out the module identifier in a warning message so that it is possible to track down in which module the error occurred. --- Diffs of the changes: (+15 -13) FunctionResolution.cpp | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) Index: llvm/lib/Transforms/IPO/FunctionResolution.cpp diff -u llvm/lib/Transforms/IPO/FunctionResolution.cpp:1.57 llvm/lib/Transforms/IPO/FunctionResolution.cpp:1.58 --- llvm/lib/Transforms/IPO/FunctionResolution.cpp:1.57 Thu Apr 21 18:39:37 2005 +++ llvm/lib/Transforms/IPO/FunctionResolution.cpp Tue Dec 13 13:56:51 2005 @@ -55,11 +55,11 @@ for (unsigned i = 0; i != Globals.size(); ++i) if (Globals[i] != Concrete) { Function *Old = cast(Globals[i]); - const FunctionType *OldMT = Old->getFunctionType(); - const FunctionType *ConcreteMT = Concrete->getFunctionType(); + const FunctionType *OldFT = Old->getFunctionType(); + const FunctionType *ConcreteFT = Concrete->getFunctionType(); - if (OldMT->getNumParams() > ConcreteMT->getNumParams() && - !ConcreteMT->isVarArg()) + if (OldFT->getNumParams() > ConcreteFT->getNumParams() && + !ConcreteFT->isVarArg()) if (!Old->use_empty()) { std::cerr << "WARNING: Linking function '" << Old->getName() << "' is causing arguments to be dropped.\n"; @@ -73,20 +73,22 @@ // Check to make sure that if there are specified types, that they // match... // - unsigned NumArguments = std::min(OldMT->getNumParams(), - ConcreteMT->getNumParams()); + unsigned NumArguments = std::min(OldFT->getNumParams(), + ConcreteFT->getNumParams()); if (!Old->use_empty() && !Concrete->use_empty()) for (unsigned i = 0; i < NumArguments; ++i) - if (OldMT->getParamType(i) != ConcreteMT->getParamType(i)) - if (OldMT->getParamType(i)->getTypeID() != - ConcreteMT->getParamType(i)->getTypeID()) { + if (OldFT->getParamType(i) != ConcreteFT->getParamType(i)) + if (OldFT->getParamType(i)->getTypeID() != + ConcreteFT->getParamType(i)->getTypeID()) { std::cerr << "WARNING: Function [" << Old->getName() << "]: Parameter types conflict for: '"; - WriteTypeSymbolic(std::cerr, OldMT, &M); - std::cerr << "' and '"; - WriteTypeSymbolic(std::cerr, ConcreteMT, &M); - std::cerr << "'\n"; + WriteTypeSymbolic(std::cerr, OldFT, &M); + std::cerr << "' (in " + << Old->getParent()->getModuleIdentifier() << ") and '"; + WriteTypeSymbolic(std::cerr, ConcreteFT, &M); + std::cerr << "'(in " + << Concrete->getParent()->getModuleIdentifier() << ")\n"; return Changed; } From reid at x10sys.com Tue Dec 13 14:00:50 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 13 Dec 2005 14:00:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Linker/Linker.cpp Message-ID: <200512132000.OAA14174@zion.cs.uiuc.edu> Changes in directory llvm/lib/Linker: Linker.cpp updated: 1.7 -> 1.8 --- Log message: Adjust the constructor to the Linker class to take an argument that names the module being constructed. This is used to correctly name the module. Previously the name of the linker tool was used which produces confusing output when the module identifier is used in an error message. --- Diffs of the changes: (+2 -2) Linker.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Linker/Linker.cpp diff -u llvm/lib/Linker/Linker.cpp:1.7 llvm/lib/Linker/Linker.cpp:1.8 --- llvm/lib/Linker/Linker.cpp:1.7 Thu Jul 7 18:21:43 2005 +++ llvm/lib/Linker/Linker.cpp Tue Dec 13 14:00:37 2005 @@ -19,14 +19,14 @@ using namespace llvm; -Linker::Linker(const std::string& progname, unsigned flags) +Linker::Linker(const std::string& progname, const std::string& modname, unsigned flags) : Composite(0) , LibPaths() , Flags(flags) , Error() , ProgramName(progname) { - Composite = new Module(progname); + Composite = new Module(modname); } Linker::Linker(const std::string& progname, Module* aModule, unsigned flags) From reid at x10sys.com Tue Dec 13 14:00:50 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 13 Dec 2005 14:00:50 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-ld/llvm-ld.cpp Message-ID: <200512132000.OAA14176@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-ld: llvm-ld.cpp updated: 1.26 -> 1.27 --- Log message: Adjust the constructor to the Linker class to take an argument that names the module being constructed. This is used to correctly name the module. Previously the name of the linker tool was used which produces confusing output when the module identifier is used in an error message. --- Diffs of the changes: (+1 -1) llvm-ld.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/llvm-ld/llvm-ld.cpp diff -u llvm/tools/llvm-ld/llvm-ld.cpp:1.26 llvm/tools/llvm-ld/llvm-ld.cpp:1.27 --- llvm/tools/llvm-ld/llvm-ld.cpp:1.26 Thu Jul 7 22:08:58 2005 +++ llvm/tools/llvm-ld/llvm-ld.cpp Tue Dec 13 14:00:37 2005 @@ -400,7 +400,7 @@ try { // Initial global variable above for convenience printing of program name. progname = sys::Path(argv[0]).getBasename(); - Linker TheLinker(progname, Verbose); + Linker TheLinker(progname, OutputFilename, Verbose); // Set up the library paths for the Linker TheLinker.addPaths(LibPaths); From reid at x10sys.com Tue Dec 13 14:00:50 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 13 Dec 2005 14:00:50 -0600 Subject: [llvm-commits] CVS: llvm/tools/gccld/gccld.cpp Message-ID: <200512132000.OAA14182@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: gccld.cpp updated: 1.104 -> 1.105 --- Log message: Adjust the constructor to the Linker class to take an argument that names the module being constructed. This is used to correctly name the module. Previously the name of the linker tool was used which produces confusing output when the module identifier is used in an error message. --- Diffs of the changes: (+5 -1) gccld.cpp | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/tools/gccld/gccld.cpp diff -u llvm/tools/gccld/gccld.cpp:1.104 llvm/tools/gccld/gccld.cpp:1.105 --- llvm/tools/gccld/gccld.cpp:1.104 Thu Nov 17 10:08:04 2005 +++ llvm/tools/gccld/gccld.cpp Tue Dec 13 14:00:37 2005 @@ -107,6 +107,10 @@ CO5("eh-frame-hdr", cl::Hidden, cl::desc("Compatibility option: ignored")); cl::opt CO6("h", cl::Hidden, cl::desc("Compatibility option: ignored")); + cl::opt + CO7("start-group", cl::Hidden, cl::desc("Compatibility option: ignored")); + cl::opt + CO8("end-group", cl::Hidden, cl::desc("Compatibility option: ignored")); cl::alias A0("s", cl::desc("Alias for --strip-all"), cl::aliasopt(Strip)); @@ -211,7 +215,7 @@ int exitCode = 0; std::string ProgName = sys::Path(argv[0]).getBasename(); - Linker TheLinker(ProgName, Verbose); + Linker TheLinker(ProgName, OutputFilename, Verbose); try { // Remove any consecutive duplicates of the same library... From reid at x10sys.com Tue Dec 13 14:00:50 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 13 Dec 2005 14:00:50 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Linker.h Message-ID: <200512132000.OAA14186@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Linker.h updated: 1.15 -> 1.16 --- Log message: Adjust the constructor to the Linker class to take an argument that names the module being constructed. This is used to correctly name the module. Previously the name of the linker tool was used which produces confusing output when the module identifier is used in an error message. --- Diffs of the changes: (+5 -1) Linker.h | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/include/llvm/Linker.h diff -u llvm/include/llvm/Linker.h:1.15 llvm/include/llvm/Linker.h:1.16 --- llvm/include/llvm/Linker.h:1.15 Thu Apr 21 15:11:51 2005 +++ llvm/include/llvm/Linker.h Tue Dec 13 14:00:37 2005 @@ -62,7 +62,11 @@ /// Construct the Linker with an empty module which will be given the /// name \p progname. \p progname will also be used for error messages. /// @brief Construct with empty module - Linker(const std::string& progname, unsigned Flags = 0 ); + Linker( + const std::string& progname, ///< name of tool running linker + const std::string& modulename, ///< name of linker's end-result module + unsigned Flags = 0 ///< ControlFlags (one or more |'d together) + ); /// Construct the Linker with a previously defined module, \p aModule. Use /// \p progname for the name of the program in error messages. From natebegeman at mac.com Tue Dec 13 16:55:33 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 13 Dec 2005 16:55:33 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512132255.QAA15381@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.20 -> 1.21 --- Log message: Prepare support for AltiVec multiply, divide, and sqrt. --- Diffs of the changes: (+3 -0) TargetSelectionDAG.td | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.20 llvm/lib/Target/TargetSelectionDAG.td:1.21 --- llvm/lib/Target/TargetSelectionDAG.td:1.20 Sun Dec 11 12:43:13 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Tue Dec 13 16:55:21 2005 @@ -82,6 +82,9 @@ def SDTFPBinOp : SDTypeProfile<1, 2, [ // fadd, fmul, etc. SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisFP<0> ]>; +def SDTFPTernaryOp : SDTypeProfile<1, 3, [ // fmadd, fnmsub, etc. + SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>, SDTCisFP<0> +]>; def SDTIntUnaryOp : SDTypeProfile<1, 1, [ // ctlz SDTCisSameAs<0, 1>, SDTCisInt<0> ]>; From natebegeman at mac.com Tue Dec 13 16:55:34 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 13 Dec 2005 16:55:34 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.h PPCInstrInfo.td Message-ID: <200512132255.QAA15387@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.h updated: 1.11 -> 1.12 PPCInstrInfo.td updated: 1.155 -> 1.156 --- Log message: Prepare support for AltiVec multiply, divide, and sqrt. --- Diffs of the changes: (+16 -2) PPCISelLowering.h | 4 ++++ PPCInstrInfo.td | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.h diff -u llvm/lib/Target/PowerPC/PPCISelLowering.h:1.11 llvm/lib/Target/PowerPC/PPCISelLowering.h:1.12 --- llvm/lib/Target/PowerPC/PPCISelLowering.h:1.11 Mon Dec 5 20:10:38 2005 +++ llvm/lib/Target/PowerPC/PPCISelLowering.h Tue Dec 13 16:55:21 2005 @@ -39,6 +39,10 @@ /// of that FP value. FCTIDZ, FCTIWZ, + // VMADDFP, VNMSUBFP - The VMADDFP and VNMSUBFP instructions, taking + // three v4f32 operands and producing a v4f32 result. + VMADDFP, VNMSUBFP, + /// Hi/Lo - These represent the high and low 16-bit parts of a global /// address respectively. These nodes have two operands, the first of /// which must be a TargetGlobalAddress, and the second of which must be a Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.155 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.156 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.155 Sun Dec 11 01:45:47 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Tue Dec 13 16:55:22 2005 @@ -27,8 +27,10 @@ SDTypeProfile<1, 3, [SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>, SDTCisFP<0>, SDTCisVT<1, f64>]>, []>; -def PPChi : SDNode<"PPCISD::Hi", SDTIntBinOp, []>; -def PPClo : SDNode<"PPCISD::Lo", SDTIntBinOp, []>; +def PPChi : SDNode<"PPCISD::Hi", SDTIntBinOp, []>; +def PPClo : SDNode<"PPCISD::Lo", SDTIntBinOp, []>; +def PPCvmaddfp : SDNode<"PPCISD::VMADDFP", SDTFPTernaryOp, []>; +def PPCvnmsubfp : SDNode<"PPCISD::VNMSUBFP", SDTFPTernaryOp, []>; // These nodes represent the 32-bit PPC shifts that operate on 6-bit shift // amounts. These nodes are generated by the multi-precision shift code. @@ -949,6 +951,14 @@ def : Pat<(add GPRC:$in, (PPChi tconstpool:$g, 0)), (ADDIS GPRC:$in, tconstpool:$g)>; +// Fused multiply add and multiply sub for packed float. These are represented +// separately from the real instructions above, for operations that must have +// the additional precision, such as Newton-Rhapson (used by divide, sqrt) +def : Pat<(PPCvmaddfp VRRC:$A, VRRC:$B, VRRC:$C), + (VMADDFP VRRC:$A, VRRC:$B, VRRC:$C)>; +def : Pat<(PPCvnmsubfp VRRC:$A, VRRC:$B, VRRC:$C), + (VNMSUBFP VRRC:$A, VRRC:$B, VRRC:$C)>; + // Standard shifts. These are represented separately from the real shifts above // so that we can distinguish between shifts that allow 5-bit and 6-bit shift // amounts. From natebegeman at mac.com Tue Dec 13 18:34:22 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 13 Dec 2005 18:34:22 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrFormats.td PPCInstrInfo.td Message-ID: <200512140034.SAA16250@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrFormats.td updated: 1.61 -> 1.62 PPCInstrInfo.td updated: 1.156 -> 1.157 --- Log message: Add support for fmul node of type v4f32. void %foo(<4 x float> * %a) { entry: %tmp1 = load <4 x float> * %a; %tmp2 = mul <4 x float> %tmp1, %tmp1 store <4 x float> %tmp2, <4 x float> *%a ret void } Is selected to: _foo: li r2, 0 lvx v0, r2, r3 vxor v1, v1, v1 vmaddfp v0, v0, v0, v1 stvx v0, r2, r3 blr --- Diffs of the changes: (+21 -0) PPCInstrFormats.td | 8 ++++++++ PPCInstrInfo.td | 13 +++++++++++++ 2 files changed, 21 insertions(+) Index: llvm/lib/Target/PowerPC/PPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.61 llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.62 --- llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.61 Fri Dec 9 17:54:17 2005 +++ llvm/lib/Target/PowerPC/PPCInstrFormats.td Tue Dec 13 18:34:09 2005 @@ -602,6 +602,14 @@ let Inst{21-31} = xo; } +class VXForm_setzero xo, dag OL, string asmstr, + InstrItinClass itin, list pattern> + : VXForm_1 { + let VA = VD; + let VB = VD; +} + + class VXForm_2 xo, dag OL, string asmstr, InstrItinClass itin, list pattern> : I<4, OL, asmstr, itin> { Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.156 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.157 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.156 Tue Dec 13 16:55:22 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Tue Dec 13 18:34:09 2005 @@ -897,6 +897,16 @@ def VSUBFP : VXForm_1<74, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB), "vsubfp $vD, $vA, $vB", VecFP, [(set VRRC:$vD, (fsub VRRC:$vA, VRRC:$vB))]>; +def VXOR : VXForm_1<1220, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB), + "vxor $vD, $vA, $vB", VecFP, + []>; + +// VX-Form Pseudo Instructions + +def V_SET0 : VXForm_setzero<1220, (ops VRRC:$vD), + "vxor $vD, $vD, $vD", VecFP, + []>; + //===----------------------------------------------------------------------===// // PowerPC Instruction Patterns @@ -951,6 +961,9 @@ def : Pat<(add GPRC:$in, (PPChi tconstpool:$g, 0)), (ADDIS GPRC:$in, tconstpool:$g)>; +def : Pat<(fmul VRRC:$vA, VRRC:$vB), + (VMADDFP VRRC:$vA, (V_SET0), VRRC:$vB)>; + // Fused multiply add and multiply sub for packed float. These are represented // separately from the real instructions above, for operations that must have // the additional precision, such as Newton-Rhapson (used by divide, sqrt) From evan.cheng at apple.com Tue Dec 13 20:19:34 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 13 Dec 2005 20:19:34 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200512140219.UAA16739@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.64 -> 1.65 --- Log message: Fold (zext (load x) to (zextload x). --- Diffs of the changes: (+18 -1) DAGCombiner.cpp | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.64 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.65 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.64 Wed Dec 7 12:02:05 2005 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Dec 13 20:19:23 2005 @@ -1552,7 +1552,7 @@ TLI.isOperationLegal(ISD::SIGN_EXTEND_INREG, N0.getValueType()))) return DAG.getNode(ISD::SIGN_EXTEND_INREG, VT, N0.getOperand(0), DAG.getValueType(N0.getValueType())); - // fold (sext (load x)) -> (sextload x) + // fold (sext (load x)) -> (sext (truncate (sextload x))) if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), @@ -1576,6 +1576,23 @@ // fold (zext (zext x)) -> (zext x) if (N0.getOpcode() == ISD::ZERO_EXTEND) return DAG.getNode(ISD::ZERO_EXTEND, VT, N0.getOperand(0)); + // fold (zext (zextload x)) -> (zextload x) + if (N0.getOpcode() == ISD::ZEXTLOAD && VT == N0.getValueType()) + return N0; + // fold (zext (truncate x)) -> (zextinreg x) iff x size == zext size. + if (N0.getOpcode() == ISD::TRUNCATE && N0.getOperand(0).getValueType() == VT&& + !AfterLegalize) + return DAG.getZeroExtendInReg(N0.getOperand(0), VT); + // fold (zext (load x)) -> (zext (truncate (zextload x))) + if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { + SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), + N0.getOperand(1), N0.getOperand(2), + N0.getValueType()); + WorkList.push_back(N); + CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), + ExtLoad.getValue(1)); + return SDOperand(); + } return SDOperand(); } From evan.cheng at apple.com Tue Dec 13 20:21:12 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 13 Dec 2005 20:21:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512140221.UAA16768@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.21 -> 1.22 --- Log message: Added sextld + zextld DAG nodes. --- Diffs of the changes: (+17 -0) TargetSelectionDAG.td | 17 +++++++++++++++++ 1 files changed, 17 insertions(+) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.21 llvm/lib/Target/TargetSelectionDAG.td:1.22 --- llvm/lib/Target/TargetSelectionDAG.td:1.21 Tue Dec 13 16:55:21 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Tue Dec 13 20:21:01 2005 @@ -150,6 +150,12 @@ SDTCisPtrTy<1> ]>; +def SDTIntExtLoad : SDTypeProfile<1, 3, [ // sextload, zextload + SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT>, + SDTCisVTSmallerThanOp<3, 0> +]>; + + //===----------------------------------------------------------------------===// // Selection DAG Node Properties. // @@ -173,6 +179,7 @@ def set; def node; +def srcvalue; def imm : SDNode<"ISD::Constant" , SDTIntLeaf , [], "ConstantSDNode">; def vt : SDNode<"ISD::VALUETYPE" , SDTOther , [], "VTSDNode">; @@ -245,6 +252,11 @@ def load : SDNode<"ISD::LOAD" , SDTLoad, [SDNPHasChain]>; def store : SDNode<"ISD::STORE" , SDTStore, [SDNPHasChain]>; +// Do not use sextld and zextld directly. Use sextload and zextload (see +// below) which pass in a dummy srcvalue node which tblgen will skip over. +def sextld : SDNode<"ISD::SEXTLOAD" , SDTIntExtLoad, [SDNPHasChain]>; +def zextld : SDNode<"ISD::ZEXTLOAD" , SDTIntExtLoad, [SDNPHasChain]>; + //===----------------------------------------------------------------------===// // Selection DAG Condition Codes @@ -311,6 +323,11 @@ def not : PatFrag<(ops node:$in), (xor node:$in, immAllOnes)>; def ineg : PatFrag<(ops node:$in), (sub 0, node:$in)>; +// extending load fragments. +def sextload : PatFrag<(ops node:$ptr, node:$vt), + (sextld node:$ptr, srcvalue:$dummy, node:$vt)>; +def zextload : PatFrag<(ops node:$ptr, node:$vt), + (zextld node:$ptr, srcvalue:$dummy, node:$vt)>; // setcc convenience fragments. def setoeq : PatFrag<(ops node:$lhs, node:$rhs), From evan.cheng at apple.com Tue Dec 13 20:22:09 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 13 Dec 2005 20:22:09 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512140222.UAA16781@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.97 -> 1.98 --- Log message: Skip over srcvalue nodes when generating ISEL code. --- Diffs of the changes: (+7 -1) DAGISelEmitter.cpp | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.97 llvm/utils/TableGen/DAGISelEmitter.cpp:1.98 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.97 Mon Dec 12 17:45:21 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Dec 13 20:21:57 2005 @@ -485,7 +485,7 @@ return MVT::Other; } else if (R->isSubClassOf("ComplexPattern")) { return TP.getDAGISelEmitter().getComplexPattern(R).getValueType(); - } else if (R->getName() == "node") { + } else if (R->getName() == "node" || R->getName() == "srcvalue") { // Placeholder. return MVT::isUnknown; } @@ -973,6 +973,10 @@ Rec = Pat->getOperator(); } + // SRCVALUE nodes are ignored. + if (Rec->getName() == "srcvalue") + return false; + TreePatternNode *&Slot = InstInputs[Pat->getName()]; if (!Slot) { Slot = Pat; @@ -1832,6 +1836,8 @@ } } else if (LeafRec->isSubClassOf("ComplexPattern")) { // Handle complex pattern. Nothing to do here. + } else if (LeafRec->getName() == "srcvalue") { + // Place holder for SRCVALUE nodes. Nothing to do here. } else if (LeafRec->isSubClassOf("ValueType")) { // Make sure this is the specified value type. OS << " if (cast(" << RootName << OpNo << ")->getVT() != " From evan.cheng at apple.com Tue Dec 13 20:22:39 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 13 Dec 2005 20:22:39 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512140222.UAA16795@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.165 -> 1.166 --- Log message: Added sext and zext patterns. --- Diffs of the changes: (+34 -9) X86InstrInfo.td | 43 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 34 insertions(+), 9 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.165 llvm/lib/Target/X86/X86InstrInfo.td:1.166 --- llvm/lib/Target/X86/X86InstrInfo.td:1.165 Tue Dec 13 01:24:22 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Dec 13 20:22:27 2005 @@ -162,9 +162,22 @@ }]>; // Helper fragments for loads. -def loadi8 : PatFrag<(ops node:$in), (i8 (load node:$in))>; -def loadi16 : PatFrag<(ops node:$in), (i16 (load node:$in))>; -def loadi32 : PatFrag<(ops node:$in), (i32 (load node:$in))>; +def loadi8 : PatFrag<(ops node:$ptr), (i8 (load node:$ptr))>; +def loadi16 : PatFrag<(ops node:$ptr), (i16 (load node:$ptr))>; +def loadi32 : PatFrag<(ops node:$ptr), (i32 (load node:$ptr))>; + +def sextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (sextload node:$ptr, i1))>; +def sextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i1))>; +def sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextload node:$ptr, i8))>; +def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i8))>; +def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i16))>; + +def zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextload node:$ptr, i1))>; +def zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i1))>; +def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextload node:$ptr, i8))>; +def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i8))>; +def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i16))>; + //===----------------------------------------------------------------------===// // Instruction templates... @@ -1663,33 +1676,45 @@ "movs{bw|x} {$src, $dst|$dst, $src}", [(set R16:$dst, (sext R8:$src))]>, TB, OpSize; def MOVSX16rm8 : I<0xBE, MRMSrcMem, (ops R16:$dst, i8mem :$src), - "movs{bw|x} {$src, $dst|$dst, $src}", []>, TB, OpSize; + "movs{bw|x} {$src, $dst|$dst, $src}", + [(set R16:$dst, (sextloadi16i8 addr:$src))]>, TB, OpSize; def MOVSX32rr8 : I<0xBE, MRMSrcReg, (ops R32:$dst, R8 :$src), "movs{bl|x} {$src, $dst|$dst, $src}", [(set R32:$dst, (sext R8:$src))]>, TB; def MOVSX32rm8 : I<0xBE, MRMSrcMem, (ops R32:$dst, i8mem :$src), - "movs{bl|x} {$src, $dst|$dst, $src}", []>, TB; + "movs{bl|x} {$src, $dst|$dst, $src}", + [(set R32:$dst, (sextloadi32i8 addr:$src))]>, TB; def MOVSX32rr16: I<0xBF, MRMSrcReg, (ops R32:$dst, R16:$src), "movs{wl|x} {$src, $dst|$dst, $src}", [(set R32:$dst, (sext R16:$src))]>, TB; def MOVSX32rm16: I<0xBF, MRMSrcMem, (ops R32:$dst, i16mem:$src), - "movs{wl|x} {$src, $dst|$dst, $src}", []>, TB; + "movs{wl|x} {$src, $dst|$dst, $src}", + [(set R32:$dst, (sextloadi32i16 addr:$src))]>, TB; def MOVZX16rr8 : I<0xB6, MRMSrcReg, (ops R16:$dst, R8 :$src), "movz{bw|x} {$src, $dst|$dst, $src}", [(set R16:$dst, (zext R8:$src))]>, TB, OpSize; def MOVZX16rm8 : I<0xB6, MRMSrcMem, (ops R16:$dst, i8mem :$src), - "movz{bw|x} {$src, $dst|$dst, $src}", []>, TB, OpSize; + "movz{bw|x} {$src, $dst|$dst, $src}", + [(set R16:$dst, (zextloadi16i8 addr:$src))]>, TB, OpSize; def MOVZX32rr8 : I<0xB6, MRMSrcReg, (ops R32:$dst, R8 :$src), "movz{bl|x} {$src, $dst|$dst, $src}", [(set R32:$dst, (zext R8:$src))]>, TB; def MOVZX32rm8 : I<0xB6, MRMSrcMem, (ops R32:$dst, i8mem :$src), - "movz{bl|x} {$src, $dst|$dst, $src}", []>, TB; + "movz{bl|x} {$src, $dst|$dst, $src}", + [(set R32:$dst, (zextloadi32i8 addr:$src))]>, TB; def MOVZX32rr16: I<0xB7, MRMSrcReg, (ops R32:$dst, R16:$src), "movz{wl|x} {$src, $dst|$dst, $src}", [(set R32:$dst, (zext R16:$src))]>, TB; def MOVZX32rm16: I<0xB7, MRMSrcMem, (ops R32:$dst, i16mem:$src), - "movz{wl|x} {$src, $dst|$dst, $src}", []>, TB; + "movz{wl|x} {$src, $dst|$dst, $src}", + [(set R32:$dst, (zextloadi32i16 addr:$src))]>, TB; + +// Handling 1 bit zextload and sextload +def : Pat<(sextloadi16i1 addr:$src), (MOVSX16rm8 addr:$src)>; +def : Pat<(sextloadi32i1 addr:$src), (MOVSX32rm8 addr:$src)>; +def : Pat<(zextloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>; +def : Pat<(zextloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>; //===----------------------------------------------------------------------===// // XMM Floating point support (requires SSE2) From lattner at cs.uiuc.edu Wed Dec 14 01:58:50 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Dec 2005 01:58:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200512140758.BAA19194@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.65 -> 1.66 --- Log message: Fix a miscompilation in crafty due to a recent patch --- Diffs of the changes: (+1 -1) DAGCombiner.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.65 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.66 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.65 Tue Dec 13 20:19:23 2005 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Dec 14 01:58:38 2005 @@ -1582,7 +1582,7 @@ // fold (zext (truncate x)) -> (zextinreg x) iff x size == zext size. if (N0.getOpcode() == ISD::TRUNCATE && N0.getOperand(0).getValueType() == VT&& !AfterLegalize) - return DAG.getZeroExtendInReg(N0.getOperand(0), VT); + return DAG.getZeroExtendInReg(N0.getOperand(0), N0.getValueType()); // fold (zext (load x)) -> (zext (truncate (zextload x))) if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), From lattner at cs.uiuc.edu Wed Dec 14 11:23:32 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Dec 2005 11:23:32 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll Message-ID: <200512141723.LAA28940@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/ScalarRepl: 2005-12-14-UnionPromoteCrash.ll added (r1.1) --- Log message: new (undefined) testcase, distilled from 126.gcc that scalarrepl crashes on --- Diffs of the changes: (+34 -0) 2005-12-14-UnionPromoteCrash.ll | 34 ++++++++++++++++++++++++++++++++++ 1 files changed, 34 insertions(+) Index: llvm/test/Regression/Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll diff -c /dev/null llvm/test/Regression/Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll:1.1 *** /dev/null Wed Dec 14 11:23:30 2005 --- llvm/test/Regression/Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll Wed Dec 14 11:23:20 2005 *************** *** 0 **** --- 1,34 ---- + ; RUN: llvm-as < %s | opt -scalarrepl -disable-output + target endian = big + target pointersize = 32 + %struct.rtx_def = type { [2 x ubyte], int, [1 x %union.rtunion_def] } + %union.rtunion_def = type { uint } + + implementation ; Functions: + + void %find_reloads() { + entry: + %c_addr.i = alloca sbyte ; [#uses=1] + switch uint 0, label %return [ + uint 36, label %label.7 + uint 34, label %label.7 + uint 41, label %label.5 + ] + + label.5: ; preds = %entry + ret void + + label.7: ; preds = %entry, %entry + br bool false, label %then.4, label %switchexit.0 + + then.4: ; preds = %label.7 + %tmp.0.i = cast sbyte* %c_addr.i to int* ; [#uses=1] + store int 44, int* %tmp.0.i + ret void + + switchexit.0: ; preds = %label.7 + ret void + + return: ; preds = %entry + ret void + } From lattner at cs.uiuc.edu Wed Dec 14 11:24:10 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Dec 2005 11:24:10 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp Message-ID: <200512141724.LAA28975@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: ScalarReplAggregates.cpp updated: 1.33 -> 1.34 --- Log message: Fix Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll, a crash on undefined behavior in 126.gcc on big-endian systems. --- Diffs of the changes: (+2 -2) ScalarReplAggregates.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp diff -u llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.33 llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.34 --- llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.33 Mon Dec 12 01:19:13 2005 +++ llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp Wed Dec 14 11:23:59 2005 @@ -539,7 +539,7 @@ if (LoadInst *LI = dyn_cast(User)) { // The load is a bit extract from NewAI shifted right by Offset bits. Value *NV = new LoadInst(NewAI, LI->getName(), LI); - if (Offset) + if (Offset && Offset < NV->getType()->getPrimitiveSizeInBits()) NV = new ShiftInst(Instruction::Shr, NV, ConstantUInt::get(Type::UByteTy, Offset), LI->getName(), LI); @@ -563,7 +563,7 @@ SV = new CastInst(SV, SV->getType()->getUnsignedVersion(), SV->getName(), SI); SV = new CastInst(SV, Old->getType(), SV->getName(), SI); - if (Offset) + if (Offset && Offset < SV->getType()->getPrimitiveSizeInBits()) SV = new ShiftInst(Instruction::Shl, SV, ConstantUInt::get(Type::UByteTy, Offset), SV->getName()+".adj", SI); From lattner at cs.uiuc.edu Wed Dec 14 13:05:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Dec 2005 13:05:17 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200512141905.NAA01957@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.66 -> 1.67 --- Log message: Fix the (zext (zextload)) case to trigger, similarly for sign extends. Allow (zext (truncate)) to apply after legalize if the target supports AND (which all do). This compiles short %foo() { %tmp.0 = load ubyte* %X ; [#uses=1] %tmp.3 = cast ubyte %tmp.0 to short ; [#uses=1] ret short %tmp.3 } to: _foo: movzbl _X, %eax ret instead of: _foo: movzbl _X, %eax movzbl %al, %eax ret thanks to Evan for pointing this out. --- Diffs of the changes: (+28 -7) DAGCombiner.cpp | 35 ++++++++++++++++++++++++++++------- 1 files changed, 28 insertions(+), 7 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.66 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.67 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.66 Wed Dec 14 01:58:38 2005 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Dec 14 13:05:06 2005 @@ -1543,9 +1543,6 @@ // fold (sext (sext x)) -> (sext x) if (N0.getOpcode() == ISD::SIGN_EXTEND) return DAG.getNode(ISD::SIGN_EXTEND, VT, N0.getOperand(0)); - // fold (sext (sextload x)) -> (sextload x) - if (N0.getOpcode() == ISD::SEXTLOAD && VT == N0.getValueType()) - return N0; // fold (sext (truncate x)) -> (sextinreg x) iff x size == sext size. if (N0.getOpcode() == ISD::TRUNCATE && N0.getOperand(0).getValueType() == VT&& (!AfterLegalize || @@ -1562,6 +1559,20 @@ ExtLoad.getValue(1)); return SDOperand(); } + + // fold (sext (sextload x)) -> (sext (truncate (sextload x))) + // fold (sext ( extload x)) -> (sext (truncate (sextload x))) + if ((N0.getOpcode() == ISD::SEXTLOAD || N0.getOpcode() == ISD::EXTLOAD) && + N0.hasOneUse()) { + SDOperand ExtLoad = DAG.getNode(ISD::SEXTLOAD, VT, N0.getOperand(0), + N0.getOperand(1), N0.getOperand(2), + N0.getOperand(3)); + WorkList.push_back(N); + CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), + ExtLoad.getValue(1)); + return SDOperand(); + } + return SDOperand(); } @@ -1576,12 +1587,9 @@ // fold (zext (zext x)) -> (zext x) if (N0.getOpcode() == ISD::ZERO_EXTEND) return DAG.getNode(ISD::ZERO_EXTEND, VT, N0.getOperand(0)); - // fold (zext (zextload x)) -> (zextload x) - if (N0.getOpcode() == ISD::ZEXTLOAD && VT == N0.getValueType()) - return N0; // fold (zext (truncate x)) -> (zextinreg x) iff x size == zext size. if (N0.getOpcode() == ISD::TRUNCATE && N0.getOperand(0).getValueType() == VT&& - !AfterLegalize) + (!AfterLegalize || TLI.isOperationLegal(ISD::AND, N0.getValueType()))) return DAG.getZeroExtendInReg(N0.getOperand(0), N0.getValueType()); // fold (zext (load x)) -> (zext (truncate (zextload x))) if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { @@ -1593,6 +1601,19 @@ ExtLoad.getValue(1)); return SDOperand(); } + + // fold (zext (zextload x)) -> (zext (truncate (zextload x))) + // fold (zext ( extload x)) -> (zext (truncate (zextload x))) + if ((N0.getOpcode() == ISD::ZEXTLOAD || N0.getOpcode() == ISD::EXTLOAD) && + N0.hasOneUse()) { + SDOperand ExtLoad = DAG.getNode(ISD::ZEXTLOAD, VT, N0.getOperand(0), + N0.getOperand(1), N0.getOperand(2), + N0.getOperand(3)); + WorkList.push_back(N); + CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), + ExtLoad.getValue(1)); + return SDOperand(); + } return SDOperand(); } From reid at x10sys.com Wed Dec 14 13:09:03 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 14 Dec 2005 13:09:03 -0600 Subject: [llvm-commits] CVS: llvm/tools/gccld/gccld.cpp Message-ID: <200512141909.NAA01969@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: gccld.cpp updated: 1.105 -> 1.106 --- Log message: Remove -start-group and -end-group no-op options, accidentally committed in last patch. --- Diffs of the changes: (+0 -5) gccld.cpp | 5 ----- 1 files changed, 5 deletions(-) Index: llvm/tools/gccld/gccld.cpp diff -u llvm/tools/gccld/gccld.cpp:1.105 llvm/tools/gccld/gccld.cpp:1.106 --- llvm/tools/gccld/gccld.cpp:1.105 Tue Dec 13 14:00:37 2005 +++ llvm/tools/gccld/gccld.cpp Wed Dec 14 13:08:51 2005 @@ -107,11 +107,6 @@ CO5("eh-frame-hdr", cl::Hidden, cl::desc("Compatibility option: ignored")); cl::opt CO6("h", cl::Hidden, cl::desc("Compatibility option: ignored")); - cl::opt - CO7("start-group", cl::Hidden, cl::desc("Compatibility option: ignored")); - cl::opt - CO8("end-group", cl::Hidden, cl::desc("Compatibility option: ignored")); - cl::alias A0("s", cl::desc("Alias for --strip-all"), cl::aliasopt(Strip)); cl::alias A1("S", cl::desc("Alias for --strip-debug"), From lattner at cs.uiuc.edu Wed Dec 14 13:24:19 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Dec 2005 13:24:19 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/X86/extend.ll Message-ID: <200512141924.NAA02097@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/X86: extend.ll added (r1.1) --- Log message: new testcase, each function should have one extension instr in it --- Diffs of the changes: (+19 -0) extend.ll | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) Index: llvm/test/Regression/CodeGen/X86/extend.ll diff -c /dev/null llvm/test/Regression/CodeGen/X86/extend.ll:1.1 *** /dev/null Wed Dec 14 13:24:18 2005 --- llvm/test/Regression/CodeGen/X86/extend.ll Wed Dec 14 13:24:08 2005 *************** *** 0 **** --- 1,19 ---- + ; RUN: llvm-as < %s | llc -march=x86 -x86-asm-syntax=intel | grep movzx | wc -l | grep 1 + ; RUN: llvm-as < %s | llc -march=x86 -x86-asm-syntax=intel | grep movsx | wc -l | grep 1 + + %G1 = internal global ubyte 0 ; [#uses=1] + %G2 = internal global sbyte 0 ; [#uses=1] + + implementation ; Functions: + + short %test1() { ;; one zext + %tmp.0 = load ubyte* %G1 ; [#uses=1] + %tmp.3 = cast ubyte %tmp.0 to short ; [#uses=1] + ret short %tmp.3 + } + + short %test2() { ;; one sext + %tmp.0 = load sbyte* %G2 ; [#uses=1] + %tmp.3 = cast sbyte %tmp.0 to short ; [#uses=1] + ret short %tmp.3 + } From lattner at cs.uiuc.edu Wed Dec 14 13:25:41 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Dec 2005 13:25:41 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200512141925.NAA02167@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.67 -> 1.68 --- Log message: When folding loads into ops, immediately replace uses of the op with the load. This reduces number of worklist iterations and avoid missing optimizations depending on folding of things into sext_inreg nodes (which aren't supported by all targets). Tested by Regression/CodeGen/X86/extend.ll:test2 --- Diffs of the changes: (+6 -6) DAGCombiner.cpp | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.67 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.68 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.67 Wed Dec 14 13:05:06 2005 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Dec 14 13:25:30 2005 @@ -1554,7 +1554,7 @@ SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), N0.getValueType()); - WorkList.push_back(N); + CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), ExtLoad.getValue(1)); return SDOperand(); @@ -1567,7 +1567,7 @@ SDOperand ExtLoad = DAG.getNode(ISD::SEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), N0.getOperand(3)); - WorkList.push_back(N); + CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), ExtLoad.getValue(1)); return SDOperand(); @@ -1596,7 +1596,7 @@ SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), N0.getValueType()); - WorkList.push_back(N); + CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), ExtLoad.getValue(1)); return SDOperand(); @@ -1609,7 +1609,7 @@ SDOperand ExtLoad = DAG.getNode(ISD::ZEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), N0.getOperand(3)); - WorkList.push_back(N); + CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), ExtLoad.getValue(1)); return SDOperand(); @@ -1673,7 +1673,7 @@ SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), EVT); - WorkList.push_back(N); + CombineTo(N, ExtLoad); CombineTo(N0.Val, ExtLoad, ExtLoad.getValue(1)); return SDOperand(); } @@ -1684,7 +1684,7 @@ SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), EVT); - WorkList.push_back(N); + CombineTo(N, ExtLoad); CombineTo(N0.Val, ExtLoad, ExtLoad.getValue(1)); return SDOperand(); } From evan.cheng at apple.com Wed Dec 14 13:41:06 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Dec 2005 13:41:06 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512141941.NAA02256@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.22 -> 1.23 --- Log message: Fixed extload type profile. The 4th operand is a ValueType node with type OtherVT, it cannot be compare to type of 1st operand which is an integer type. --- Diffs of the changes: (+1 -2) TargetSelectionDAG.td | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.22 llvm/lib/Target/TargetSelectionDAG.td:1.23 --- llvm/lib/Target/TargetSelectionDAG.td:1.22 Tue Dec 13 20:21:01 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Wed Dec 14 13:40:54 2005 @@ -151,8 +151,7 @@ ]>; def SDTIntExtLoad : SDTypeProfile<1, 3, [ // sextload, zextload - SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT>, - SDTCisVTSmallerThanOp<3, 0> + SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT> ]>; From lattner at cs.uiuc.edu Wed Dec 14 16:01:18 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Dec 2005 16:01:18 -0600 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/Miscompilation.cpp Message-ID: <200512142201.QAA23357@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: Miscompilation.cpp updated: 1.73 -> 1.74 --- Log message: Fix printing of the instructions. --- Diffs of the changes: (+1 -1) Miscompilation.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/bugpoint/Miscompilation.cpp diff -u llvm/tools/bugpoint/Miscompilation.cpp:1.73 llvm/tools/bugpoint/Miscompilation.cpp:1.74 --- llvm/tools/bugpoint/Miscompilation.cpp:1.73 Tue Dec 6 14:51:30 2005 +++ llvm/tools/bugpoint/Miscompilation.cpp Wed Dec 14 16:01:07 2005 @@ -862,7 +862,7 @@ std::cout << " gcc " << SharedObject << " " << TestModuleBC << ".s -o " << TestModuleBC << ".exe"; #if defined (HAVE_LINK_R) - std::cout << "-Wl,-R."; + std::cout << " -Wl,-R."; #endif std::cout << "\n"; std::cout << " " << TestModuleBC << ".exe"; From evan.cheng at apple.com Wed Dec 14 16:03:10 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Dec 2005 16:03:10 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Target.td TargetSelectionDAG.td Message-ID: <200512142203.QAA23422@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: Target.td updated: 1.64 -> 1.65 TargetSelectionDAG.td updated: 1.23 -> 1.24 --- Log message: Added support to specify predicates. --- Diffs of the changes: (+17 -2) Target.td | 14 ++++++++++++++ TargetSelectionDAG.td | 5 +++-- 2 files changed, 17 insertions(+), 2 deletions(-) Index: llvm/lib/Target/Target.td diff -u llvm/lib/Target/Target.td:1.64 llvm/lib/Target/Target.td:1.65 --- llvm/lib/Target/Target.td:1.64 Sun Dec 4 02:13:17 2005 +++ llvm/lib/Target/Target.td Wed Dec 14 16:02:59 2005 @@ -127,6 +127,7 @@ // include "../TargetSchedule.td" +class Predicate; // Forward def //===----------------------------------------------------------------------===// // Instruction set description - These classes correspond to the C++ classes in @@ -149,6 +150,10 @@ list Uses = []; // Default to using no non-operand registers list Defs = []; // Default to modifying no non-operand registers + // Predicates - List of predicates which will be turned into isel matching + // code. + list Predicates = []; + // These bits capture information about the high-level semantics of the // instruction. bit isReturn = 0; // Is this instruction a return instruction? @@ -168,6 +173,15 @@ InstrItinClass Itinerary; // Execution steps used for scheduling. } +/// Predicates - These are extra conditionals which are turned into instruction +/// selector matching code. Currently each predicate is just a string. +class Predicate { + string CondString = cond; +} + +class Requires preds> { + list Predicates = preds; +} /// ops definition - This is just a simple marker used to identify the operands /// list for an instruction. This should be used like this: Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.23 llvm/lib/Target/TargetSelectionDAG.td:1.24 --- llvm/lib/Target/TargetSelectionDAG.td:1.23 Wed Dec 14 13:40:54 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Wed Dec 14 16:02:59 2005 @@ -382,8 +382,9 @@ // class Pattern resultInstrs> { - dag PatternToMatch = patternToMatch; - list ResultInstrs = resultInstrs; + dag PatternToMatch = patternToMatch; + list ResultInstrs = resultInstrs; + list Predicates = []; // See class Instruction in Target.td. } // Pat - A simple (but common) form of a pattern, which produces a simple result From evan.cheng at apple.com Wed Dec 14 16:03:11 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Dec 2005 16:03:11 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp DAGISelEmitter.h Message-ID: <200512142203.QAA23428@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.98 -> 1.99 DAGISelEmitter.h updated: 1.44 -> 1.45 --- Log message: Added support to specify predicates. --- Diffs of the changes: (+89 -40) DAGISelEmitter.cpp | 111 ++++++++++++++++++++++++++++++++++------------------- DAGISelEmitter.h | 18 +++++++- 2 files changed, 89 insertions(+), 40 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.98 llvm/utils/TableGen/DAGISelEmitter.cpp:1.99 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.98 Tue Dec 13 20:21:57 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Dec 14 16:02:59 2005 @@ -1300,11 +1300,13 @@ if (!SrcPattern->canPatternMatch(Reason, *this)) I->error("Instruction can never match: " + Reason); + Record *Instr = II->first; TreePatternNode *DstPattern = TheInst.getResultPattern(); - PatternsToMatch.push_back(std::make_pair(SrcPattern, DstPattern)); + PatternsToMatch. + push_back(PatternToMatch(Instr->getValueAsListInit("Predicates"), + SrcPattern, DstPattern)); if (PatternHasCtrlDep(Pattern, *this)) { - Record *Instr = II->first; CodeGenInstruction &InstInfo = Target.getInstruction(Instr->getName()); InstInfo.hasCtrlDep = true; } @@ -1356,8 +1358,10 @@ if (!Pattern->getOnlyTree()->canPatternMatch(Reason, *this)) Pattern->error("Pattern can never match: " + Reason); - PatternsToMatch.push_back(std::make_pair(Pattern->getOnlyTree(), - Result->getOnlyTree())); + PatternsToMatch. + push_back(PatternToMatch(Patterns[i]->getValueAsListInit("Predicates"), + Pattern->getOnlyTree(), + Result->getOnlyTree())); } } @@ -1565,7 +1569,7 @@ // for (unsigned i = 0, e = PatternsToMatch.size(); i != e; ++i) { std::vector Variants; - GenerateVariantsOf(PatternsToMatch[i].first, Variants, *this); + GenerateVariantsOf(PatternsToMatch[i].getSrcPattern(), Variants, *this); assert(!Variants.empty() && "Must create at least original variant!"); Variants.erase(Variants.begin()); // Remove the original pattern. @@ -1574,7 +1578,7 @@ continue; DEBUG(std::cerr << "FOUND VARIANTS OF: "; - PatternsToMatch[i].first->dump(); + PatternsToMatch[i].getSrcPattern()->dump(); std::cerr << "\n"); for (unsigned v = 0, e = Variants.size(); v != e; ++v) { @@ -1588,7 +1592,7 @@ bool AlreadyExists = false; for (unsigned p = 0, e = PatternsToMatch.size(); p != e; ++p) { // Check to see if this variant already exists. - if (Variant->isIsomorphicTo(PatternsToMatch[p].first)) { + if (Variant->isIsomorphicTo(PatternsToMatch[p].getSrcPattern())) { DEBUG(std::cerr << " *** ALREADY EXISTS, ignoring variant.\n"); AlreadyExists = true; break; @@ -1598,8 +1602,9 @@ if (AlreadyExists) continue; // Otherwise, add it to the list of patterns we have. - PatternsToMatch.push_back(std::make_pair(Variant, - PatternsToMatch[i].second)); + PatternsToMatch. + push_back(PatternToMatch(PatternsToMatch[i].getPredicates(), + Variant, PatternsToMatch[i].getDstPattern())); } DEBUG(std::cerr << "\n"); @@ -1685,15 +1690,16 @@ PatternSortingPredicate(DAGISelEmitter &ise) : ISE(ise) {}; DAGISelEmitter &ISE; - bool operator()(DAGISelEmitter::PatternToMatch *LHS, - DAGISelEmitter::PatternToMatch *RHS) { - unsigned LHSSize = getPatternSize(LHS->first, ISE); - unsigned RHSSize = getPatternSize(RHS->first, ISE); + bool operator()(PatternToMatch *LHS, + PatternToMatch *RHS) { + unsigned LHSSize = getPatternSize(LHS->getSrcPattern(), ISE); + unsigned RHSSize = getPatternSize(RHS->getSrcPattern(), ISE); if (LHSSize > RHSSize) return true; // LHS -> bigger -> less cost if (LHSSize < RHSSize) return false; // If the patterns have equal complexity, compare generated instruction cost - return getResultPatternCost(LHS->second) second); + return getResultPatternCost(LHS->getDstPattern()) < + getResultPatternCost(RHS->getDstPattern()); } }; @@ -1725,8 +1731,12 @@ private: DAGISelEmitter &ISE; - // LHS of the pattern being matched - TreePatternNode *LHS; + // Predicates. + ListInit *Predicates; + // Instruction selector pattern. + TreePatternNode *Pattern; + // Matched instruction. + TreePatternNode *Instruction; unsigned PatternNo; std::ostream &OS; // Node to name mapping @@ -1738,16 +1748,39 @@ unsigned TmpNo; public: - PatternCodeEmitter(DAGISelEmitter &ise, TreePatternNode *lhs, + PatternCodeEmitter(DAGISelEmitter &ise, ListInit *preds, + TreePatternNode *pattern, TreePatternNode *instr, unsigned PatNum, std::ostream &os) : - ISE(ise), LHS(lhs), PatternNo(PatNum), OS(os), - FoundChain(false), InFlag(false), TmpNo(0) {}; + ISE(ise), Predicates(preds), Pattern(pattern), Instruction(instr), + PatternNo(PatNum), OS(os), FoundChain(false), InFlag(false), TmpNo(0) {}; /// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo /// if the match fails. At this point, we already know that the opcode for N /// matches, and the SDNode for the result has the RootName specified name. void EmitMatchCode(TreePatternNode *N, const std::string &RootName, bool isRoot = false) { + + // Emit instruction predicates. Each predicate is just a string for now. + if (isRoot) { + for (unsigned i = 0, e = Predicates->getSize(); i != e; ++i) { + if (DefInit *Pred = dynamic_cast(Predicates->getElement(i))) { + Record *Def = Pred->getDef(); + if (Def->isSubClassOf("Predicate")) { + if (i == 0) + OS << " if ("; + else + OS << " && "; + OS << "(" << Def->getValueAsString("CondString") << ")"; + if (i == e-1) + OS << ") goto P" << PatternNo << "Fail;\n"; + } else { + Def->dump(); + assert(0 && "Unknown predicate type!"); + } + } + } + } + if (N->isLeaf()) { if (IntInit *II = dynamic_cast(N->getLeafValue())) { OS << " if (cast(" << RootName @@ -1998,7 +2031,7 @@ // Emit all the chain and CopyToReg stuff. if (II.hasCtrlDep) OS << " Chain = Select(Chain);\n"; - EmitCopyToRegs(LHS, "N", II.hasCtrlDep); + EmitCopyToRegs(Pattern, "N", II.hasCtrlDep); const DAGInstruction &Inst = ISE.getInstruction(Op); unsigned NumResults = Inst.getNumResults(); @@ -2035,7 +2068,7 @@ OS << " CodeGenMap[N.getValue(0)] = Result;\n"; } OS << " Chain "; - if (NodeHasChain(LHS, ISE)) + if (NodeHasChain(Pattern, ISE)) OS << "= CodeGenMap[N.getValue(" << NumResults << ")] "; for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) OS << "= CodeGenMap[" << FoldedChains[j] << ".getValue(" @@ -2071,9 +2104,7 @@ return std::make_pair(1, ResNo); } else if (Op->isSubClassOf("SDNodeXForm")) { assert(N->getNumChildren() == 1 && "node xform should have one child!"); - unsigned OpVal = EmitResultCode(N->getChild(0)) - .second; - + unsigned OpVal = EmitResultCode(N->getChild(0)).second; unsigned ResNo = TmpNo++; OS << " SDOperand Tmp" << ResNo << " = Transform_" << Op->getName() << "(Tmp" << OpVal << ".Val);\n"; @@ -2161,17 +2192,21 @@ static unsigned PatternCount = 0; unsigned PatternNo = PatternCount++; OS << " { // Pattern #" << PatternNo << ": "; - Pattern.first->print(OS); + Pattern.getSrcPattern()->print(OS); OS << "\n // Emits: "; - Pattern.second->print(OS); + Pattern.getDstPattern()->print(OS); OS << "\n"; - OS << " // Pattern complexity = " << getPatternSize(Pattern.first, *this) - << " cost = " << getResultPatternCost(Pattern.second) << "\n"; - - PatternCodeEmitter Emitter(*this, Pattern.first, PatternNo, OS); + OS << " // Pattern complexity = " + << getPatternSize(Pattern.getSrcPattern(), *this) + << " cost = " + << getResultPatternCost(Pattern.getDstPattern()) << "\n"; + + PatternCodeEmitter Emitter(*this, Pattern.getPredicates(), + Pattern.getSrcPattern(), Pattern.getDstPattern(), + PatternNo, OS); // Emit the matcher, capturing named arguments in VariableMap. - Emitter.EmitMatchCode(Pattern.first, "N", true /*the root*/); + Emitter.EmitMatchCode(Pattern.getSrcPattern(), "N", true /*the root*/); // TP - Get *SOME* tree pattern, we don't care which. TreePattern &TP = *PatternFragments.begin()->second; @@ -2188,7 +2223,7 @@ // apply the type to the tree, then rerun type inference. Iterate until all // types are resolved. // - TreePatternNode *Pat = Pattern.first->clone(); + TreePatternNode *Pat = Pattern.getSrcPattern()->clone(); RemoveAllTypes(Pat); do { @@ -2206,9 +2241,9 @@ // Insert a check for an unresolved type and add it to the tree. If we find // an unresolved type to add a check for, this returns true and we iterate, // otherwise we are done. - } while (Emitter.InsertOneTypeCheck(Pat, Pattern.first, "N")); + } while (Emitter.InsertOneTypeCheck(Pat, Pattern.getSrcPattern(), "N")); - Emitter.EmitResultCode(Pattern.second, true /*the root*/); + Emitter.EmitResultCode(Pattern.getDstPattern(), true /*the root*/); delete Pat; @@ -2286,7 +2321,7 @@ std::map, CompareByRecordName> PatternsByOpcode; for (unsigned i = 0, e = PatternsToMatch.size(); i != e; ++i) { - TreePatternNode *Node = PatternsToMatch[i].first; + TreePatternNode *Node = PatternsToMatch[i].getSrcPattern(); if (!Node->isLeaf()) { PatternsByOpcode[Node->getOperator()].push_back(&PatternsToMatch[i]); } else { @@ -2304,7 +2339,7 @@ std::cerr << "Unrecognized opcode '"; Node->dump(); std::cerr << "' on tree pattern '"; - std::cerr << PatternsToMatch[i].second->getOperator()->getName(); + std::cerr << PatternsToMatch[i].getDstPattern()->getOperator()->getName(); std::cerr << "'!\n"; exit(1); } @@ -2366,8 +2401,8 @@ DEBUG(std::cerr << "\n\nALL PATTERNS TO MATCH:\n\n"; for (unsigned i = 0, e = PatternsToMatch.size(); i != e; ++i) { - std::cerr << "PATTERN: "; PatternsToMatch[i].first->dump(); - std::cerr << "\nRESULT: ";PatternsToMatch[i].second->dump(); + std::cerr << "PATTERN: "; PatternsToMatch[i].getSrcPattern()->dump(); + std::cerr << "\nRESULT: ";PatternsToMatch[i].getDstPattern()->dump(); std::cerr << "\n"; }); Index: llvm/utils/TableGen/DAGISelEmitter.h diff -u llvm/utils/TableGen/DAGISelEmitter.h:1.44 llvm/utils/TableGen/DAGISelEmitter.h:1.45 --- llvm/utils/TableGen/DAGISelEmitter.h:1.44 Fri Dec 9 16:57:42 2005 +++ llvm/utils/TableGen/DAGISelEmitter.h Wed Dec 14 16:02:59 2005 @@ -353,13 +353,27 @@ TreePatternNode *getResultPattern() const { return ResultPattern; } }; - +/// PatternToMatch - Used by DAGISelEmitter to keep tab of patterns processed +/// to produce isel. +struct PatternToMatch { + PatternToMatch(ListInit *preds, TreePatternNode *src, TreePatternNode *dst): + Predicates(preds), SrcPattern(src), DstPattern(dst) {}; + + ListInit *Predicates; // Top level predicate conditions to match. + TreePatternNode *SrcPattern; // Source pattern to match. + TreePatternNode *DstPattern; // Resulting pattern. + + ListInit *getPredicates() const { return Predicates; } + TreePatternNode *getSrcPattern() const { return SrcPattern; } + TreePatternNode *getDstPattern() const { return DstPattern; } +}; + /// InstrSelectorEmitter - The top-level class which coordinates construction /// and emission of the instruction selector. /// class DAGISelEmitter : public TableGenBackend { public: - typedef std::pair PatternToMatch; + //typedef std::pair PatternToMatch; private: RecordKeeper &Records; CodeGenTarget Target; From evan.cheng at apple.com Wed Dec 14 16:07:24 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Dec 2005 16:07:24 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrInfo.td Message-ID: <200512142207.QAA23463@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrInfo.td updated: 1.157 -> 1.158 --- Log message: Added predicate !NoExcessFPPrecision to FMADD, FMADDS, FMSUB, and FMSUBS. --- Diffs of the changes: (+11 -4) PPCInstrInfo.td | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.157 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.158 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.157 Tue Dec 13 18:34:09 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Wed Dec 14 16:07:12 2005 @@ -166,6 +166,9 @@ let PrintMethod = "printcrbitm"; } +//===----------------------------------------------------------------------===// +// PowerPC Instruction Predicate Definitions. +def FPContractions : Predicate<"!NoExcessFPPrecision">; //===----------------------------------------------------------------------===// // PowerPC Instruction Definitions. @@ -719,22 +722,26 @@ (ops F8RC:$FRT, F8RC:$FRA, F8RC:$FRC, F8RC:$FRB), "fmadd $FRT, $FRA, $FRC, $FRB", FPFused, [(set F8RC:$FRT, (fadd (fmul F8RC:$FRA, F8RC:$FRC), - F8RC:$FRB))]>; + F8RC:$FRB))]>, + Requires<[FPContractions]>; def FMADDS : AForm_1<59, 29, (ops F4RC:$FRT, F4RC:$FRA, F4RC:$FRC, F4RC:$FRB), "fmadds $FRT, $FRA, $FRC, $FRB", FPGeneral, [(set F4RC:$FRT, (fadd (fmul F4RC:$FRA, F4RC:$FRC), - F4RC:$FRB))]>; + F4RC:$FRB))]>, + Requires<[FPContractions]>; def FMSUB : AForm_1<63, 28, (ops F8RC:$FRT, F8RC:$FRA, F8RC:$FRC, F8RC:$FRB), "fmsub $FRT, $FRA, $FRC, $FRB", FPFused, [(set F8RC:$FRT, (fsub (fmul F8RC:$FRA, F8RC:$FRC), - F8RC:$FRB))]>; + F8RC:$FRB))]>, + Requires<[FPContractions]>; def FMSUBS : AForm_1<59, 28, (ops F4RC:$FRT, F4RC:$FRA, F4RC:$FRC, F4RC:$FRB), "fmsubs $FRT, $FRA, $FRC, $FRB", FPGeneral, [(set F4RC:$FRT, (fsub (fmul F4RC:$FRA, F4RC:$FRC), - F4RC:$FRB))]>; + F4RC:$FRB))]>, + Requires<[FPContractions]>; def FNMADD : AForm_1<63, 31, (ops F8RC:$FRT, F8RC:$FRA, F8RC:$FRC, F8RC:$FRB), "fnmadd $FRT, $FRA, $FRC, $FRB", FPFused, From evan.cheng at apple.com Wed Dec 14 16:28:29 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Dec 2005 16:28:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp Message-ID: <200512142228.QAA23690@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelPattern.cpp updated: 1.188 -> 1.189 --- Log message: Fixed a typo: line 2323: MOVSX16rm8 -> MOVZX16rm8. This was the cause fo 12/14/2005 hbd failure. --- Diffs of the changes: (+1 -1) X86ISelPattern.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.188 llvm/lib/Target/X86/X86ISelPattern.cpp:1.189 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.188 Sun Dec 4 00:03:50 2005 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Wed Dec 14 16:28:18 2005 @@ -2332,7 +2332,7 @@ case MVT::i16: assert(cast(Node->getOperand(3))->getVT() <= MVT::i8 && "Bad zero extend!"); - addFullAddress(BuildMI(BB, X86::MOVSX16rm8, 5, Result), AM); + addFullAddress(BuildMI(BB, X86::MOVZX16rm8, 5, Result), AM); break; case MVT::i8: assert(cast(Node->getOperand(3))->getVT() == MVT::i1 && From natebegeman at mac.com Wed Dec 14 16:51:24 2005 From: natebegeman at mac.com (Nate Begeman) Date: Wed, 14 Dec 2005 16:51:24 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/fma.ll Message-ID: <200512142251.QAA24124@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: fma.ll updated: 1.4 -> 1.5 --- Log message: Add a case for float just to make sure the patterns for both precisions are matching --- Diffs of the changes: (+7 -1) fma.ll | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/test/Regression/CodeGen/PowerPC/fma.ll diff -u llvm/test/Regression/CodeGen/PowerPC/fma.ll:1.4 llvm/test/Regression/CodeGen/PowerPC/fma.ll:1.5 --- llvm/test/Regression/CodeGen/PowerPC/fma.ll:1.4 Thu May 12 16:06:05 2005 +++ llvm/test/Regression/CodeGen/PowerPC/fma.ll Wed Dec 14 16:51:13 2005 @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=ppc32 | egrep 'fn?madd|fn?msub' | wc -l | grep 7 +; RUN: llvm-as < %s | llc -march=ppc32 | egrep 'fn?madd|fn?msub' | wc -l | grep 8 double %test_FMADD1(double %A, double %B, double %C) { %D = mul double %A, %B @@ -38,3 +38,9 @@ %F = sub double -0.0, %E ret double %F } +float %test_FNMSUBS(float %A, float %B, float %C) { + %D = mul float %A, %B + %E = sub float %D, %C + %F = sub float -0.0, %E + ret float %F +} From natebegeman at mac.com Wed Dec 14 16:54:45 2005 From: natebegeman at mac.com (Nate Begeman) Date: Wed, 14 Dec 2005 16:54:45 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp PPCInstrInfo.td Message-ID: <200512142254.QAA24143@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelDAGToDAG.cpp updated: 1.140 -> 1.141 PPCInstrInfo.td updated: 1.158 -> 1.159 --- Log message: Use the new predicate support that Evan Cheng added to remove some code from the DAGToDAG cpp file. This adds pattern support for vector and scalar fma, which passes test/Regression/CodeGen/PowerPC/fma.ll, and does the right thing in the presence of -disable-excess-fp-precision. Allows us to match: void %foo(<4 x float> * %a) { entry: %tmp1 = load <4 x float> * %a; %tmp2 = mul <4 x float> %tmp1, %tmp1 %tmp3 = add <4 x float> %tmp2, %tmp1 store <4 x float> %tmp3, <4 x float> *%a ret void } As: _foo: li r2, 0 lvx v0, r2, r3 vmaddfp v0, v0, v0, v0 stvx v0, r2, r3 blr Or, with llc -disable-excess-fp-precision, _foo: li r2, 0 lvx v0, r2, r3 vxor v1, v1, v1 vmaddfp v1, v0, v0, v1 vaddfp v0, v1, v0 stvx v0, r2, r3 blr --- Diffs of the changes: (+24 -57) PPCISelDAGToDAG.cpp | 47 ----------------------------------------------- PPCInstrInfo.td | 34 ++++++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 57 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.140 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.141 --- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.140 Fri Dec 9 20:36:00 2005 +++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Wed Dec 14 16:54:33 2005 @@ -885,53 +885,6 @@ CurDAG->getTargetFrameIndex(FI, MVT::i32), getI32Imm(0)); } - case ISD::FADD: { - MVT::ValueType Ty = N->getValueType(0); - if (!NoExcessFPPrecision) { // Match FMA ops - if (N->getOperand(0).getOpcode() == ISD::FMUL && - N->getOperand(0).Val->hasOneUse()) { - ++FusedFP; // Statistic - return CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FMADD :PPC::FMADDS, - Ty, Select(N->getOperand(0).getOperand(0)), - Select(N->getOperand(0).getOperand(1)), - Select(N->getOperand(1))); - } else if (N->getOperand(1).getOpcode() == ISD::FMUL && - N->getOperand(1).hasOneUse()) { - ++FusedFP; // Statistic - return CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FMADD :PPC::FMADDS, - Ty, Select(N->getOperand(1).getOperand(0)), - Select(N->getOperand(1).getOperand(1)), - Select(N->getOperand(0))); - } - } - - // Other cases are autogenerated. - break; - } - case ISD::FSUB: { - MVT::ValueType Ty = N->getValueType(0); - - if (!NoExcessFPPrecision) { // Match FMA ops - if (N->getOperand(0).getOpcode() == ISD::FMUL && - N->getOperand(0).Val->hasOneUse()) { - ++FusedFP; // Statistic - return CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FMSUB:PPC::FMSUBS, - Ty, Select(N->getOperand(0).getOperand(0)), - Select(N->getOperand(0).getOperand(1)), - Select(N->getOperand(1))); - } else if (N->getOperand(1).getOpcode() == ISD::FMUL && - N->getOperand(1).Val->hasOneUse()) { - ++FusedFP; // Statistic - return CurDAG->SelectNodeTo(N, Ty == MVT::f64 ?PPC::FNMSUB:PPC::FNMSUBS, - Ty, Select(N->getOperand(1).getOperand(0)), - Select(N->getOperand(1).getOperand(1)), - Select(N->getOperand(0))); - } - } - - // Other cases are autogenerated. - break; - } case ISD::SDIV: { // FIXME: since this depends on the setting of the carry flag from the srawi // we should really be making notes about that for the scheduler. Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.158 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.159 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.158 Wed Dec 14 16:07:12 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Wed Dec 14 16:54:33 2005 @@ -168,7 +168,7 @@ //===----------------------------------------------------------------------===// // PowerPC Instruction Predicate Definitions. -def FPContractions : Predicate<"!NoExcessFPPrecision">; +def FPContractions : Predicate<"NoExcessFPPrecision">; //===----------------------------------------------------------------------===// // PowerPC Instruction Definitions. @@ -746,22 +746,26 @@ (ops F8RC:$FRT, F8RC:$FRA, F8RC:$FRC, F8RC:$FRB), "fnmadd $FRT, $FRA, $FRC, $FRB", FPFused, [(set F8RC:$FRT, (fneg (fadd (fmul F8RC:$FRA, F8RC:$FRC), - F8RC:$FRB)))]>; + F8RC:$FRB)))]>, + Requires<[FPContractions]>; def FNMADDS : AForm_1<59, 31, (ops F4RC:$FRT, F4RC:$FRA, F4RC:$FRC, F4RC:$FRB), "fnmadds $FRT, $FRA, $FRC, $FRB", FPGeneral, [(set F4RC:$FRT, (fneg (fadd (fmul F4RC:$FRA, F4RC:$FRC), - F4RC:$FRB)))]>; + F4RC:$FRB)))]>, + Requires<[FPContractions]>; def FNMSUB : AForm_1<63, 30, (ops F8RC:$FRT, F8RC:$FRA, F8RC:$FRC, F8RC:$FRB), "fnmsub $FRT, $FRA, $FRC, $FRB", FPFused, [(set F8RC:$FRT, (fneg (fsub (fmul F8RC:$FRA, F8RC:$FRC), - F8RC:$FRB)))]>; + F8RC:$FRB)))]>, + Requires<[FPContractions]>; def FNMSUBS : AForm_1<59, 30, (ops F4RC:$FRT, F4RC:$FRA, F4RC:$FRC, F4RC:$FRB), "fnmsubs $FRT, $FRA, $FRC, $FRB", FPGeneral, [(set F4RC:$FRT, (fneg (fsub (fmul F4RC:$FRA, F4RC:$FRC), - F4RC:$FRB)))]>; + F4RC:$FRB)))]>, + Requires<[FPContractions]>; // FSEL is artificially split into 4 and 8-byte forms for the result. To avoid // having 4 of these, force the comparison to always be an 8-byte double (code // should use an FMRSD if the input comparison value really wants to be a float) @@ -848,12 +852,14 @@ def VMADDFP : VAForm_1<46, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, VRRC:$vC), "vmaddfp $vD, $vA, $vC, $vB", VecFP, [(set VRRC:$vD, (fadd (fmul VRRC:$vA, VRRC:$vC), - VRRC:$vB))]>; + VRRC:$vB))]>, + Requires<[FPContractions]>; def VNMSUBFP: VAForm_1<47, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, VRRC:$vC), - "vnmsubfp $vD, $vA, $vC, $vB", VecFP, - [(set VRRC:$vD, (fneg (fsub (fmul VRRC:$vA, - VRRC:$vC), - VRRC:$vB)))]>; + "vnmsubfp $vD, $vA, $vC, $vB", VecFP, + [(set VRRC:$vD, (fneg (fsub (fmul VRRC:$vA, + VRRC:$vC), + VRRC:$vB)))]>, + Requires<[FPContractions]>; // VX-Form instructions. AltiVec arithmetic ops. def VADDFP : VXForm_1<10, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB), @@ -971,6 +977,14 @@ def : Pat<(fmul VRRC:$vA, VRRC:$vB), (VMADDFP VRRC:$vA, (V_SET0), VRRC:$vB)>; +// Fused negative multiply subtract, alternate pattern +def : Pat<(fsub F8RC:$B, (fmul F8RC:$A, F8RC:$C)), + (FNMSUB F8RC:$A, F8RC:$C, F8RC:$B)>, + Requires<[FPContractions]>; +def : Pat<(fsub F4RC:$B, (fmul F4RC:$A, F4RC:$C)), + (FNMSUBS F4RC:$A, F4RC:$C, F4RC:$B)>, + Requires<[FPContractions]>; + // Fused multiply add and multiply sub for packed float. These are represented // separately from the real instructions above, for operations that must have // the additional precision, such as Newton-Rhapson (used by divide, sqrt) From natebegeman at mac.com Wed Dec 14 16:56:28 2005 From: natebegeman at mac.com (Nate Begeman) Date: Wed, 14 Dec 2005 16:56:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Message-ID: <200512142256.QAA24158@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelDAGToDAG.cpp updated: 1.141 -> 1.142 --- Log message: Remove a now unused statistic. --- Diffs of the changes: (+0 -1) PPCISelDAGToDAG.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.141 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.142 --- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.141 Wed Dec 14 16:54:33 2005 +++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Wed Dec 14 16:56:16 2005 @@ -29,7 +29,6 @@ using namespace llvm; namespace { - Statistic<> FusedFP ("ppc-codegen", "Number of fused fp operations"); Statistic<> FrameOff("ppc-codegen", "Number of frame idx offsets collapsed"); //===--------------------------------------------------------------------===// From evan.cheng at apple.com Wed Dec 14 18:59:28 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Dec 2005 18:59:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512150059.SAA25611@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.166 -> 1.167 --- Log message: Use MOV8rm to load 1 bit value. --- Diffs of the changes: (+3 -0) X86InstrInfo.td | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.166 llvm/lib/Target/X86/X86InstrInfo.td:1.167 --- llvm/lib/Target/X86/X86InstrInfo.td:1.166 Tue Dec 13 20:22:27 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Dec 14 18:59:17 2005 @@ -431,6 +431,9 @@ "mov{l} {$src, $dst|$dst, $src}", [(store R32:$src, addr:$dst)]>; +// Handling 1 bit load +def : Pat<(i1 (load addr:$src)), (MOV8rm addr:$src)>; + //===----------------------------------------------------------------------===// // Fixed-Register Multiplication and Division Instructions... // From evan.cheng at apple.com Wed Dec 14 19:02:59 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Dec 2005 19:02:59 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200512150102.TAA25660@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.10 -> 1.11 --- Log message: Handling zero extension of 1 bit value. --- Diffs of the changes: (+128 -17) X86ISelDAGToDAG.cpp | 145 +++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 128 insertions(+), 17 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.10 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.11 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.10 Mon Dec 12 15:49:40 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Wed Dec 14 19:02:48 2005 @@ -22,6 +22,7 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" +#include using namespace llvm; //===----------------------------------------------------------------------===// @@ -95,6 +96,8 @@ private: SDOperand Select(SDOperand N); + bool isFoldableLoad(SDOperand Op, SDOperand OtherOp, + bool FloatPromoteOk = false); bool MatchAddress(SDOperand N, X86ISelAddressMode &AM); bool SelectAddr(SDOperand N, SDOperand &Base, SDOperand &Scale, SDOperand &Index, SDOperand &Disp); @@ -359,36 +362,144 @@ return false; } -SDOperand X86DAGToDAGISel::Select(SDOperand Op) { - SDNode *N = Op.Val; - MVT::ValueType OpVT = N->getValueType(0); +/// NodeTransitivelyUsesValue - Return true if N or any of its uses uses Op. +/// The DAG cannot have cycles in it, by definition, so the visited set is not +/// needed to prevent infinite loops. The DAG CAN, however, have unbounded +/// reuse, so it prevents exponential cases. +/// +static bool NodeTransitivelyUsesValue(SDOperand N, SDOperand Op, + std::set &Visited) { + if (N == Op) return true; // Found it. + SDNode *Node = N.Val; + if (Node->getNumOperands() == 0 || // Leaf? + Node->getNodeDepth() <= Op.getNodeDepth()) return false; // Can't find it? + if (!Visited.insert(Node).second) return false; // Already visited? + + // Recurse for the first N-1 operands. + for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i) + if (NodeTransitivelyUsesValue(Node->getOperand(i), Op, Visited)) + return true; + + // Tail recurse for the last operand. + return NodeTransitivelyUsesValue(Node->getOperand(0), Op, Visited); +} + +/// isFoldableLoad - Return true if this is a load instruction that can safely +/// be folded into an operation that uses it. +bool X86DAGToDAGISel::isFoldableLoad(SDOperand Op, SDOperand OtherOp, + bool FloatPromoteOk) { + if (Op.getOpcode() == ISD::LOAD) { + // FIXME: currently can't fold constant pool indexes. + if (isa(Op.getOperand(1))) + return false; + } else if (FloatPromoteOk && Op.getOpcode() == ISD::EXTLOAD && + cast(Op.getOperand(3))->getVT() == MVT::f32) { + // FIXME: currently can't fold constant pool indexes. + if (isa(Op.getOperand(1))) + return false; + } else { + return false; + } + + // If this load has already been emitted, we clearly can't fold it. + assert(Op.ResNo == 0 && "Not a use of the value of the load?"); + if (CodeGenMap.count(Op.getValue(1))) return false; + assert(!CodeGenMap.count(Op.getValue(0)) && + "Value in map but not token chain?"); + assert(!CodeGenMap.count(Op.getValue(1)) && + "Token lowered but value not in map?"); + + // If there is not just one use of its value, we cannot fold. + if (!Op.Val->hasNUsesOfValue(1, 0)) return false; + + // Finally, we cannot fold the load into the operation if this would induce a + // cycle into the resultant dag. To check for this, see if OtherOp (the other + // operand of the operation we are folding the load into) can possible use the + // chain node defined by the load. + if (OtherOp.Val && !Op.Val->hasNUsesOfValue(0, 1)) { // Has uses of chain? + std::set Visited; + if (NodeTransitivelyUsesValue(OtherOp, Op.getValue(1), Visited)) + return false; + } + return true; +} + +SDOperand X86DAGToDAGISel::Select(SDOperand N) { + SDNode *Node = N.Val; + MVT::ValueType NVT = Node->getValueType(0); unsigned Opc; - if (N->getOpcode() >= ISD::BUILTIN_OP_END) - return Op; // Already selected. + if (Node->getOpcode() >= ISD::BUILTIN_OP_END) + return N; // Already selected. - switch (N->getOpcode()) { + switch (Node->getOpcode()) { default: break; case ISD::SHL: - if (ConstantSDNode *CN = dyn_cast(N->getOperand(1))) { + if (ConstantSDNode *CN = dyn_cast(Node->getOperand(1))) { if (CN->getValue() == 1) { // X = SHL Y, 1 -> X = ADD Y, Y - switch (OpVT) { + switch (NVT) { default: assert(0 && "Cannot shift this type!"); case MVT::i8: Opc = X86::ADD8rr; break; case MVT::i16: Opc = X86::ADD16rr; break; case MVT::i32: Opc = X86::ADD32rr; break; } - SDOperand Tmp0 = Select(N->getOperand(0)); - return CurDAG->SelectNodeTo(N, Opc, MVT::i32, Tmp0, Tmp0); + SDOperand Tmp0 = Select(Node->getOperand(0)); + if (Node->hasOneUse()) + return CurDAG->SelectNodeTo(Node, Opc, NVT, Tmp0, Tmp0); + else + return CodeGenMap[N] = + CurDAG->getTargetNode(Opc, NVT, Tmp0, Tmp0); } } break; + case ISD::ANY_EXTEND: // treat any extend like zext + case ISD::ZERO_EXTEND: { + SDOperand N0 = N.getOperand(0); + if (N0.getValueType() == MVT::i1) { + // FIXME: This hack is here for zero extension casts from bool to i8. + // This would not be needed if bools were promoted by Legalize. + if (NVT == MVT::i8) { + Opc = X86::MOV8rr; + } else if (!isFoldableLoad(N0, SDOperand())) { + switch (NVT) { + default: assert(0 && "Cannot zero extend to this type!"); + case MVT::i16: Opc = X86::MOVZX16rr8; break; + case MVT::i32: Opc = X86::MOVZX32rr8; break; + } + } else { + switch (NVT) { + default: assert(0 && "Cannot zero extend to this type!"); + case MVT::i16: Opc = X86::MOVZX16rm8; break; + case MVT::i32: Opc = X86::MOVZX32rm8; break; + } + + SDOperand Chain = Select(N0.getOperand(0)); + SDOperand Base, Scale, Index, Disp; + (void) SelectAddr(N0.getOperand(1), Base, Scale, Index, Disp); + SDOperand Result = CurDAG->getTargetNode(Opc, NVT, + MVT::Other, Base, Scale, + Index, Disp, Chain); + CodeGenMap[N.getValue(0)] = Result; + Chain = CodeGenMap[N.getValue(1)] = Result.getValue(1); + return (N.ResNo) ? Chain : Result.getValue(0); + } + + SDOperand Tmp0 = Select(Node->getOperand(0)); + if (Node->hasOneUse()) + return CurDAG->SelectNodeTo(Node, Opc, NVT, Tmp0); + else + return CodeGenMap[N] = CurDAG->getTargetNode(Opc, NVT, Tmp0); + } + // Other cases are autogenerated. + break; + } + case ISD::RET: { - SDOperand Chain = N->getOperand(0); // Token chain. - unsigned NumOps = N->getNumOperands(); + SDOperand Chain = Node->getOperand(0); // Token chain. + unsigned NumOps = Node->getNumOperands(); // Note: A bit of a hack / optimization... Try to delay chain selection // as much as possible. So it's more likely it has already been selected @@ -401,9 +512,9 @@ assert(0 && "Not yet handled return instruction!"); break; case 2: { - SDOperand Val = Select(N->getOperand(1)); + SDOperand Val = Select(Node->getOperand(1)); Chain = Select(Chain); - switch (N->getOperand(1).getValueType()) { + switch (Node->getOperand(1).getValueType()) { default: assert(0 && "All other types should have been promoted!!"); case MVT::i32: @@ -420,15 +531,15 @@ break; } if (X86Lowering.getBytesToPopOnReturn() == 0) - return CurDAG->SelectNodeTo(N, X86::RET, MVT::Other, Chain); + return CurDAG->SelectNodeTo(Node, X86::RET, MVT::Other, Chain); else - return CurDAG->SelectNodeTo(N, X86::RET, MVT::Other, + return CurDAG->SelectNodeTo(Node, X86::RET, MVT::Other, getI16Imm(X86Lowering.getBytesToPopOnReturn()), Chain); } } - return SelectCode(Op); + return SelectCode(N); } /// createX86ISelDag - This pass converts a legalized DAG into a From evan.cheng at apple.com Thu Dec 15 02:30:02 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Dec 2005 02:30:02 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512150830.CAA00845@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.24 -> 1.25 --- Log message: Added constpool, frameindex, and externalsym nodes. --- Diffs of the changes: (+9 -3) TargetSelectionDAG.td | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.24 llvm/lib/Target/TargetSelectionDAG.td:1.25 --- llvm/lib/Target/TargetSelectionDAG.td:1.24 Wed Dec 14 16:02:59 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Thu Dec 15 02:29:48 2005 @@ -185,12 +185,18 @@ def bb : SDNode<"ISD::BasicBlock", SDTOther , [], "BasicBlockSDNode">; def cond : SDNode<"ISD::CONDCODE" , SDTOther , [], "CondCodeSDNode">; def undef : SDNode<"ISD::UNDEF" , SDTUNDEF , []>; -def globaladdr : SDNode<"ISD::GlobalAddress", SDTPtrLeaf, [], +def globaladdr : SDNode<"ISD::GlobalAddress", SDTPtrLeaf, [], "GlobalAddressSDNode">; -def tglobaladdr : SDNode<"ISD::TargetGlobalAddress", SDTPtrLeaf, [], +def tglobaladdr: SDNode<"ISD::TargetGlobalAddress", SDTPtrLeaf, [], "GlobalAddressSDNode">; -def tconstpool : SDNode<"ISD::TargetConstantPool", SDTPtrLeaf, [], +def constpool : SDNode<"ISD::ConstantPool", SDTPtrLeaf, [], "ConstantPoolSDNode">; +def tconstpool : SDNode<"ISD::TargetConstantPool", SDTPtrLeaf, [], + "ConstantPoolSDNode">; +def frameindex : SDNode<"ISD::FrameIndex", SDTPtrLeaf, [], + "FrameIndexSDNode">; +def externalsym: SDNode<"ISD::ExternalSymbol", SDTPtrLeaf, [], + "ExternalSymbolSDNode">; def add : SDNode<"ISD::ADD" , SDTIntBinOp , [SDNPCommutative, SDNPAssociative]>; def sub : SDNode<"ISD::SUB" , SDTIntBinOp>; From evan.cheng at apple.com Thu Dec 15 02:31:16 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Dec 2005 02:31:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512150831.CAA00896@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.167 -> 1.168 --- Log message: Added frameindex, constpool, globaladdr, and externalsym as root nodes of leaaddr. --- Diffs of the changes: (+3 -2) X86InstrInfo.td | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.167 llvm/lib/Target/X86/X86InstrInfo.td:1.168 --- llvm/lib/Target/X86/X86InstrInfo.td:1.167 Wed Dec 14 18:59:17 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Thu Dec 15 02:31:04 2005 @@ -48,7 +48,9 @@ // Define X86 specific addressing mode. def addr : ComplexPattern; -def leaaddr : ComplexPattern; +def leaaddr : ComplexPattern; // Format specifies the encoding used by the instruction. This is part of the // ad-hoc solution used to emit machine instruction encodings by our machine @@ -327,7 +329,6 @@ "lea{l} {$src|$dst}, {$dst|$src}", [(set R32:$dst, leaaddr:$src)]>; - def REP_MOVSB : I<0xA4, RawFrm, (ops), "{rep;movsb|rep movsb}", []>, Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP; def REP_MOVSW : I<0xA5, RawFrm, (ops), "{rep;movsw|rep movsw}", []>, From lattner at cs.uiuc.edu Thu Dec 15 13:02:49 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 13:02:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200512151902.NAA02252@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.68 -> 1.69 --- Log message: Don't create SEXTLOAD/ZEXTLOAD instructions that the target doesn't support if after legalize. This fixes IA64 failures. --- Diffs of the changes: (+4 -2) DAGCombiner.cpp | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.68 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.69 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.68 Wed Dec 14 13:25:30 2005 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Thu Dec 15 13:02:38 2005 @@ -1550,7 +1550,8 @@ return DAG.getNode(ISD::SIGN_EXTEND_INREG, VT, N0.getOperand(0), DAG.getValueType(N0.getValueType())); // fold (sext (load x)) -> (sext (truncate (sextload x))) - if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { + if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse() && + (!AfterLegalize||TLI.isOperationLegal(ISD::SEXTLOAD, N0.getValueType()))){ SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), N0.getValueType()); @@ -1592,7 +1593,8 @@ (!AfterLegalize || TLI.isOperationLegal(ISD::AND, N0.getValueType()))) return DAG.getZeroExtendInReg(N0.getOperand(0), N0.getValueType()); // fold (zext (load x)) -> (zext (truncate (zextload x))) - if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { + if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse() && + (!AfterLegalize||TLI.isOperationLegal(ISD::ZEXTLOAD, N0.getValueType()))){ SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), N0.getOperand(1), N0.getOperand(2), N0.getValueType()); From evan.cheng at apple.com Thu Dec 15 13:49:35 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Dec 2005 13:49:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512151949.NAA09695@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.25 -> 1.26 --- Log message: * Promote all 1 bit entities to 8 bit. * Handling extload (1 bit -> 8 bit) and remove C++ code that handle 1 bit zextload. --- Diffs of the changes: (+4 -1) TargetSelectionDAG.td | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.25 llvm/lib/Target/TargetSelectionDAG.td:1.26 --- llvm/lib/Target/TargetSelectionDAG.td:1.25 Thu Dec 15 02:29:48 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Thu Dec 15 13:49:22 2005 @@ -150,7 +150,7 @@ SDTCisPtrTy<1> ]>; -def SDTIntExtLoad : SDTypeProfile<1, 3, [ // sextload, zextload +def SDTIntExtLoad : SDTypeProfile<1, 3, [ // sextload, zextload, extload SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT> ]>; @@ -261,6 +261,7 @@ // below) which pass in a dummy srcvalue node which tblgen will skip over. def sextld : SDNode<"ISD::SEXTLOAD" , SDTIntExtLoad, [SDNPHasChain]>; def zextld : SDNode<"ISD::ZEXTLOAD" , SDTIntExtLoad, [SDNPHasChain]>; +def extld : SDNode<"ISD::EXTLOAD" , SDTIntExtLoad, [SDNPHasChain]>; //===----------------------------------------------------------------------===// // Selection DAG Condition Codes @@ -333,6 +334,8 @@ (sextld node:$ptr, srcvalue:$dummy, node:$vt)>; def zextload : PatFrag<(ops node:$ptr, node:$vt), (zextld node:$ptr, srcvalue:$dummy, node:$vt)>; +def extload : PatFrag<(ops node:$ptr, node:$vt), + (extld node:$ptr, srcvalue:$dummy, node:$vt)>; // setcc convenience fragments. def setoeq : PatFrag<(ops node:$lhs, node:$rhs), From evan.cheng at apple.com Thu Dec 15 13:49:35 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Dec 2005 13:49:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp X86ISelLowering.cpp X86InstrInfo.td Message-ID: <200512151949.NAA09701@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.11 -> 1.12 X86ISelLowering.cpp updated: 1.6 -> 1.7 X86InstrInfo.td updated: 1.168 -> 1.169 --- Log message: * Promote all 1 bit entities to 8 bit. * Handling extload (1 bit -> 8 bit) and remove C++ code that handle 1 bit zextload. --- Diffs of the changes: (+5 -113) X86ISelDAGToDAG.cpp | 107 ---------------------------------------------------- X86ISelLowering.cpp | 3 - X86InstrInfo.td | 8 ++- 3 files changed, 5 insertions(+), 113 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.11 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.12 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.11 Wed Dec 14 19:02:48 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Thu Dec 15 13:49:23 2005 @@ -22,7 +22,6 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" -#include using namespace llvm; //===----------------------------------------------------------------------===// @@ -96,8 +95,6 @@ private: SDOperand Select(SDOperand N); - bool isFoldableLoad(SDOperand Op, SDOperand OtherOp, - bool FloatPromoteOk = false); bool MatchAddress(SDOperand N, X86ISelAddressMode &AM); bool SelectAddr(SDOperand N, SDOperand &Base, SDOperand &Scale, SDOperand &Index, SDOperand &Disp); @@ -362,68 +359,6 @@ return false; } -/// NodeTransitivelyUsesValue - Return true if N or any of its uses uses Op. -/// The DAG cannot have cycles in it, by definition, so the visited set is not -/// needed to prevent infinite loops. The DAG CAN, however, have unbounded -/// reuse, so it prevents exponential cases. -/// -static bool NodeTransitivelyUsesValue(SDOperand N, SDOperand Op, - std::set &Visited) { - if (N == Op) return true; // Found it. - SDNode *Node = N.Val; - if (Node->getNumOperands() == 0 || // Leaf? - Node->getNodeDepth() <= Op.getNodeDepth()) return false; // Can't find it? - if (!Visited.insert(Node).second) return false; // Already visited? - - // Recurse for the first N-1 operands. - for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i) - if (NodeTransitivelyUsesValue(Node->getOperand(i), Op, Visited)) - return true; - - // Tail recurse for the last operand. - return NodeTransitivelyUsesValue(Node->getOperand(0), Op, Visited); -} - -/// isFoldableLoad - Return true if this is a load instruction that can safely -/// be folded into an operation that uses it. -bool X86DAGToDAGISel::isFoldableLoad(SDOperand Op, SDOperand OtherOp, - bool FloatPromoteOk) { - if (Op.getOpcode() == ISD::LOAD) { - // FIXME: currently can't fold constant pool indexes. - if (isa(Op.getOperand(1))) - return false; - } else if (FloatPromoteOk && Op.getOpcode() == ISD::EXTLOAD && - cast(Op.getOperand(3))->getVT() == MVT::f32) { - // FIXME: currently can't fold constant pool indexes. - if (isa(Op.getOperand(1))) - return false; - } else { - return false; - } - - // If this load has already been emitted, we clearly can't fold it. - assert(Op.ResNo == 0 && "Not a use of the value of the load?"); - if (CodeGenMap.count(Op.getValue(1))) return false; - assert(!CodeGenMap.count(Op.getValue(0)) && - "Value in map but not token chain?"); - assert(!CodeGenMap.count(Op.getValue(1)) && - "Token lowered but value not in map?"); - - // If there is not just one use of its value, we cannot fold. - if (!Op.Val->hasNUsesOfValue(1, 0)) return false; - - // Finally, we cannot fold the load into the operation if this would induce a - // cycle into the resultant dag. To check for this, see if OtherOp (the other - // operand of the operation we are folding the load into) can possible use the - // chain node defined by the load. - if (OtherOp.Val && !Op.Val->hasNUsesOfValue(0, 1)) { // Has uses of chain? - std::set Visited; - if (NodeTransitivelyUsesValue(OtherOp, Op.getValue(1), Visited)) - return false; - } - return true; -} - SDOperand X86DAGToDAGISel::Select(SDOperand N) { SDNode *Node = N.Val; MVT::ValueType NVT = Node->getValueType(0); @@ -455,48 +390,6 @@ } break; - case ISD::ANY_EXTEND: // treat any extend like zext - case ISD::ZERO_EXTEND: { - SDOperand N0 = N.getOperand(0); - if (N0.getValueType() == MVT::i1) { - // FIXME: This hack is here for zero extension casts from bool to i8. - // This would not be needed if bools were promoted by Legalize. - if (NVT == MVT::i8) { - Opc = X86::MOV8rr; - } else if (!isFoldableLoad(N0, SDOperand())) { - switch (NVT) { - default: assert(0 && "Cannot zero extend to this type!"); - case MVT::i16: Opc = X86::MOVZX16rr8; break; - case MVT::i32: Opc = X86::MOVZX32rr8; break; - } - } else { - switch (NVT) { - default: assert(0 && "Cannot zero extend to this type!"); - case MVT::i16: Opc = X86::MOVZX16rm8; break; - case MVT::i32: Opc = X86::MOVZX32rm8; break; - } - - SDOperand Chain = Select(N0.getOperand(0)); - SDOperand Base, Scale, Index, Disp; - (void) SelectAddr(N0.getOperand(1), Base, Scale, Index, Disp); - SDOperand Result = CurDAG->getTargetNode(Opc, NVT, - MVT::Other, Base, Scale, - Index, Disp, Chain); - CodeGenMap[N.getValue(0)] = Result; - Chain = CodeGenMap[N.getValue(1)] = Result.getValue(1); - return (N.ResNo) ? Chain : Result.getValue(0); - } - - SDOperand Tmp0 = Select(Node->getOperand(0)); - if (Node->hasOneUse()) - return CurDAG->SelectNodeTo(Node, Opc, NVT, Tmp0); - else - return CodeGenMap[N] = CurDAG->getTargetNode(Opc, NVT, Tmp0); - } - // Other cases are autogenerated. - break; - } - case ISD::RET: { SDOperand Chain = Node->getOperand(0); // Token chain. unsigned NumOps = Node->getNumOperands(); Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.6 llvm/lib/Target/X86/X86ISelLowering.cpp:1.7 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.6 Wed Dec 7 11:59:14 2005 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Thu Dec 15 13:49:23 2005 @@ -41,9 +41,6 @@ setShiftAmountFlavor(Mask); // shl X, 32 == shl X, 0 // Set up the register classes. - // FIXME: Eliminate these two classes when legalize can handle promotions - // well. - addRegisterClass(MVT::i1, X86::R8RegisterClass); addRegisterClass(MVT::i8, X86::R8RegisterClass); addRegisterClass(MVT::i16, X86::R16RegisterClass); addRegisterClass(MVT::i32, X86::R32RegisterClass); Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.168 llvm/lib/Target/X86/X86InstrInfo.td:1.169 --- llvm/lib/Target/X86/X86InstrInfo.td:1.168 Thu Dec 15 02:31:04 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Thu Dec 15 13:49:23 2005 @@ -180,6 +180,8 @@ def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i8))>; def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i16))>; +def extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extload node:$ptr, i1))>; + //===----------------------------------------------------------------------===// // Instruction templates... @@ -432,9 +434,6 @@ "mov{l} {$src, $dst|$dst, $src}", [(store R32:$src, addr:$dst)]>; -// Handling 1 bit load -def : Pat<(i1 (load addr:$src)), (MOV8rm addr:$src)>; - //===----------------------------------------------------------------------===// // Fixed-Register Multiplication and Division Instructions... // @@ -1720,6 +1719,9 @@ def : Pat<(zextloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>; def : Pat<(zextloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>; +// Handling 1 bit extload +def : Pat<(extloadi8i1 addr:$src), (MOV8rm addr:$src)>; + //===----------------------------------------------------------------------===// // XMM Floating point support (requires SSE2) //===----------------------------------------------------------------------===// From lattner at cs.uiuc.edu Thu Dec 15 18:07:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 18:07:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp Message-ID: <200512160007.SAA11216@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ATTAsmPrinter.cpp updated: 1.17 -> 1.18 --- Log message: Don't globalize internal functions --- Diffs of the changes: (+2 -1) X86ATTAsmPrinter.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp diff -u llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.17 llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.18 --- llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.17 Wed Nov 30 12:54:35 2005 +++ llvm/lib/Target/X86/X86ATTAsmPrinter.cpp Thu Dec 15 18:07:30 2005 @@ -34,7 +34,8 @@ // Print out labels for the function. SwitchSection("\t.text\n", MF.getFunction()); EmitAlignment(4); // FIXME: This should be parameterized somewhere. - O << "\t.globl\t" << CurrentFnName << "\n"; + if (!MF.getFunction()->hasInternalLinkage()) + O << "\t.globl\t" << CurrentFnName << "\n"; if (HasDotTypeDotSizeDirective) O << "\t.type\t" << CurrentFnName << ", @function\n"; O << CurrentFnName << ":\n"; From lattner at cs.uiuc.edu Thu Dec 15 18:22:25 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 18:22:25 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200512160022.SAA19063@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.126 -> 1.127 --- Log message: Update the darwin handling of linkonce & weak functions and GV stubs. This should work in all permutations. --- Diffs of the changes: (+63 -57) PPCAsmPrinter.cpp | 120 ++++++++++++++++++++++++++++-------------------------- 1 files changed, 63 insertions(+), 57 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.126 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.127 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.126 Tue Dec 13 00:32:50 2005 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Thu Dec 15 18:22:14 2005 @@ -43,7 +43,7 @@ class PPCAsmPrinter : public AsmPrinter { public: - std::set FnStubs, GVStubs, LinkOnceStubs; + std::set FnStubs, GVStubs; PPCAsmPrinter(std::ostream &O, TargetMachine &TM) : AsmPrinter(O, TM) {} @@ -123,19 +123,22 @@ void printCallOperand(const MachineInstr *MI, unsigned OpNo) { const MachineOperand &MO = MI->getOperand(OpNo); if (!PPCGenerateStaticCode) { + if (MO.getType() == MachineOperand::MO_GlobalAddress) { + GlobalValue *GV = MO.getGlobal(); + if (((GV->isExternal() || GV->hasWeakLinkage() || + GV->hasLinkOnceLinkage()))) { + // Dynamically-resolved functions need a stub for the function. + std::string Name = Mang->getValueName(GV); + FnStubs.insert(Name); + O << "L" << Name << "$stub"; + return; + } + } if (MO.getType() == MachineOperand::MO_ExternalSymbol) { std::string Name(GlobalPrefix); Name += MO.getSymbolName(); FnStubs.insert(Name); O << "L" << Name << "$stub"; return; - } else if (MO.getType() == MachineOperand::MO_GlobalAddress && - isa(MO.getGlobal()) && - cast(MO.getGlobal())->isExternal()) { - // Dynamically-resolved functions need a stub for the function. - std::string Name = Mang->getValueName(MO.getGlobal()); - FnStubs.insert(Name); - O << "L" << Name << "$stub"; - return; } } @@ -145,9 +148,8 @@ O << (int)MI->getOperand(OpNo).getImmedValue()*4; } void printPICLabel(const MachineInstr *MI, unsigned OpNo) { - // FIXME: should probably be converted to cout.width and cout.fill - O << "\"L0000" << getFunctionNumber() << "$pb\"\n"; - O << "\"L0000" << getFunctionNumber() << "$pb\":"; + O << "\"L" << getFunctionNumber() << "$pb\"\n"; + O << "\"L" << getFunctionNumber() << "$pb\":"; } void printSymbolHi(const MachineInstr *MI, unsigned OpNo) { if (MI->getOperand(OpNo).isImmediate()) { @@ -156,7 +158,7 @@ O << "ha16("; printOp(MI->getOperand(OpNo)); if (PICEnabled) - O << "-\"L0000" << getFunctionNumber() << "$pb\")"; + O << "-\"L" << getFunctionNumber() << "$pb\")"; else O << ')'; } @@ -168,7 +170,7 @@ O << "lo16("; printOp(MI->getOperand(OpNo)); if (PICEnabled) - O << "-\"L0000" << getFunctionNumber() << "$pb\")"; + O << "-\"L" << getFunctionNumber() << "$pb\")"; else O << ')'; } @@ -295,25 +297,29 @@ O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << '_' << MO.getConstantPoolIndex(); return; - case MachineOperand::MO_ExternalSymbol: + // Computing the address of an external symbol, not calling it. + if (!PPCGenerateStaticCode) { + std::string Name(GlobalPrefix); Name += MO.getSymbolName(); + GVStubs.insert(Name); + O << "L" << Name << "$non_lazy_ptr"; + return; + } O << GlobalPrefix << MO.getSymbolName(); return; - case MachineOperand::MO_GlobalAddress: { + // Computing the address of a global symbol, not calling it. GlobalValue *GV = MO.getGlobal(); std::string Name = Mang->getValueName(GV); // External or weakly linked global variables need non-lazily-resolved stubs - if (!PPCGenerateStaticCode && - ((GV->isExternal() || GV->hasWeakLinkage() || - GV->hasLinkOnceLinkage()))) { - if (GV->hasLinkOnceLinkage()) - LinkOnceStubs.insert(Name); - else + if (!PPCGenerateStaticCode) { + if (((GV->isExternal() || GV->hasWeakLinkage() || + GV->hasLinkOnceLinkage()))) { GVStubs.insert(Name); - O << "L" << Name << "$non_lazy_ptr"; - return; + O << "L" << Name << "$non_lazy_ptr"; + return; + } } O << Name; @@ -375,10 +381,25 @@ // Print out labels for the function. const Function *F = MF.getFunction(); - SwitchSection(".text", F); - EmitAlignment(4, F); - if (!F->hasInternalLinkage()) + switch (F->getLinkage()) { + default: assert(0 && "Unknown linkage type!"); + case Function::InternalLinkage: // Symbols default to internal. + SwitchSection(".text", F); + EmitAlignment(4, F); + break; + case Function::ExternalLinkage: + SwitchSection(".text", F); + EmitAlignment(4, F); + O << "\t.globl\t" << CurrentFnName << "\n"; + break; + case Function::WeakLinkage: + case Function::LinkOnceLinkage: + SwitchSection(".section __TEXT,__textcoal_nt,coalesced,pure_instructions", + F); O << "\t.globl\t" << CurrentFnName << "\n"; + O << "\t.weak_definition\t" << CurrentFnName << "\n"; + break; + } O << CurrentFnName << ":\n"; // Print out code for the function. @@ -446,16 +467,10 @@ } else { switch (I->getLinkage()) { case GlobalValue::LinkOnceLinkage: - SwitchSection("", 0); - O << ".section __TEXT,__textcoal_nt,coalesced,no_toc\n" - << ".weak_definition " << name << '\n' - << ".private_extern " << name << '\n' - << ".section __DATA,__datacoal_nt,coalesced,no_toc\n"; - LinkOnceStubs.insert(name); - break; case GlobalValue::WeakLinkage: O << ".weak_definition " << name << '\n' << ".private_extern " << name << '\n'; + SwitchSection(".section __DATA,__datacoal_nt,coalesced", I); break; case GlobalValue::AppendingLinkage: // FIXME: appending linkage variables should go into a section of @@ -482,8 +497,8 @@ if (PICEnabled) { for (std::set::iterator i = FnStubs.begin(), e = FnStubs.end(); i != e; ++i) { - O << ".data\n"; - O<<".section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32\n"; + SwitchSection(".section __TEXT,__picsymbolstub1,symbol_stubs," + "pure_instructions,32", 0); EmitAlignment(2); O << "L" << *i << "$stub:\n"; O << "\t.indirect_symbol " << *i << "\n"; @@ -496,8 +511,7 @@ O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n"; O << "\tmtctr r12\n"; O << "\tbctr\n"; - O << ".data\n"; - O << ".lazy_symbol_pointer\n"; + SwitchSection(".lazy_symbol_pointer", 0); O << "L" << *i << "$lazy_ptr:\n"; O << "\t.indirect_symbol " << *i << "\n"; O << "\t.long dyld_stub_binding_helper\n"; @@ -505,7 +519,8 @@ } else { for (std::set::iterator i = FnStubs.begin(), e = FnStubs.end(); i != e; ++i) { - O<<"\t.section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16\n"; + SwitchSection(".section __TEXT,__symbol_stub1,symbol_stubs," + "pure_instructions,16", 0); EmitAlignment(4); O << "L" << *i << "$stub:\n"; O << "\t.indirect_symbol " << *i << "\n"; @@ -513,7 +528,7 @@ O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n"; O << "\tmtctr r12\n"; O << "\tbctr\n"; - O << "\t.lazy_symbol_pointer\n"; + SwitchSection(".lazy_symbol_pointer", 0); O << "L" << *i << "$lazy_ptr:\n"; O << "\t.indirect_symbol " << *i << "\n"; O << "\t.long dyld_stub_binding_helper\n"; @@ -522,23 +537,14 @@ O << "\n"; - // Output stubs for external global variables - if (GVStubs.begin() != GVStubs.end()) - O << ".data\n.non_lazy_symbol_pointer\n"; - for (std::set::iterator i = GVStubs.begin(), e = GVStubs.end(); - i != e; ++i) { - O << "L" << *i << "$non_lazy_ptr:\n"; - O << "\t.indirect_symbol " << *i << "\n"; - O << "\t.long\t0\n"; - } - - // Output stubs for link-once variables - if (LinkOnceStubs.begin() != LinkOnceStubs.end()) { - O << ".data\n.align 2\n"; - for (std::set::iterator i = LinkOnceStubs.begin(), - e = LinkOnceStubs.end(); i != e; ++i) { - O << "L" << *i << "$non_lazy_ptr:\n" - << "\t.long\t" << *i << '\n'; + // Output stubs for external and common global variables. + if (GVStubs.begin() != GVStubs.end()) { + SwitchSection(".non_lazy_symbol_pointer", 0); + for (std::set::iterator I = GVStubs.begin(), + E = GVStubs.end(); I != E; ++I) { + O << "L" << *I << "$non_lazy_ptr:\n"; + O << "\t.indirect_symbol " << *I << "\n"; + O << "\t.long\t0\n"; } } From lattner at cs.uiuc.edu Thu Dec 15 23:00:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 23:00:09 -0600 Subject: [llvm-commits] CVS: llvm/tools/llc/llc.cpp Message-ID: <200512160500.XAA21360@zion.cs.uiuc.edu> Changes in directory llvm/tools/llc: llc.cpp updated: 1.117 -> 1.118 --- Log message: provide an option to override the target triple in a module from the command line. --- Diffs of the changes: (+6 -0) llc.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/tools/llc/llc.cpp diff -u llvm/tools/llc/llc.cpp:1.117 llvm/tools/llc/llc.cpp:1.118 --- llvm/tools/llc/llc.cpp:1.117 Mon Nov 7 20:12:17 2005 +++ llvm/tools/llc/llc.cpp Thu Dec 15 22:59:57 2005 @@ -48,6 +48,8 @@ static cl::opt Fast("fast", cl::desc("Generate code quickly, potentially sacrificing code quality")); +static cl::opt +TargetTriple("triple", cl::desc("Override target triple for module")); static cl::opt MArch("march", cl::desc("Architecture to generate code for:")); @@ -116,6 +118,10 @@ } Module &mod = *M.get(); + // If we are supposed to override the target triple, do so now. + if (!TargetTriple.empty()) + mod.setTargetTriple(TargetTriple); + // Allocate target machine. First, check whether the user has // explicitly specified an architecture to compile for. TargetMachine* (*TargetMachineAllocator)(const Module&, From lattner at cs.uiuc.edu Thu Dec 15 23:00:32 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 23:00:32 -0600 Subject: [llvm-commits] CVS: llvm/tools/lli/lli.cpp Message-ID: <200512160500.XAA21393@zion.cs.uiuc.edu> Changes in directory llvm/tools/lli: lli.cpp updated: 1.52 -> 1.53 --- Log message: provide an option to override the target triple in a module from the commandline. --- Diffs of the changes: (+7 -1) lli.cpp | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/tools/lli/lli.cpp diff -u llvm/tools/lli/lli.cpp:1.52 llvm/tools/lli/lli.cpp:1.53 --- llvm/tools/lli/lli.cpp:1.52 Fri Dec 2 13:00:22 2005 +++ llvm/tools/lli/lli.cpp Thu Dec 15 23:00:21 2005 @@ -36,7 +36,9 @@ cl::opt ForceInterpreter("force-interpreter", cl::desc("Force interpretation: disable JIT"), cl::init(false)); - + cl::opt + TargetTriple("triple", cl::desc("Override target triple for module")); + cl::opt FakeArgv0("fake-argv0", cl::desc("Override the 'argv[0]' value passed into the executing" @@ -62,6 +64,10 @@ exit(1); } + // If we are supposed to override the target triple, do so now. + if (!TargetTriple.empty()) + MP->getModule()->setTargetTriple(TargetTriple); + ExecutionEngine *EE = ExecutionEngine::create(MP, ForceInterpreter); assert(EE && "Couldn't create an ExecutionEngine, not even an interpreter?"); From lattner at cs.uiuc.edu Thu Dec 15 23:19:05 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 23:19:05 -0600 Subject: [llvm-commits] CVS: llvm/docs/CommandGuide/llc.pod lli.pod Message-ID: <200512160519.XAA21587@zion.cs.uiuc.edu> Changes in directory llvm/docs/CommandGuide: llc.pod updated: 1.9 -> 1.10 lli.pod updated: 1.2 -> 1.3 --- Log message: Document -mcpu -mattr -triple --- Diffs of the changes: (+45 -18) llc.pod | 36 +++++++++++++++++++++--------------- lli.pod | 27 ++++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 18 deletions(-) Index: llvm/docs/CommandGuide/llc.pod diff -u llvm/docs/CommandGuide/llc.pod:1.9 llvm/docs/CommandGuide/llc.pod:1.10 --- llvm/docs/CommandGuide/llc.pod:1.9 Fri May 13 15:01:11 2005 +++ llvm/docs/CommandGuide/llc.pod Thu Dec 15 23:18:53 2005 @@ -46,11 +46,31 @@ Overwrite output files. By default, B will refuse to overwrite an output file which already exists. +=item B<-triple>=I + +Override the target triple specified in the input bytecode file with the +specified string. + =item B<-march>=I Specify the architecture for which to generate assembly, overriding the target encoded in the bytecode file. See the output of B for a list of -valid architectures. +valid architectures. By default this is inferred from the target triple or +autodetected to the current architecture. + +=item B<-mcpu>=I + +Specify a specific chip in the current architecture to generate code for. +By default this is inferred from the target triple and autodetected to +the current architecture. For a list of available CPUs, use: +B /dev/null | llc -march=xyz -mcpu=help> + +=item B<-mattr>=I + +Override or control specific attributes of the target, such as whether SIMD +operations are enabled or not. The default set of attributes is set by the +current CPU. For a list of available attributes, use: +B /dev/null | llc -march=xyz -mattr=help> =item B<--disable-fp-elim> @@ -155,20 +175,6 @@ =back -=head2 SPARCV9-specific Options - -=over - -=item B<--disable-peephole> - -Disable peephole optimization pass. - -=item B<--disable-sched> - -Disable local scheduling pass. - -=back - =head1 EXIT STATUS If B succeeds, it will exit with 0. Otherwise, if an error occurs, Index: llvm/docs/CommandGuide/lli.pod diff -u llvm/docs/CommandGuide/lli.pod:1.2 llvm/docs/CommandGuide/lli.pod:1.3 --- llvm/docs/CommandGuide/lli.pod:1.2 Fri Jul 2 11:06:19 2004 +++ llvm/docs/CommandGuide/lli.pod Thu Dec 15 23:18:53 2005 @@ -40,11 +40,32 @@ Record the amount of time needed for each code-generation pass and print it to standard error. +=item B<-triple>=I + +Override the target triple specified in the input bytecode file with the +specified string. This may result in a crash if you pick an +architecture which is not compatible with the current system. + =item B<-march>=I -Use the specified non-default architecture arch when selecting a code generator -for the just-in-time compiler. This may result in a crash if you pick an -architecture which is not compatible with the hardware you are running B on. +Specify the architecture for which to generate assembly, overriding the target +encoded in the bytecode file. See the output of B for a list of +valid architectures. By default this is inferred from the target triple or +autodetected to the current architecture. + +=item B<-mcpu>=I + +Specify a specific chip in the current architecture to generate code for. +By default this is inferred from the target triple and autodetected to +the current architecture. For a list of available CPUs, use: +B /dev/null | llc -march=xyz -mcpu=help> + +=item B<-mattr>=I + +Override or control specific attributes of the target, such as whether SIMD +operations are enabled or not. The default set of attributes is set by the +current CPU. For a list of available attributes, use: +B /dev/null | llc -march=xyz -mattr=help> =item B<-force-interpreter>=I<{false,true}> From lattner at cs.uiuc.edu Thu Dec 15 23:19:30 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 23:19:30 -0600 Subject: [llvm-commits] CVS: llvm/tools/lli/lli.cpp Message-ID: <200512160519.XAA21620@zion.cs.uiuc.edu> Changes in directory llvm/tools/lli: lli.cpp updated: 1.53 -> 1.54 --- Log message: rename option --- Diffs of the changes: (+1 -1) lli.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/lli/lli.cpp diff -u llvm/tools/lli/lli.cpp:1.53 llvm/tools/lli/lli.cpp:1.54 --- llvm/tools/lli/lli.cpp:1.53 Thu Dec 15 23:00:21 2005 +++ llvm/tools/lli/lli.cpp Thu Dec 15 23:19:18 2005 @@ -37,7 +37,7 @@ cl::desc("Force interpretation: disable JIT"), cl::init(false)); cl::opt - TargetTriple("triple", cl::desc("Override target triple for module")); + TargetTriple("mtriple", cl::desc("Override target triple for module")); cl::opt FakeArgv0("fake-argv0", From lattner at cs.uiuc.edu Thu Dec 15 23:19:46 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 23:19:46 -0600 Subject: [llvm-commits] CVS: llvm/docs/CommandGuide/llc.pod lli.pod Message-ID: <200512160519.XAA21687@zion.cs.uiuc.edu> Changes in directory llvm/docs/CommandGuide: llc.pod updated: 1.10 -> 1.11 lli.pod updated: 1.3 -> 1.4 --- Log message: rename options --- Diffs of the changes: (+2 -2) llc.pod | 2 +- lli.pod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/docs/CommandGuide/llc.pod diff -u llvm/docs/CommandGuide/llc.pod:1.10 llvm/docs/CommandGuide/llc.pod:1.11 --- llvm/docs/CommandGuide/llc.pod:1.10 Thu Dec 15 23:18:53 2005 +++ llvm/docs/CommandGuide/llc.pod Thu Dec 15 23:19:35 2005 @@ -46,7 +46,7 @@ Overwrite output files. By default, B will refuse to overwrite an output file which already exists. -=item B<-triple>=I +=item B<-mtriple>=I Override the target triple specified in the input bytecode file with the specified string. Index: llvm/docs/CommandGuide/lli.pod diff -u llvm/docs/CommandGuide/lli.pod:1.3 llvm/docs/CommandGuide/lli.pod:1.4 --- llvm/docs/CommandGuide/lli.pod:1.3 Thu Dec 15 23:18:53 2005 +++ llvm/docs/CommandGuide/lli.pod Thu Dec 15 23:19:35 2005 @@ -40,7 +40,7 @@ Record the amount of time needed for each code-generation pass and print it to standard error. -=item B<-triple>=I +=item B<-mtriple>=I Override the target triple specified in the input bytecode file with the specified string. This may result in a crash if you pick an From lattner at cs.uiuc.edu Thu Dec 15 23:20:07 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Dec 2005 23:20:07 -0600 Subject: [llvm-commits] CVS: llvm/tools/llc/llc.cpp Message-ID: <200512160520.XAA21723@zion.cs.uiuc.edu> Changes in directory llvm/tools/llc: llc.cpp updated: 1.118 -> 1.119 --- Log message: rename option for consistency with -mcpu -mattr etc --- Diffs of the changes: (+1 -1) llc.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/llc/llc.cpp diff -u llvm/tools/llc/llc.cpp:1.118 llvm/tools/llc/llc.cpp:1.119 --- llvm/tools/llc/llc.cpp:1.118 Thu Dec 15 22:59:57 2005 +++ llvm/tools/llc/llc.cpp Thu Dec 15 23:19:55 2005 @@ -49,7 +49,7 @@ cl::desc("Generate code quickly, potentially sacrificing code quality")); static cl::opt -TargetTriple("triple", cl::desc("Override target triple for module")); +TargetTriple("mtriple", cl::desc("Override target triple for module")); static cl::opt MArch("march", cl::desc("Architecture to generate code for:")); From lattner at cs.uiuc.edu Fri Dec 16 00:03:10 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 00:03:10 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Message-ID: <200512160603.AAA22006@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8InstrInfo.td updated: 1.39 -> 1.40 --- Log message: add some simple operand info --- Diffs of the changes: (+8 -7) SparcV8InstrInfo.td | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.39 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.40 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.39 Fri Dec 10 02:39:29 2004 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Fri Dec 16 00:02:58 2005 @@ -35,15 +35,16 @@ //===----------------------------------------------------------------------===// // Pseudo instructions. -class PseudoInstV8 : InstV8 { +class PseudoInstV8 : InstV8 { let Name = nm; + dag OperandList = ops; } -def PHI : PseudoInstV8<"PHI">; -def ADJCALLSTACKDOWN : PseudoInstV8<"ADJCALLSTACKDOWN">; -def ADJCALLSTACKUP : PseudoInstV8<"ADJCALLSTACKUP">; -def IMPLICIT_USE : PseudoInstV8<"IMPLICIT_USE">; -def IMPLICIT_DEF : PseudoInstV8<"IMPLICIT_DEF">; -def FpMOVD : PseudoInstV8<"FpMOVD">; // pseudo 64-bit double move +def PHI : PseudoInstV8<"PHI", (ops variable_ops)>; +def ADJCALLSTACKDOWN : PseudoInstV8<"ADJCALLSTACKDOWN", (ops variable_ops)>; +def ADJCALLSTACKUP : PseudoInstV8<"ADJCALLSTACKUP", (ops variable_ops)>; +def IMPLICIT_USE : PseudoInstV8<"IMPLICIT_USE", (ops variable_ops)>; +def IMPLICIT_DEF : PseudoInstV8<"IMPLICIT_DEF", (ops variable_ops)>; +def FpMOVD : PseudoInstV8<"FpMOVD", (ops)>; // pseudo 64-bit double move // Section A.3 - Synthetic Instructions, p. 85 // special cases of JMPL: From lattner at cs.uiuc.edu Fri Dec 16 00:06:19 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 00:06:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/Makefile SparcV8TargetMachine.cpp SparcV8TargetMachine.h SparcV8CodeEmitter.cpp SparcV8JITInfo.h Message-ID: <200512160606.AAA22111@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: Makefile updated: 1.9 -> 1.10 SparcV8TargetMachine.cpp updated: 1.31 -> 1.32 SparcV8TargetMachine.h updated: 1.8 -> 1.9 SparcV8CodeEmitter.cpp (r1.6) removed SparcV8JITInfo.h (r1.2) removed --- Log message: Remove JIT support, which doesn't work. --- Diffs of the changes: (+3 -63) Makefile | 2 - SparcV8TargetMachine.cpp | 55 +---------------------------------------------- SparcV8TargetMachine.h | 9 ------- 3 files changed, 3 insertions(+), 63 deletions(-) Index: llvm/lib/Target/SparcV8/Makefile diff -u llvm/lib/Target/SparcV8/Makefile:1.9 llvm/lib/Target/SparcV8/Makefile:1.10 --- llvm/lib/Target/SparcV8/Makefile:1.9 Thu Dec 9 22:48:57 2004 +++ llvm/lib/Target/SparcV8/Makefile Fri Dec 16 00:06:07 2005 @@ -13,7 +13,7 @@ # Make sure that tblgen is run, first thing. BUILT_SOURCES = SparcV8GenRegisterInfo.h.inc SparcV8GenRegisterNames.inc \ SparcV8GenRegisterInfo.inc SparcV8GenInstrNames.inc \ - SparcV8GenInstrInfo.inc SparcV8GenCodeEmitter.inc + SparcV8GenInstrInfo.inc include $(LEVEL)/Makefile.common Index: llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp diff -u llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.31 llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.32 --- llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.31 Mon Nov 7 20:11:51 2005 +++ llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp Fri Dec 16 00:06:07 2005 @@ -34,11 +34,7 @@ IntrinsicLowering *IL, const std::string &FS) : TargetMachine("SparcV8", IL, false, 4, 4), - FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0), JITInfo(*this) { -} - -unsigned SparcV8TargetMachine::getJITMatchQuality() { - return 0; // No JIT yet. + FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) { } unsigned SparcV8TargetMachine::getModuleMatchQuality(const Module &M) { @@ -57,7 +53,7 @@ M.getPointerSize() != Module::AnyPointerSize) return 0; // Match for some other target - return getJITMatchQuality()/2; + return 0; } /// addPassesToEmitFile - Add passes to the specified pass manager @@ -120,50 +116,3 @@ return false; } -/// addPassesToJITCompile - Add passes to the specified pass manager to -/// implement a fast dynamic compiler for this target. -/// -void SparcV8JITInfo::addPassesToJITCompile(FunctionPassManager &PM) { - // FIXME: Implement efficient support for garbage collection intrinsics. - PM.add(createLowerGCPass()); - - // Replace malloc and free instructions with library calls. - PM.add(createLowerAllocationsPass()); - - // FIXME: implement the switch instruction in the instruction selector. - PM.add(createLowerSwitchPass()); - - // FIXME: implement the invoke/unwind instructions! - PM.add(createLowerInvokePass()); - - // Make sure that no unreachable blocks are instruction selected. - PM.add(createUnreachableBlockEliminationPass()); - - // FIXME: implement the select instruction in the instruction selector. - PM.add(createLowerSelectPass()); - - // Print LLVM code input to instruction selector: - if (PrintMachineCode) - PM.add(new PrintFunctionPass()); - - PM.add(createSparcV8SimpleInstructionSelector(TM)); - - // Print machine instructions as they were initially generated. - if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(&std::cerr)); - - PM.add(createRegisterAllocator()); - PM.add(createPrologEpilogCodeInserter()); - - // Print machine instructions after register allocation and prolog/epilog - // insertion. - if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(&std::cerr)); - - PM.add(createSparcV8FPMoverPass(TM)); - PM.add(createSparcV8DelaySlotFillerPass(TM)); - - // Print machine instructions after filling delay slots. - if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(&std::cerr)); -} Index: llvm/lib/Target/SparcV8/SparcV8TargetMachine.h diff -u llvm/lib/Target/SparcV8/SparcV8TargetMachine.h:1.8 llvm/lib/Target/SparcV8/SparcV8TargetMachine.h:1.9 --- llvm/lib/Target/SparcV8/SparcV8TargetMachine.h:1.8 Mon Nov 7 20:11:51 2005 +++ llvm/lib/Target/SparcV8/SparcV8TargetMachine.h Fri Dec 16 00:06:07 2005 @@ -18,7 +18,6 @@ #include "llvm/Target/TargetFrameInfo.h" #include "llvm/PassManager.h" #include "SparcV8InstrInfo.h" -#include "SparcV8JITInfo.h" namespace llvm { @@ -28,7 +27,6 @@ class SparcV8TargetMachine : public TargetMachine { SparcV8InstrInfo InstrInfo; TargetFrameInfo FrameInfo; - SparcV8JITInfo JITInfo; public: SparcV8TargetMachine(const Module &M, IntrinsicLowering *IL, const std::string &FS); @@ -38,15 +36,8 @@ virtual const MRegisterInfo *getRegisterInfo() const { return &InstrInfo.getRegisterInfo(); } - virtual TargetJITInfo *getJITInfo() { - return &JITInfo; - } static unsigned getModuleMatchQuality(const Module &M); - static unsigned getJITMatchQuality(); - - virtual bool addPassesToEmitMachineCode(FunctionPassManager &PM, - MachineCodeEmitter &MCE); virtual bool addPassesToEmitFile(PassManager &PM, std::ostream &Out, CodeGenFileType FileType, bool Fast); From lattner at cs.uiuc.edu Fri Dec 16 00:24:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 00:24:09 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/SparcV8/ Message-ID: <200512160624.AAA22380@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/SparcV8: --- Log message: Directory /home/vadve/shared/PublicCVS/llvm/test/Regression/CodeGen/SparcV8 added to the repository --- Diffs of the changes: (+0 -0) 0 files changed From lattner at cs.uiuc.edu Fri Dec 16 00:25:07 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 00:25:07 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/SparcV8/basictest.ll dg.exp Message-ID: <200512160625.AAA22471@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/SparcV8: basictest.ll added (r1.1) dg.exp added (r1.1) --- Log message: A truly trivial testcase to ensure sparcv8 doesn't get completely broken again. --- Diffs of the changes: (+9 -0) basictest.ll | 6 ++++++ dg.exp | 3 +++ 2 files changed, 9 insertions(+) Index: llvm/test/Regression/CodeGen/SparcV8/basictest.ll diff -c /dev/null llvm/test/Regression/CodeGen/SparcV8/basictest.ll:1.1 *** /dev/null Fri Dec 16 00:25:05 2005 --- llvm/test/Regression/CodeGen/SparcV8/basictest.ll Fri Dec 16 00:24:55 2005 *************** *** 0 **** --- 1,6 ---- + ; RUN: llvm-as < %s | llc -march=sparcv8 + + int %test(int %X) { + %tmp.1 = add int %X, 1 ; [#uses=1] + ret int %tmp.1 + } Index: llvm/test/Regression/CodeGen/SparcV8/dg.exp diff -c /dev/null llvm/test/Regression/CodeGen/SparcV8/dg.exp:1.1 *** /dev/null Fri Dec 16 00:25:07 2005 --- llvm/test/Regression/CodeGen/SparcV8/dg.exp Fri Dec 16 00:24:55 2005 *************** *** 0 **** --- 1,3 ---- + load_lib llvm-dg.exp + + llvm-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] $objdir $srcdir $subdir $target_triplet $llvmgcc $llvmgxx $prcontext From lattner at cs.uiuc.edu Fri Dec 16 00:25:53 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 00:25:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8InstrFormats.td SparcV8InstrInfo.td Message-ID: <200512160625.AAA22506@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8InstrFormats.td updated: 1.3 -> 1.4 SparcV8InstrInfo.td updated: 1.40 -> 1.41 --- Log message: Add operand info for F3_[12] instructions, getting V8 back to basic functionality. With this, Regression/CodeGen/SparcV8/basictest.ll now passes. Lets hear it for regression tests :) --- Diffs of the changes: (+198 -98) SparcV8InstrFormats.td | 8 + SparcV8InstrInfo.td | 288 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 198 insertions(+), 98 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8InstrFormats.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.3 llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.4 --- llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.3 Thu Oct 14 17:32:24 2004 +++ llvm/lib/Target/SparcV8/SparcV8InstrFormats.td Fri Dec 16 00:25:42 2005 @@ -58,10 +58,12 @@ // Specific F3 classes: SparcV8 manual, page 44 // -class F3_1 opVal, bits<6> op3val, string name> : F3 { +class F3_1 opVal, bits<6> op3val, dag ops, string name> : F3 { bits<8> asi = 0; // asi not currently used in SparcV8 bits<5> rs2; + dag OperandList = ops; + let op = opVal; let op3 = op3val; let Name = name; @@ -71,9 +73,11 @@ let Inst{4-0} = rs2; } -class F3_2 opVal, bits<6> op3val, string name> : F3 { +class F3_2 opVal, bits<6> op3val, dag ops, string name> : F3 { bits<13> simm13; + dag OperandList = ops; + let op = opVal; let op3 = op3val; let Name = name; Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.40 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.41 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.40 Fri Dec 16 00:02:58 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Fri Dec 16 00:25:42 2005 @@ -50,47 +50,74 @@ // special cases of JMPL: let isReturn = 1, isTerminator = 1, hasDelaySlot = 1 in { let rd = I7.Num, rs1 = G0.Num, simm13 = 8 in - def RET : F3_2<2, 0b111000, "ret">; + def RET : F3_2<2, 0b111000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ret">; let rd = O7.Num, rs1 = G0.Num, simm13 = 8 in - def RETL: F3_2<2, 0b111000, "retl">; + def RETL: F3_2<2, 0b111000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "retl">; } // CMP is a special case of SUBCC where destination is ignored, by setting it to // %g0 (hardwired zero). // FIXME: should keep track of the fact that it defs the integer condition codes let rd = 0 in - def CMPri: F3_2<2, 0b010100, "cmp">; + def CMPri: F3_2<2, 0b010100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "cmp">; // Section B.1 - Load Integer Instructions, p. 90 -def LDSB: F3_2<3, 0b001001, "ldsb">; -def LDSH: F3_2<3, 0b001010, "ldsh">; -def LDUB: F3_2<3, 0b000001, "ldub">; -def LDUH: F3_2<3, 0b000010, "lduh">; -def LD : F3_2<3, 0b000000, "ld">; -def LDD : F3_2<3, 0b000011, "ldd">; +def LDSB: F3_2<3, 0b001001, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldsb">; +def LDSH: F3_2<3, 0b001010, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldsh">; +def LDUB: F3_2<3, 0b000001, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldub">; +def LDUH: F3_2<3, 0b000010, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "lduh">; +def LD : F3_2<3, 0b000000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ld">; +def LDD : F3_2<3, 0b000011, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldd">; // Section B.2 - Load Floating-point Instructions, p. 92 -def LDFrr : F3_1<3, 0b100000, "ld">; -def LDFri : F3_2<3, 0b100000, "ld">; -def LDDFrr : F3_1<3, 0b100011, "ldd">; -def LDDFri : F3_2<3, 0b100011, "ldd">; -def LDFSRrr: F3_1<3, 0b100001, "ld">; -def LDFSRri: F3_2<3, 0b100001, "ld">; +def LDFrr : F3_1<3, 0b100000, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "ld">; +def LDFri : F3_2<3, 0b100000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ld">; +def LDDFrr : F3_1<3, 0b100011, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "ldd">; +def LDDFri : F3_2<3, 0b100011, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldd">; +def LDFSRrr: F3_1<3, 0b100001, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "ld">; +def LDFSRri: F3_2<3, 0b100001, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ld">; // Section B.4 - Store Integer Instructions, p. 95 -def STB : F3_2<3, 0b000101, "stb">; -def STH : F3_2<3, 0b000110, "sth">; -def ST : F3_2<3, 0b000100, "st">; -def STD : F3_2<3, 0b000111, "std">; +def STB : F3_2<3, 0b000101, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "stb">; +def STH : F3_2<3, 0b000110, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sth">; +def ST : F3_2<3, 0b000100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "st">; +def STD : F3_2<3, 0b000111, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "std">; // Section B.5 - Store Floating-point Instructions, p. 97 -def STFrr : F3_1<3, 0b100100, "st">; -def STFri : F3_2<3, 0b100100, "st">; -def STDFrr : F3_1<3, 0b100111, "std">; -def STDFri : F3_2<3, 0b100111, "std">; -def STFSRrr : F3_1<3, 0b100101, "st">; -def STFSRri : F3_2<3, 0b100101, "st">; -def STDFQrr : F3_1<3, 0b100110, "std">; -def STDFQri : F3_2<3, 0b100110, "std">; +def STFrr : F3_1<3, 0b100100, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "st">; +def STFri : F3_2<3, 0b100100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "st">; +def STDFrr : F3_1<3, 0b100111, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "std">; +def STDFri : F3_2<3, 0b100111, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "std">; +def STFSRrr : F3_1<3, 0b100101, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "st">; +def STFSRri : F3_2<3, 0b100101, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "st">; +def STDFQrr : F3_1<3, 0b100110, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "std">; +def STDFQri : F3_2<3, 0b100110, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "std">; // Section B.9 - SETHI Instruction, p. 104 def SETHIi: F2_1<0b100, "sethi">; @@ -101,84 +128,150 @@ def NOP : F2_1<0b100, "nop">; // Section B.11 - Logical Instructions, p. 106 -def ANDrr : F3_1<2, 0b000001, "and">; -def ANDri : F3_2<2, 0b000001, "and">; -def ANDCCrr : F3_1<2, 0b010001, "andcc">; -def ANDCCri : F3_2<2, 0b010001, "andcc">; -def ANDNrr : F3_1<2, 0b000101, "andn">; -def ANDNri : F3_2<2, 0b000101, "andn">; -def ANDNCCrr: F3_1<2, 0b010101, "andncc">; -def ANDNCCri: F3_2<2, 0b010101, "andncc">; -def ORrr : F3_1<2, 0b000010, "or">; -def ORri : F3_2<2, 0b000010, "or">; -def ORCCrr : F3_1<2, 0b010010, "orcc">; -def ORCCri : F3_2<2, 0b010010, "orcc">; -def ORNrr : F3_1<2, 0b000110, "orn">; -def ORNri : F3_2<2, 0b000110, "orn">; -def ORNCCrr : F3_1<2, 0b010110, "orncc">; -def ORNCCri : F3_2<2, 0b010110, "orncc">; -def XORrr : F3_1<2, 0b000011, "xor">; -def XORri : F3_2<2, 0b000011, "xor">; -def XORCCrr : F3_1<2, 0b010011, "xorcc">; -def XORCCri : F3_2<2, 0b010011, "xorcc">; -def XNORrr : F3_1<2, 0b000111, "xnor">; -def XNORri : F3_2<2, 0b000111, "xnor">; -def XNORCCrr: F3_1<2, 0b010111, "xnorcc">; -def XNORCCri: F3_2<2, 0b010111, "xnorcc">; +def ANDrr : F3_1<2, 0b000001, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "and">; +def ANDri : F3_2<2, 0b000001, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "and">; +def ANDCCrr : F3_1<2, 0b010001, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "andcc">; +def ANDCCri : F3_2<2, 0b010001, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "andcc">; +def ANDNrr : F3_1<2, 0b000101, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "andn">; +def ANDNri : F3_2<2, 0b000101, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "andn">; +def ANDNCCrr: F3_1<2, 0b010101, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "andncc">; +def ANDNCCri: F3_2<2, 0b010101, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "andncc">; +def ORrr : F3_1<2, 0b000010, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "or">; +def ORri : F3_2<2, 0b000010, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "or">; +def ORCCrr : F3_1<2, 0b010010, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "orcc">; +def ORCCri : F3_2<2, 0b010010, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "orcc">; +def ORNrr : F3_1<2, 0b000110, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "orn">; +def ORNri : F3_2<2, 0b000110, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "orn">; +def ORNCCrr : F3_1<2, 0b010110, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "orncc">; +def ORNCCri : F3_2<2, 0b010110, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "orncc">; +def XORrr : F3_1<2, 0b000011, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xor">; +def XORri : F3_2<2, 0b000011, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xor">; +def XORCCrr : F3_1<2, 0b010011, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xorcc">; +def XORCCri : F3_2<2, 0b010011, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xorcc">; +def XNORrr : F3_1<2, 0b000111, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xnor">; +def XNORri : F3_2<2, 0b000111, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xnor">; +def XNORCCrr: F3_1<2, 0b010111, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xnorcc">; +def XNORCCri: F3_2<2, 0b010111, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xnorcc">; // Section B.12 - Shift Instructions, p. 107 -def SLLrr : F3_1<2, 0b100101, "sll">; -def SLLri : F3_2<2, 0b100101, "sll">; -def SRLrr : F3_1<2, 0b100110, "srl">; -def SRLri : F3_2<2, 0b100110, "srl">; -def SRArr : F3_1<2, 0b100111, "sra">; -def SRAri : F3_2<2, 0b100111, "sra">; +def SLLrr : F3_1<2, 0b100101, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sll">; +def SLLri : F3_2<2, 0b100101, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sll">; +def SRLrr : F3_1<2, 0b100110, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "srl">; +def SRLri : F3_2<2, 0b100110, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "srl">; +def SRArr : F3_1<2, 0b100111, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sra">; +def SRAri : F3_2<2, 0b100111, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sra">; // Section B.13 - Add Instructions, p. 108 -def ADDrr : F3_1<2, 0b000000, "add">; -def ADDri : F3_2<2, 0b000000, "add">; -def ADDCCrr : F3_1<2, 0b010000, "addcc">; -def ADDCCri : F3_2<2, 0b010000, "addcc">; -def ADDXrr : F3_1<2, 0b001000, "addx">; -def ADDXri : F3_2<2, 0b001000, "addx">; -def ADDXCCrr: F3_1<2, 0b011000, "addxcc">; -def ADDXCCri: F3_2<2, 0b011000, "addxcc">; +def ADDrr : F3_1<2, 0b000000, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "add">; +def ADDri : F3_2<2, 0b000000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "add">; +def ADDCCrr : F3_1<2, 0b010000, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "addcc">; +def ADDCCri : F3_2<2, 0b010000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "addcc">; +def ADDXrr : F3_1<2, 0b001000, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "addx">; +def ADDXri : F3_2<2, 0b001000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "addx">; +def ADDXCCrr: F3_1<2, 0b011000, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "addxcc">; +def ADDXCCri: F3_2<2, 0b011000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "addxcc">; // Section B.15 - Subtract Instructions, p. 110 -def SUBrr : F3_1<2, 0b000100, "sub">; -def SUBri : F3_2<2, 0b000100, "sub">; -def SUBCCrr : F3_1<2, 0b010100, "subcc">; -def SUBCCri : F3_2<2, 0b010100, "subcc">; -def SUBXrr : F3_1<2, 0b001100, "subx">; -def SUBXri : F3_2<2, 0b001100, "subx">; -def SUBXCCrr: F3_1<2, 0b011100, "subxcc">; -def SUBXCCri: F3_2<2, 0b011100, "subxcc">; +def SUBrr : F3_1<2, 0b000100, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sub">; +def SUBri : F3_2<2, 0b000100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sub">; +def SUBCCrr : F3_1<2, 0b010100, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "subcc">; +def SUBCCri : F3_2<2, 0b010100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "subcc">; +def SUBXrr : F3_1<2, 0b001100, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "subx">; +def SUBXri : F3_2<2, 0b001100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "subx">; +def SUBXCCrr: F3_1<2, 0b011100, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "subxcc">; +def SUBXCCri: F3_2<2, 0b011100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "subxcc">; // Section B.18 - Multiply Instructions, p. 113 -def UMULrr : F3_1<2, 0b001010, "umul">; -def UMULri : F3_2<2, 0b001010, "umul">; -def SMULrr : F3_1<2, 0b001011, "smul">; -def SMULri : F3_2<2, 0b001011, "smul">; -def UMULCCrr: F3_1<2, 0b011010, "umulcc">; -def UMULCCri: F3_2<2, 0b011010, "umulcc">; -def SMULCCrr: F3_1<2, 0b011011, "smulcc">; -def SMULCCri: F3_2<2, 0b011011, "smulcc">; +def UMULrr : F3_1<2, 0b001010, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "umul">; +def UMULri : F3_2<2, 0b001010, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "umul">; +def SMULrr : F3_1<2, 0b001011, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "smul">; +def SMULri : F3_2<2, 0b001011, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "smul">; +def UMULCCrr: F3_1<2, 0b011010, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "umulcc">; +def UMULCCri: F3_2<2, 0b011010, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "umulcc">; +def SMULCCrr: F3_1<2, 0b011011, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "smulcc">; +def SMULCCri: F3_2<2, 0b011011, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "smulcc">; // Section B.19 - Divide Instructions, p. 115 -def UDIVrr : F3_1<2, 0b001110, "udiv">; -def UDIVri : F3_2<2, 0b001110, "udiv">; -def SDIVrr : F3_1<2, 0b001111, "sdiv">; -def SDIVri : F3_2<2, 0b001111, "sdiv">; -def UDIVCCrr : F3_1<2, 0b011110, "udivcc">; -def UDIVCCri : F3_2<2, 0b011110, "udivcc">; -def SDIVCCrr : F3_1<2, 0b011111, "sdivcc">; -def SDIVCCri : F3_2<2, 0b011111, "sdivcc">; +def UDIVrr : F3_1<2, 0b001110, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "udiv">; +def UDIVri : F3_2<2, 0b001110, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "udiv">; +def SDIVrr : F3_1<2, 0b001111, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sdiv">; +def SDIVri : F3_2<2, 0b001111, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sdiv">; +def UDIVCCrr : F3_1<2, 0b011110, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "udivcc">; +def UDIVCCri : F3_2<2, 0b011110, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "udivcc">; +def SDIVCCrr : F3_1<2, 0b011111, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sdivcc">; +def SDIVCCri : F3_2<2, 0b011111, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sdivcc">; // Section B.20 - SAVE and RESTORE, p. 117 -def SAVErr : F3_1<2, 0b111100, "save">; // save r, r, r -def SAVEri : F3_2<2, 0b111100, "save">; // save r, i, r -def RESTORErr : F3_1<2, 0b111101, "restore">; // restore r, r, r -def RESTOREri : F3_2<2, 0b111101, "restore">; // restore r, i, r +def SAVErr : F3_1<2, 0b111100, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "save">; +def SAVEri : F3_2<2, 0b111100, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "save">; +def RESTORErr : F3_1<2, 0b111101, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "restore">; +def RESTOREri : F3_2<2, 0b111101, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "restore">; // Section B.21 - Branch on Integer Condition Codes Instructions, p. 119 @@ -248,12 +341,15 @@ // be an implicit def): let Defs = [O0, O1, O2, O3, O4, O5, G1, G2, G3, G4, G5, G6, G7, D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15] in - def JMPLrr : F3_1<2, 0b111000, "jmpl">; // jmpl [rs1+rs2], rd + def JMPLrr : F3_1<2, 0b111000, (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "jmpl">; + // jmpl [rs1+rs2], rd } // Section B.29 - Write State Register Instructions -def WRrr : F3_1<2, 0b110000, "wr">; // wr rs1, rs2, rd -def WRri : F3_2<2, 0b110000, "wr">; // wr rs1, imm, rd +def WRrr : F3_1<2, 0b110000, + (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "wr">; +def WRri : F3_2<2, 0b110000, + (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "wr">; // wr rs1, imm, rd // Convert Integer to Floating-point Instructions, p. 141 def FITOS : F3_3<2, 0b110100, 0b011000100, "fitos">; From lattner at cs.uiuc.edu Fri Dec 16 00:34:28 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 00:34:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/Makefile SparcV8AsmPrinter.cpp Message-ID: <200512160634.AAA22633@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: Makefile updated: 1.10 -> 1.11 SparcV8AsmPrinter.cpp updated: 1.35 -> 1.36 --- Log message: Plug in basic hooks for an autogenerated asm printer to fill in. --- Diffs of the changes: (+19 -14) Makefile | 2 +- SparcV8AsmPrinter.cpp | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) Index: llvm/lib/Target/SparcV8/Makefile diff -u llvm/lib/Target/SparcV8/Makefile:1.10 llvm/lib/Target/SparcV8/Makefile:1.11 --- llvm/lib/Target/SparcV8/Makefile:1.10 Fri Dec 16 00:06:07 2005 +++ llvm/lib/Target/SparcV8/Makefile Fri Dec 16 00:34:17 2005 @@ -13,7 +13,7 @@ # Make sure that tblgen is run, first thing. BUILT_SOURCES = SparcV8GenRegisterInfo.h.inc SparcV8GenRegisterNames.inc \ SparcV8GenRegisterInfo.inc SparcV8GenInstrNames.inc \ - SparcV8GenInstrInfo.inc + SparcV8GenInstrInfo.inc SparcV8GenAsmWriter.inc include $(LEVEL)/Makefile.common Index: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp diff -u llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.35 llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.36 --- llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.35 Wed Aug 17 15:04:34 2005 +++ llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp Fri Dec 16 00:34:17 2005 @@ -33,7 +33,7 @@ namespace { Statistic<> EmittedInsts("asm-printer", "Number of machine instrs printed"); - struct V8Printer : public MachineFunctionPass { + struct SparcV8AsmPrinter : public MachineFunctionPass { /// Output stream on which we're printing assembly code. /// std::ostream &O; @@ -47,7 +47,7 @@ /// Mangler *Mang; - V8Printer(std::ostream &o, TargetMachine &tm) : O(o), TM(tm) { } + SparcV8AsmPrinter(std::ostream &o, TargetMachine &tm) : O(o), TM(tm) { } /// We name each basic block in a Function with a unique number, so /// that we can consistently refer to them later. This is cleared @@ -72,12 +72,15 @@ void printOperand(const MachineInstr *MI, int opNum); void printBaseOffsetPair (const MachineInstr *MI, int i, bool brackets=true); void printMachineInstruction(const MachineInstr *MI); + bool printInstruction(const MachineInstr *MI); // autogenerated. bool runOnMachineFunction(MachineFunction &F); bool doInitialization(Module &M); bool doFinalization(Module &M); }; } // end of anonymous namespace +#include "SparcV8GenAsmWriter.inc" + /// createSparcV8CodePrinterPass - Returns a pass that prints the SparcV8 /// assembly code for a MachineFunction to the given output stream, /// using the given target machine description. This should work @@ -85,7 +88,7 @@ /// FunctionPass *llvm::createSparcV8CodePrinterPass (std::ostream &o, TargetMachine &tm) { - return new V8Printer(o, tm); + return new SparcV8AsmPrinter(o, tm); } /// toOctal - Convert the low order bits of X into an octal digit. @@ -131,7 +134,7 @@ // Print out the specified constant, without a storage class. Only the // constants valid in constant expressions can occur here. -void V8Printer::emitConstantValueOnly(const Constant *CV) { +void SparcV8AsmPrinter::emitConstantValueOnly(const Constant *CV) { if (CV->isNullValue() || isa (CV)) O << "0"; else if (const ConstantBool *CB = dyn_cast(CV)) { @@ -204,7 +207,7 @@ // Print a constant value or values, with the appropriate storage class as a // prefix. -void V8Printer::emitGlobalConstant(const Constant *CV) { +void SparcV8AsmPrinter::emitGlobalConstant(const Constant *CV) { const TargetData &TD = TM.getTargetData(); if (const ConstantArray *CVA = dyn_cast(CV)) { @@ -299,7 +302,7 @@ /// used to print out constants which have been "spilled to memory" by /// the code generator. /// -void V8Printer::printConstantPool(MachineConstantPool *MCP) { +void SparcV8AsmPrinter::printConstantPool(MachineConstantPool *MCP) { const std::vector &CP = MCP->getConstants(); const TargetData &TD = TM.getTargetData(); @@ -318,7 +321,7 @@ /// runOnMachineFunction - This uses the printMachineInstruction() /// method to print assembly for each instruction. /// -bool V8Printer::runOnMachineFunction(MachineFunction &MF) { +bool SparcV8AsmPrinter::runOnMachineFunction(MachineFunction &MF) { // BBNumber is used here so that a given Printer will never give two // BBs the same name. (If you have a better way, please let me know!) static unsigned BBNumber = 0; @@ -355,7 +358,6 @@ for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end(); II != E; ++II) { // Print the assembly for the instruction. - O << "\t"; printMachineInstruction(II); } } @@ -364,7 +366,7 @@ return false; } -void V8Printer::printOperand(const MachineInstr *MI, int opNum) { +void SparcV8AsmPrinter::printOperand(const MachineInstr *MI, int opNum) { const MachineOperand &MO = MI->getOperand (opNum); const MRegisterInfo &RI = *TM.getRegisterInfo(); bool CloseParen = false; @@ -472,7 +474,7 @@ /// brackets is true, or may be in the form base - constant, if offset is a /// negative constant). /// -void V8Printer::printBaseOffsetPair (const MachineInstr *MI, int i, +void SparcV8AsmPrinter::printBaseOffsetPair (const MachineInstr *MI, int i, bool brackets) { if (brackets) O << "["; printOperand (MI, i); @@ -492,7 +494,10 @@ /// printMachineInstruction -- Print out a single SparcV8 LLVM instruction /// MI in GAS syntax to the current output stream. /// -void V8Printer::printMachineInstruction(const MachineInstr *MI) { +void SparcV8AsmPrinter::printMachineInstruction(const MachineInstr *MI) { + if (printInstruction(MI)) return; + O << "\t"; + unsigned Opcode = MI->getOpcode(); const TargetInstrInfo &TII = *TM.getInstrInfo(); const TargetInstrDescriptor &Desc = TII.get(Opcode); @@ -549,7 +554,7 @@ O << "\n"; } -bool V8Printer::doInitialization(Module &M) { +bool SparcV8AsmPrinter::doInitialization(Module &M) { Mang = new Mangler(M); return false; // success } @@ -566,7 +571,7 @@ } } -bool V8Printer::doFinalization(Module &M) { +bool SparcV8AsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); std::string CurSection; From lattner at cs.uiuc.edu Fri Dec 16 00:52:12 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 00:52:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp SparcV8InstrFormats.td SparcV8InstrInfo.td Message-ID: <200512160652.AAA23102@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8AsmPrinter.cpp updated: 1.36 -> 1.37 SparcV8InstrFormats.td updated: 1.4 -> 1.5 SparcV8InstrInfo.td updated: 1.41 -> 1.42 --- Log message: Switch F3_1 instructions over to use AsmStrings --- Diffs of the changes: (+146 -111) SparcV8AsmPrinter.cpp | 17 +-- SparcV8InstrFormats.td | 4 SparcV8InstrInfo.td | 236 ++++++++++++++++++++++++++++--------------------- 3 files changed, 146 insertions(+), 111 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp diff -u llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.36 llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.37 --- llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.36 Fri Dec 16 00:34:17 2005 +++ llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp Fri Dec 16 00:52:00 2005 @@ -70,7 +70,7 @@ void emitGlobalConstant(const Constant *CV); void printConstantPool(MachineConstantPool *MCP); void printOperand(const MachineInstr *MI, int opNum); - void printBaseOffsetPair (const MachineInstr *MI, int i, bool brackets=true); + void printBaseOffsetPair (const MachineInstr *MI, int i); void printMachineInstruction(const MachineInstr *MI); bool printInstruction(const MachineInstr *MI); // autogenerated. bool runOnMachineFunction(MachineFunction &F); @@ -474,9 +474,8 @@ /// brackets is true, or may be in the form base - constant, if offset is a /// negative constant). /// -void SparcV8AsmPrinter::printBaseOffsetPair (const MachineInstr *MI, int i, - bool brackets) { - if (brackets) O << "["; +void SparcV8AsmPrinter::printBaseOffsetPair (const MachineInstr *MI, int i) { + O << "["; printOperand (MI, i); if (MI->getOperand (i + 1).isImmediate()) { int Val = (int) MI->getOperand (i + 1).getImmedValue (); @@ -488,15 +487,15 @@ O << " + "; printOperand (MI, i + 1); } - if (brackets) O << "]"; + O << "]"; } /// printMachineInstruction -- Print out a single SparcV8 LLVM instruction /// MI in GAS syntax to the current output stream. /// void SparcV8AsmPrinter::printMachineInstruction(const MachineInstr *MI) { - if (printInstruction(MI)) return; O << "\t"; + if (printInstruction(MI)) return; unsigned Opcode = MI->getOpcode(); const TargetInstrInfo &TII = *TM.getInstrInfo(); @@ -523,12 +522,6 @@ printBaseOffsetPair (MI, 0); O << "\n"; return; - } else if (Opcode == V8::JMPLrr) { - printBaseOffsetPair (MI, 1, false); - O << ", "; - printOperand (MI, 0); - O << "\n"; - return; } // print non-immediate, non-register-def operands Index: llvm/lib/Target/SparcV8/SparcV8InstrFormats.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.4 llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.5 --- llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.4 Fri Dec 16 00:25:42 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrFormats.td Fri Dec 16 00:52:00 2005 @@ -58,15 +58,15 @@ // Specific F3 classes: SparcV8 manual, page 44 // -class F3_1 opVal, bits<6> op3val, dag ops, string name> : F3 { +class F3_1 opVal, bits<6> op3val, dag ops, string asmstr> : F3 { bits<8> asi = 0; // asi not currently used in SparcV8 bits<5> rs2; dag OperandList = ops; + let AsmString = asmstr; let op = opVal; let op3 = op3val; - let Name = name; let Inst{13} = 0; // i field = 0 let Inst{12-5} = asi; // address space identifier Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.41 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.42 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.41 Fri Dec 16 00:25:42 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Fri Dec 16 00:52:00 2005 @@ -51,73 +51,80 @@ let isReturn = 1, isTerminator = 1, hasDelaySlot = 1 in { let rd = I7.Num, rs1 = G0.Num, simm13 = 8 in def RET : F3_2<2, 0b111000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ret">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ret">; let rd = O7.Num, rs1 = G0.Num, simm13 = 8 in def RETL: F3_2<2, 0b111000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "retl">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "retl">; } // CMP is a special case of SUBCC where destination is ignored, by setting it to // %g0 (hardwired zero). // FIXME: should keep track of the fact that it defs the integer condition codes let rd = 0 in def CMPri: F3_2<2, 0b010100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "cmp">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "cmp">; // Section B.1 - Load Integer Instructions, p. 90 def LDSB: F3_2<3, 0b001001, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldsb">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldsb">; def LDSH: F3_2<3, 0b001010, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldsh">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldsh">; def LDUB: F3_2<3, 0b000001, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldub">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldub">; def LDUH: F3_2<3, 0b000010, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "lduh">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "lduh">; def LD : F3_2<3, 0b000000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ld">; def LDD : F3_2<3, 0b000011, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldd">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldd">; // Section B.2 - Load Floating-point Instructions, p. 92 def LDFrr : F3_1<3, 0b100000, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "ld $b, $c, $dst">; def LDFri : F3_2<3, 0b100000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ld">; def LDDFrr : F3_1<3, 0b100011, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "ldd">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "ldd $b, $c, $dst">; def LDDFri : F3_2<3, 0b100011, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ldd">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldd">; def LDFSRrr: F3_1<3, 0b100001, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "ld $b, $c, $dst">; def LDFSRri: F3_2<3, 0b100001, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ld">; // Section B.4 - Store Integer Instructions, p. 95 def STB : F3_2<3, 0b000101, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "stb">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "stb">; def STH : F3_2<3, 0b000110, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sth">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sth">; def ST : F3_2<3, 0b000100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "st">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "st">; def STD : F3_2<3, 0b000111, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "std">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "std">; // Section B.5 - Store Floating-point Instructions, p. 97 def STFrr : F3_1<3, 0b100100, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "st">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "st $b, $c, $dst">; def STFri : F3_2<3, 0b100100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "st">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "st">; def STDFrr : F3_1<3, 0b100111, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "std">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "std $b, $c, $dst">; def STDFri : F3_2<3, 0b100111, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "std">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "std">; def STFSRrr : F3_1<3, 0b100101, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "st">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "st $b, $c, $dst">; def STFSRri : F3_2<3, 0b100101, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "st">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "st">; def STDFQrr : F3_1<3, 0b100110, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "std">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "std $b, $c, $dst">; def STDFQri : F3_2<3, 0b100110, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "std">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "std">; // Section B.9 - SETHI Instruction, p. 104 def SETHIi: F2_1<0b100, "sethi">; @@ -129,149 +136,182 @@ // Section B.11 - Logical Instructions, p. 106 def ANDrr : F3_1<2, 0b000001, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "and">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "and $b, $c, $dst">; def ANDri : F3_2<2, 0b000001, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "and">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "and">; def ANDCCrr : F3_1<2, 0b010001, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "andcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "andcc $b, $c, $dst">; def ANDCCri : F3_2<2, 0b010001, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "andcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andcc">; def ANDNrr : F3_1<2, 0b000101, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "andn">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "andn $b, $c, $dst">; def ANDNri : F3_2<2, 0b000101, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "andn">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andn">; def ANDNCCrr: F3_1<2, 0b010101, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "andncc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "andncc $b, $c, $dst">; def ANDNCCri: F3_2<2, 0b010101, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "andncc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andncc">; def ORrr : F3_1<2, 0b000010, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "or">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "or $b, $c, $dst">; def ORri : F3_2<2, 0b000010, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "or">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "or">; def ORCCrr : F3_1<2, 0b010010, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "orcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "orcc $b, $c, $dst">; def ORCCri : F3_2<2, 0b010010, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "orcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orcc">; def ORNrr : F3_1<2, 0b000110, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "orn">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "orn $b, $c, $dst">; def ORNri : F3_2<2, 0b000110, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "orn">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orn">; def ORNCCrr : F3_1<2, 0b010110, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "orncc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "orncc $b, $c, $dst">; def ORNCCri : F3_2<2, 0b010110, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "orncc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orncc">; def XORrr : F3_1<2, 0b000011, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xor">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "xor $b, $c, $dst">; def XORri : F3_2<2, 0b000011, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xor">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xor">; def XORCCrr : F3_1<2, 0b010011, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xorcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "xorcc $b, $c, $dst">; def XORCCri : F3_2<2, 0b010011, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xorcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xorcc">; def XNORrr : F3_1<2, 0b000111, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xnor">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "xnor $b, $c, $dst">; def XNORri : F3_2<2, 0b000111, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xnor">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xnor">; def XNORCCrr: F3_1<2, 0b010111, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "xnorcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "xnorcc $b, $c, $dst">; def XNORCCri: F3_2<2, 0b010111, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "xnorcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xnorcc">; // Section B.12 - Shift Instructions, p. 107 def SLLrr : F3_1<2, 0b100101, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sll">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "sll $b, $c, $dst">; def SLLri : F3_2<2, 0b100101, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sll">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sll">; def SRLrr : F3_1<2, 0b100110, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "srl">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "srl $b, $c, $dst">; def SRLri : F3_2<2, 0b100110, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "srl">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "srl">; def SRArr : F3_1<2, 0b100111, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sra">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "sra $b, $c, $dst">; def SRAri : F3_2<2, 0b100111, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sra">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sra">; // Section B.13 - Add Instructions, p. 108 def ADDrr : F3_1<2, 0b000000, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "add">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "add $b, $c, $dst">; def ADDri : F3_2<2, 0b000000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "add">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "add">; def ADDCCrr : F3_1<2, 0b010000, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "addcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "addcc $b, $c, $dst">; def ADDCCri : F3_2<2, 0b010000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "addcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "addcc">; def ADDXrr : F3_1<2, 0b001000, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "addx">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "addx $b, $c, $dst">; def ADDXri : F3_2<2, 0b001000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "addx">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "addx">; def ADDXCCrr: F3_1<2, 0b011000, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "addxcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "addxcc $b, $c, $dst">; def ADDXCCri: F3_2<2, 0b011000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "addxcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "addxcc">; // Section B.15 - Subtract Instructions, p. 110 def SUBrr : F3_1<2, 0b000100, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sub">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "sub $b, $c, $dst">; def SUBri : F3_2<2, 0b000100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sub">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sub">; def SUBCCrr : F3_1<2, 0b010100, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "subcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "subcc $b, $c, $dst">; def SUBCCri : F3_2<2, 0b010100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "subcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "subcc">; def SUBXrr : F3_1<2, 0b001100, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "subx">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "subx $b, $c, $dst">; def SUBXri : F3_2<2, 0b001100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "subx">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "subx">; def SUBXCCrr: F3_1<2, 0b011100, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "subxcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "subxcc $b, $c, $dst">; def SUBXCCri: F3_2<2, 0b011100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "subxcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "subxcc">; // Section B.18 - Multiply Instructions, p. 113 def UMULrr : F3_1<2, 0b001010, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "umul">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "umul $b, $c, $dst">; def UMULri : F3_2<2, 0b001010, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "umul">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "umul">; def SMULrr : F3_1<2, 0b001011, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "smul">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "smul $b, $c, $dst">; def SMULri : F3_2<2, 0b001011, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "smul">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "smul">; def UMULCCrr: F3_1<2, 0b011010, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "umulcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "umulcc $b, $c, $dst">; def UMULCCri: F3_2<2, 0b011010, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "umulcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "umulcc">; def SMULCCrr: F3_1<2, 0b011011, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "smulcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "smulcc $b, $c, $dst">; def SMULCCri: F3_2<2, 0b011011, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "smulcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "smulcc">; // Section B.19 - Divide Instructions, p. 115 def UDIVrr : F3_1<2, 0b001110, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "udiv">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "udiv $b, $c, $dst">; def UDIVri : F3_2<2, 0b001110, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "udiv">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "udiv">; def SDIVrr : F3_1<2, 0b001111, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sdiv">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "sdiv $b, $c, $dst">; def SDIVri : F3_2<2, 0b001111, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sdiv">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sdiv">; def UDIVCCrr : F3_1<2, 0b011110, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "udivcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "udivcc $b, $c, $dst">; def UDIVCCri : F3_2<2, 0b011110, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "udivcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "udivcc">; def SDIVCCrr : F3_1<2, 0b011111, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "sdivcc">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "sdivcc $b, $c, $dst">; def SDIVCCri : F3_2<2, 0b011111, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "sdivcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sdivcc">; // Section B.20 - SAVE and RESTORE, p. 117 def SAVErr : F3_1<2, 0b111100, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "save">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "save $b, $c, $dst">; def SAVEri : F3_2<2, 0b111100, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "save">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "save">; def RESTORErr : F3_1<2, 0b111101, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "restore">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "restore $b, $c, $dst">; def RESTOREri : F3_2<2, 0b111101, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "restore">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "restore">; // Section B.21 - Branch on Integer Condition Codes Instructions, p. 119 @@ -341,15 +381,17 @@ // be an implicit def): let Defs = [O0, O1, O2, O3, O4, O5, G1, G2, G3, G4, G5, G6, G7, D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15] in - def JMPLrr : F3_1<2, 0b111000, (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "jmpl">; - // jmpl [rs1+rs2], rd + def JMPLrr : F3_1<2, 0b111000, + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "jmpl $b+$c, $dst">; } // Section B.29 - Write State Register Instructions def WRrr : F3_1<2, 0b110000, - (ops IntRegs:$a, IntRegs:$b, IntRegs:$c), "wr">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "wr $b, $c, $dst">; def WRri : F3_2<2, 0b110000, - (ops IntRegs:$a, IntRegs:$b, i32imm:$c), "wr">; // wr rs1, imm, rd + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "wr">; // wr rs1, imm, rd // Convert Integer to Floating-point Instructions, p. 141 def FITOS : F3_3<2, 0b110100, 0b011000100, "fitos">; From lattner at cs.uiuc.edu Fri Dec 16 01:10:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 01:10:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp SparcV8InstrFormats.td SparcV8InstrInfo.td Message-ID: <200512160710.BAA23236@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8AsmPrinter.cpp updated: 1.37 -> 1.38 SparcV8InstrFormats.td updated: 1.5 -> 1.6 SparcV8InstrInfo.td updated: 1.42 -> 1.43 --- Log message: Autogenerate asmprinter for F3_2 instructions --- Diffs of the changes: (+129 -127) SparcV8AsmPrinter.cpp | 51 ------------ SparcV8InstrFormats.td | 4 SparcV8InstrInfo.td | 201 ++++++++++++++++++++++++++++++------------------- 3 files changed, 129 insertions(+), 127 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp diff -u llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.37 llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.38 --- llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.37 Fri Dec 16 00:52:00 2005 +++ llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp Fri Dec 16 01:10:02 2005 @@ -422,40 +422,6 @@ if (CloseParen) O << ")"; } -static bool isLoadInstruction (const MachineInstr *MI) { - switch (MI->getOpcode ()) { - case V8::LDSB: - case V8::LDSH: - case V8::LDUB: - case V8::LDUH: - case V8::LD: - case V8::LDD: - case V8::LDFrr: - case V8::LDFri: - case V8::LDDFrr: - case V8::LDDFri: - return true; - default: - return false; - } -} - -static bool isStoreInstruction (const MachineInstr *MI) { - switch (MI->getOpcode ()) { - case V8::STB: - case V8::STH: - case V8::ST: - case V8::STD: - case V8::STFrr: - case V8::STFri: - case V8::STDFrr: - case V8::STDFri: - return true; - default: - return false; - } -} - static bool isPseudoInstruction (const MachineInstr *MI) { switch (MI->getOpcode ()) { case V8::PHI: @@ -507,23 +473,6 @@ O << Desc.Name << " "; - // Printing memory instructions is a special case. - // for loads: %dest = op %base, offset --> op [%base + offset], %dest - // for stores: op %base, offset, %src --> op %src, [%base + offset] - if (isLoadInstruction (MI)) { - printBaseOffsetPair (MI, 1); - O << ", "; - printOperand (MI, 0); - O << "\n"; - return; - } else if (isStoreInstruction (MI)) { - printOperand (MI, 2); - O << ", "; - printBaseOffsetPair (MI, 0); - O << "\n"; - return; - } - // print non-immediate, non-register-def operands // then print immediate operands // then print register-def operands. Index: llvm/lib/Target/SparcV8/SparcV8InstrFormats.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.5 llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.6 --- llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.5 Fri Dec 16 00:52:00 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrFormats.td Fri Dec 16 01:10:02 2005 @@ -73,14 +73,14 @@ let Inst{4-0} = rs2; } -class F3_2 opVal, bits<6> op3val, dag ops, string name> : F3 { +class F3_2 opVal, bits<6> op3val, dag ops, string asmstr> : F3 { bits<13> simm13; dag OperandList = ops; + let AsmString = asmstr; let op = opVal; let op3 = op3val; - let Name = name; let Inst{13} = 1; // i field = 1 let Inst{12-0} = simm13; Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.42 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.43 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.42 Fri Dec 16 00:52:00 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Fri Dec 16 01:10:02 2005 @@ -51,80 +51,99 @@ let isReturn = 1, isTerminator = 1, hasDelaySlot = 1 in { let rd = I7.Num, rs1 = G0.Num, simm13 = 8 in def RET : F3_2<2, 0b111000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ret">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ret $b, $c, $dst">; let rd = O7.Num, rs1 = G0.Num, simm13 = 8 in - def RETL: F3_2<2, 0b111000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "retl">; + def RETL: F3_2<2, 0b111000, (ops), + "retl">; } // CMP is a special case of SUBCC where destination is ignored, by setting it to // %g0 (hardwired zero). // FIXME: should keep track of the fact that it defs the integer condition codes let rd = 0 in def CMPri: F3_2<2, 0b010100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "cmp">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "cmp $b, $c, $dst">; // Section B.1 - Load Integer Instructions, p. 90 def LDSB: F3_2<3, 0b001001, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldsb">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ldsb [$b+$c], $dst">; def LDSH: F3_2<3, 0b001010, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldsh">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ldsh [$b+$c], $dst">; def LDUB: F3_2<3, 0b000001, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldub">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ldub [$b+$c], $dst">; def LDUH: F3_2<3, 0b000010, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "lduh">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "lduh [$b+$c], $dst">; def LD : F3_2<3, 0b000000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ld [$b+$c], $dst">; def LDD : F3_2<3, 0b000011, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldd">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ldd [$b+$c], $dst">; // Section B.2 - Load Floating-point Instructions, p. 92 def LDFrr : F3_1<3, 0b100000, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "ld $b, $c, $dst">; + "ld [$b+$c], $dst">; def LDFri : F3_2<3, 0b100000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ld [$b+$c], $dst">; def LDDFrr : F3_1<3, 0b100011, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "ldd $b, $c, $dst">; + "ldd [$b+$c], $dst">; def LDDFri : F3_2<3, 0b100011, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ldd">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ldd [$b+$c], $dst">; def LDFSRrr: F3_1<3, 0b100001, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "ld $b, $c, $dst">; + "ld [$b+$c], $dst">; def LDFSRri: F3_2<3, 0b100001, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "ld">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "ld [$b+$c], $dst">; // Section B.4 - Store Integer Instructions, p. 95 def STB : F3_2<3, 0b000101, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "stb">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "stb $src, [$base+$offset]">; def STH : F3_2<3, 0b000110, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sth">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "sth $src, [$base+$offset]">; def ST : F3_2<3, 0b000100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "st">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "st $src, [$base+$offset]">; def STD : F3_2<3, 0b000111, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "std">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "std $src, [$base+$offset]">; // Section B.5 - Store Floating-point Instructions, p. 97 def STFrr : F3_1<3, 0b100100, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "st $b, $c, $dst">; + (ops IntRegs:$base, IntRegs:$offset, IntRegs:$src), + "st $src, [$base+$offset]">; def STFri : F3_2<3, 0b100100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "st">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "st $src, [$base+$offset]">; def STDFrr : F3_1<3, 0b100111, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "std $b, $c, $dst">; + (ops IntRegs:$base, IntRegs:$offset, IntRegs:$src), + "std $src, [$base+$offset]">; def STDFri : F3_2<3, 0b100111, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "std">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "std $src, [$base+$offset]">; def STFSRrr : F3_1<3, 0b100101, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "st $b, $c, $dst">; + (ops IntRegs:$base, IntRegs:$offset, IntRegs:$src), + "st $src, [$base+$offset]">; def STFSRri : F3_2<3, 0b100101, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "st">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "st $src, [$base+$offset]">; def STDFQrr : F3_1<3, 0b100110, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "std $b, $c, $dst">; + (ops IntRegs:$base, IntRegs:$offset, IntRegs:$src), + "std $src, [$base+$offset]">; def STDFQri : F3_2<3, 0b100110, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "std">; + (ops IntRegs:$base, IntRegs:$offset, i32imm:$src), + "std $src, [$base+$offset]">; // Section B.9 - SETHI Instruction, p. 104 def SETHIi: F2_1<0b100, "sethi">; @@ -139,179 +158,212 @@ (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "and $b, $c, $dst">; def ANDri : F3_2<2, 0b000001, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "and">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "and $b, $c, $dst">; def ANDCCrr : F3_1<2, 0b010001, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "andcc $b, $c, $dst">; def ANDCCri : F3_2<2, 0b010001, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "andcc $b, $c, $dst">; def ANDNrr : F3_1<2, 0b000101, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "andn $b, $c, $dst">; def ANDNri : F3_2<2, 0b000101, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andn">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "andn $b, $c, $dst">; def ANDNCCrr: F3_1<2, 0b010101, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "andncc $b, $c, $dst">; def ANDNCCri: F3_2<2, 0b010101, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andncc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "andncc $b, $c, $dst">; def ORrr : F3_1<2, 0b000010, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "or $b, $c, $dst">; def ORri : F3_2<2, 0b000010, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "or">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "or $b, $c, $dst">; def ORCCrr : F3_1<2, 0b010010, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "orcc $b, $c, $dst">; def ORCCri : F3_2<2, 0b010010, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "orcc $b, $c, $dst">; def ORNrr : F3_1<2, 0b000110, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "orn $b, $c, $dst">; def ORNri : F3_2<2, 0b000110, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orn">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "orn $b, $c, $dst">; def ORNCCrr : F3_1<2, 0b010110, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "orncc $b, $c, $dst">; def ORNCCri : F3_2<2, 0b010110, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orncc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "orncc $b, $c, $dst">; def XORrr : F3_1<2, 0b000011, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "xor $b, $c, $dst">; def XORri : F3_2<2, 0b000011, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xor">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "xor $b, $c, $dst">; def XORCCrr : F3_1<2, 0b010011, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "xorcc $b, $c, $dst">; def XORCCri : F3_2<2, 0b010011, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xorcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "xorcc $b, $c, $dst">; def XNORrr : F3_1<2, 0b000111, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "xnor $b, $c, $dst">; def XNORri : F3_2<2, 0b000111, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xnor">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "xnor $b, $c, $dst">; def XNORCCrr: F3_1<2, 0b010111, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "xnorcc $b, $c, $dst">; def XNORCCri: F3_2<2, 0b010111, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xnorcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "xnorcc $b, $c, $dst">; // Section B.12 - Shift Instructions, p. 107 def SLLrr : F3_1<2, 0b100101, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "sll $b, $c, $dst">; def SLLri : F3_2<2, 0b100101, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sll">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "sll $b, $c, $dst">; def SRLrr : F3_1<2, 0b100110, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "srl $b, $c, $dst">; def SRLri : F3_2<2, 0b100110, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "srl">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "srl $b, $c, $dst">; def SRArr : F3_1<2, 0b100111, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "sra $b, $c, $dst">; def SRAri : F3_2<2, 0b100111, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sra">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "sla $b, $c, $dst">; // Section B.13 - Add Instructions, p. 108 def ADDrr : F3_1<2, 0b000000, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "add $b, $c, $dst">; def ADDri : F3_2<2, 0b000000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "add">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "add $b, $c, $dst">; def ADDCCrr : F3_1<2, 0b010000, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "addcc $b, $c, $dst">; def ADDCCri : F3_2<2, 0b010000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "addcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "addcc $b, $c, $dst">; def ADDXrr : F3_1<2, 0b001000, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "addx $b, $c, $dst">; def ADDXri : F3_2<2, 0b001000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "addx">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "addx $b, $c, $dst">; def ADDXCCrr: F3_1<2, 0b011000, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "addxcc $b, $c, $dst">; def ADDXCCri: F3_2<2, 0b011000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "addxcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "addxcc $b, $c, $dst">; // Section B.15 - Subtract Instructions, p. 110 def SUBrr : F3_1<2, 0b000100, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "sub $b, $c, $dst">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "sub $b, $c, $dst">; def SUBri : F3_2<2, 0b000100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sub">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "sub $b, $c, $dst">; def SUBCCrr : F3_1<2, 0b010100, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "subcc $b, $c, $dst">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "subcc $b, $c, $dst">; def SUBCCri : F3_2<2, 0b010100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "subcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "subcc $b, $c, $dst">; def SUBXrr : F3_1<2, 0b001100, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "subx $b, $c, $dst">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "subx $b, $c, $dst">; def SUBXri : F3_2<2, 0b001100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "subx">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "subx $b, $c, $dst">; def SUBXCCrr: F3_1<2, 0b011100, - (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "subxcc $b, $c, $dst">; + (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), + "subxcc $b, $c, $dst">; def SUBXCCri: F3_2<2, 0b011100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "subxcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "subxcc $b, $c, $dst">; // Section B.18 - Multiply Instructions, p. 113 def UMULrr : F3_1<2, 0b001010, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "umul $b, $c, $dst">; def UMULri : F3_2<2, 0b001010, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "umul">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "umul $b, $c, $dst">; def SMULrr : F3_1<2, 0b001011, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "smul $b, $c, $dst">; def SMULri : F3_2<2, 0b001011, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "smul">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "smul $b, $c, $dst">; def UMULCCrr: F3_1<2, 0b011010, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "umulcc $b, $c, $dst">; def UMULCCri: F3_2<2, 0b011010, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "umulcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "umulcc $b, $c, $dst">; def SMULCCrr: F3_1<2, 0b011011, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "smulcc $b, $c, $dst">; def SMULCCri: F3_2<2, 0b011011, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "smulcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "smulcc $b, $c, $dst">; // Section B.19 - Divide Instructions, p. 115 def UDIVrr : F3_1<2, 0b001110, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "udiv $b, $c, $dst">; def UDIVri : F3_2<2, 0b001110, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "udiv">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "udiv $b, $c, $dst">; def SDIVrr : F3_1<2, 0b001111, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "sdiv $b, $c, $dst">; def SDIVri : F3_2<2, 0b001111, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sdiv">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "sdiv $b, $c, $dst">; def UDIVCCrr : F3_1<2, 0b011110, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "udivcc $b, $c, $dst">; def UDIVCCri : F3_2<2, 0b011110, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "udivcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "udivcc $b, $c, $dst">; def SDIVCCrr : F3_1<2, 0b011111, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "sdivcc $b, $c, $dst">; def SDIVCCri : F3_2<2, 0b011111, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "sdivcc">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "sdivcc $b, $c, $dst">; // Section B.20 - SAVE and RESTORE, p. 117 def SAVErr : F3_1<2, 0b111100, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "save $b, $c, $dst">; def SAVEri : F3_2<2, 0b111100, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "save">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "save $b, $c, $dst">; def RESTORErr : F3_1<2, 0b111101, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "restore $b, $c, $dst">; def RESTOREri : F3_2<2, 0b111101, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "restore">; + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "restore $b, $c, $dst">; // Section B.21 - Branch on Integer Condition Codes Instructions, p. 119 @@ -391,7 +443,8 @@ (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), "wr $b, $c, $dst">; def WRri : F3_2<2, 0b110000, - (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "wr">; // wr rs1, imm, rd + (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), + "wr $b, $c, $dst">; // Convert Integer to Floating-point Instructions, p. 141 def FITOS : F3_3<2, 0b110100, 0b011000100, "fitos">; From lattner at cs.uiuc.edu Fri Dec 16 01:13:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 01:13:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp SparcV8InstrInfo.td Message-ID: <200512160713.BAA23403@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8AsmPrinter.cpp updated: 1.38 -> 1.39 SparcV8InstrInfo.td updated: 1.43 -> 1.44 --- Log message: asmprint pseudo instrs --- Diffs of the changes: (+10 -24) SparcV8AsmPrinter.cpp | 17 ----------------- SparcV8InstrInfo.td | 17 ++++++++++------- 2 files changed, 10 insertions(+), 24 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp diff -u llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.38 llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.39 --- llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.38 Fri Dec 16 01:10:02 2005 +++ llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp Fri Dec 16 01:13:26 2005 @@ -422,19 +422,6 @@ if (CloseParen) O << ")"; } -static bool isPseudoInstruction (const MachineInstr *MI) { - switch (MI->getOpcode ()) { - case V8::PHI: - case V8::ADJCALLSTACKUP: - case V8::ADJCALLSTACKDOWN: - case V8::IMPLICIT_USE: - case V8::IMPLICIT_DEF: - return true; - default: - return false; - } -} - /// printBaseOffsetPair - Print two consecutive operands of MI, starting at #i, /// which form a base + offset pair (which may have brackets around it, if /// brackets is true, or may be in the form base - constant, if offset is a @@ -467,10 +454,6 @@ const TargetInstrInfo &TII = *TM.getInstrInfo(); const TargetInstrDescriptor &Desc = TII.get(Opcode); - // If it's a pseudo-instruction, comment it out. - if (isPseudoInstruction (MI)) - O << "! "; - O << Desc.Name << " "; // print non-immediate, non-register-def operands Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.43 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.44 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.43 Fri Dec 16 01:10:02 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Fri Dec 16 01:13:26 2005 @@ -35,16 +35,19 @@ //===----------------------------------------------------------------------===// // Pseudo instructions. -class PseudoInstV8 : InstV8 { - let Name = nm; +class PseudoInstV8 : InstV8 { + let AsmString = asmstr; dag OperandList = ops; } def PHI : PseudoInstV8<"PHI", (ops variable_ops)>; -def ADJCALLSTACKDOWN : PseudoInstV8<"ADJCALLSTACKDOWN", (ops variable_ops)>; -def ADJCALLSTACKUP : PseudoInstV8<"ADJCALLSTACKUP", (ops variable_ops)>; -def IMPLICIT_USE : PseudoInstV8<"IMPLICIT_USE", (ops variable_ops)>; -def IMPLICIT_DEF : PseudoInstV8<"IMPLICIT_DEF", (ops variable_ops)>; -def FpMOVD : PseudoInstV8<"FpMOVD", (ops)>; // pseudo 64-bit double move +def ADJCALLSTACKDOWN : PseudoInstV8<"!ADJCALLSTACKDOWN $amt", + (ops i32imm:$amt)>; +def ADJCALLSTACKUP : PseudoInstV8<"!ADJCALLSTACKUP $amt", + (ops i32imm:$amt)>; +//def IMPLICIT_USE : PseudoInstV8<"!IMPLICIT_USE",(ops variable_ops)>; +def IMPLICIT_DEF : PseudoInstV8<"!IMPLICIT_DEF $dst", + (ops IntRegs:$dst)>; +def FpMOVD : PseudoInstV8<"!FpMOVD", (ops)>; // pseudo 64-bit double move // Section A.3 - Synthetic Instructions, p. 85 // special cases of JMPL: From lattner at cs.uiuc.edu Fri Dec 16 01:16:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 01:16:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp Message-ID: <200512160716.BAA23471@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8AsmPrinter.cpp updated: 1.39 -> 1.40 --- Log message: remove some dead code --- Diffs of the changes: (+0 -22) SparcV8AsmPrinter.cpp | 22 ---------------------- 1 files changed, 22 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp diff -u llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.39 llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.40 --- llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp:1.39 Fri Dec 16 01:13:26 2005 +++ llvm/lib/Target/SparcV8/SparcV8AsmPrinter.cpp Fri Dec 16 01:16:02 2005 @@ -70,7 +70,6 @@ void emitGlobalConstant(const Constant *CV); void printConstantPool(MachineConstantPool *MCP); void printOperand(const MachineInstr *MI, int opNum); - void printBaseOffsetPair (const MachineInstr *MI, int i); void printMachineInstruction(const MachineInstr *MI); bool printInstruction(const MachineInstr *MI); // autogenerated. bool runOnMachineFunction(MachineFunction &F); @@ -422,27 +421,6 @@ if (CloseParen) O << ")"; } -/// printBaseOffsetPair - Print two consecutive operands of MI, starting at #i, -/// which form a base + offset pair (which may have brackets around it, if -/// brackets is true, or may be in the form base - constant, if offset is a -/// negative constant). -/// -void SparcV8AsmPrinter::printBaseOffsetPair (const MachineInstr *MI, int i) { - O << "["; - printOperand (MI, i); - if (MI->getOperand (i + 1).isImmediate()) { - int Val = (int) MI->getOperand (i + 1).getImmedValue (); - if (Val != 0) { - O << ((Val >= 0) ? " + " : " - "); - O << ((Val >= 0) ? Val : -Val); - } - } else { - O << " + "; - printOperand (MI, i + 1); - } - O << "]"; -} - /// printMachineInstruction -- Print out a single SparcV8 LLVM instruction /// MI in GAS syntax to the current output stream. /// From lattner at cs.uiuc.edu Fri Dec 16 01:18:59 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 01:18:59 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8InstrFormats.td SparcV8InstrInfo.td Message-ID: <200512160718.BAA23531@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8InstrFormats.td updated: 1.6 -> 1.7 SparcV8InstrInfo.td updated: 1.44 -> 1.45 --- Log message: Add a couple more instrs --- Diffs of the changes: (+8 -4) SparcV8InstrFormats.td | 6 ++++-- SparcV8InstrInfo.td | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8InstrFormats.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.6 llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.7 --- llvm/lib/Target/SparcV8/SparcV8InstrFormats.td:1.6 Fri Dec 16 01:10:02 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrFormats.td Fri Dec 16 01:18:48 2005 @@ -21,11 +21,13 @@ // Specific F2 classes: SparcV8 manual, page 44 // -class F2_1 op2Val, string name> : F2 { +class F2_1 op2Val, dag ops, string asmstr> : F2 { bits<5> rd; + dag OperandList = ops; + let AsmString = asmstr; + let op2 = op2Val; - let Name = name; let Inst{29-25} = rd; } Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.44 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.45 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.44 Fri Dec 16 01:13:26 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Fri Dec 16 01:18:48 2005 @@ -149,12 +149,14 @@ "std $src, [$base+$offset]">; // Section B.9 - SETHI Instruction, p. 104 -def SETHIi: F2_1<0b100, "sethi">; +def SETHIi: F2_1<0b100, + (ops IntRegs:$dst, i32imm:$src), + "sethi $src, $dst">; // Section B.10 - NOP Instruction, p. 105 // (It's a special case of SETHI) let rd = 0, imm22 = 0 in - def NOP : F2_1<0b100, "nop">; + def NOP : F2_1<0b100, (ops), "nop">; // Section B.11 - Logical Instructions, p. 106 def ANDrr : F3_1<2, 0b000001, From lattner at cs.uiuc.edu Fri Dec 16 01:21:04 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Dec 2005 01:21:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/README.txt Message-ID: <200512160721.BAA23588@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: README.txt updated: 1.36 -> 1.37 --- Log message: add some notes --- Diffs of the changes: (+10 -1) README.txt | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletion(-) Index: llvm/lib/Target/SparcV8/README.txt diff -u llvm/lib/Target/SparcV8/README.txt:1.36 llvm/lib/Target/SparcV8/README.txt:1.37 --- llvm/lib/Target/SparcV8/README.txt:1.36 Tue Dec 14 03:10:10 2004 +++ llvm/lib/Target/SparcV8/README.txt Fri Dec 16 01:20:53 2005 @@ -1,4 +1,13 @@ +Meta TODO list: +1. Convert all instructions to use autogeneration for asm strings. +2. Convert asmprinter to use lib/CodeGen/AsmPrinter for global init printing + constant pool printing, etc. +3. Create a new DAG -> DAG instruction selector, by adding patterns to the + instructions. +4. profit! + + SparcV8 backend skeleton ------------------------ @@ -74,5 +83,5 @@ * Generate fsqrtd for calls to sqrt() (~ 4% speedup on Olden/tsp). -$Date: 2004/12/14 09:10:10 $ +$Date: 2005/12/16 07:20:53 $ From natebegeman at mac.com Fri Dec 16 03:19:26 2005 From: natebegeman at mac.com (Nate Begeman) Date: Fri, 16 Dec 2005 03:19:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrInfo.td PPCRegisterInfo.td Message-ID: <200512160919.DAA20834@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrInfo.td updated: 1.159 -> 1.160 PPCRegisterInfo.td updated: 1.26 -> 1.27 --- Log message: Add a second vector type to the VRRC register class, and fix some patterns so that tablegen can infer all types. --- Diffs of the changes: (+6 -6) PPCInstrInfo.td | 6 +++--- PPCRegisterInfo.td | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.159 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.160 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.159 Wed Dec 14 16:54:33 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Fri Dec 16 03:19:13 2005 @@ -946,11 +946,11 @@ (srl GPRC:$rS, (sub 32, GPRC:$rB))), (RLWNM GPRC:$rS, GPRC:$rB, 0, 31)>; -def : Pat<(zext GPRC:$in), +def : Pat<(i64 (zext GPRC:$in)), (RLDICL (OR4To8 GPRC:$in, GPRC:$in), 0, 32)>; -def : Pat<(anyext GPRC:$in), +def : Pat<(i64 (anyext GPRC:$in)), (OR4To8 GPRC:$in, GPRC:$in)>; -def : Pat<(trunc G8RC:$in), +def : Pat<(i32 (trunc G8RC:$in)), (OR8To4 G8RC:$in, G8RC:$in)>; // SHL Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.td diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.26 llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.27 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.26 Wed Nov 30 22:51:06 2005 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.td Fri Dec 16 03:19:13 2005 @@ -191,9 +191,9 @@ F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31]>; -def VRRC : RegisterClass<"PPC", [v4f32], 128, [V0, V1, V2, V3, V4, V5, V6, V7, - V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, - V24, V25, V26, V27, V28, V29, V30, V31]>; +def VRRC : RegisterClass<"PPC", [v4f32,v4i32], 128, [V0, V1, V2, V3, V4, V5, + V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, + V22, V23, V24, V25, V26, V27, V28, V29, V30, V31]>; def CRRC : RegisterClass<"PPC", [i32], 32, [CR0, CR1, CR5, CR6, CR7, CR2, CR3, CR4]>; From bpankaj2 at cs.uiuc.edu Fri Dec 16 11:44:51 2005 From: bpankaj2 at cs.uiuc.edu (Balpreet Pankaj) Date: Fri, 16 Dec 2005 11:44:51 -0600 Subject: [llvm-commits] CVS: llvm-www/pubs/2005-TR-DSAEvaluation.html 2005-TR-DSAEvaluation.pdf 2005-TR-DSAEvaluation.ps index.html Message-ID: <200512161744.LAA31655@apoc.cs.uiuc.edu> Changes in directory llvm-www/pubs: 2005-TR-DSAEvaluation.html added (r1.1) 2005-TR-DSAEvaluation.pdf added (r1.1) 2005-TR-DSAEvaluation.ps added (r1.1) index.html updated: 1.33 -> 1.34 --- Log message: --- Diffs of the changes: (+126263 -0) 2005-TR-DSAEvaluation.html | 74 2005-TR-DSAEvaluation.pdf | 0 2005-TR-DSAEvaluation.ps |126183 +++++++++++++++++++++++++++++++++++++++++++++ index.html | 6 4 files changed, 126263 insertions(+) Index: llvm-www/pubs/2005-TR-DSAEvaluation.html diff -c /dev/null llvm-www/pubs/2005-TR-DSAEvaluation.html:1.1 *** /dev/null Fri Dec 16 11:44:40 2005 --- llvm-www/pubs/2005-TR-DSAEvaluation.html Fri Dec 16 11:44:27 2005 *************** *** 0 **** --- 1,74 ---- + + + + + + How Successful is Data Structure Analysis in Isolating and Analyzing + Linked Data Structures? + + + +
+ How Successful is Data Structure Analysis in Isolating and Analyzing + Linked Data Structures? +
+
+ Patrick Meredith, Balpreet Pankaj, Swarup Sahoo, + Chris Lattner and + Vikram Adve +
+ +

Abstract:

+
+ This report describes a set of experiments to evaluate qualitatively the + effectiveness of Data Structure Analysis (DSA) in identifying properties of a + program's data structures. We manually inspected several benchmarks to + identify linked data structures and their properties, and compared these + against the results produced by DSA. The properties we considered are those + that were the primary goals of DSA: + distinguishing different kinds of data structures, + distinct instances of a particular kind, + type information for objects within an LDS, + and information about the lifetime of such objects (particularly, those + local to a function rather than global). + We define a set of metrics for the DS graphs computed by DSA that we use to + summarize our results concisely for each benchmark. + The results of the study are summarized in the last section. +
+ + + +

Download:

+

Paper:

+ + +

BibTeX Entry:

+
+   @TechReport{DSAEvaluation:TR05,
+     Author     = {Patrick Meredith and Balpreet Pankaj and Swarup Sahoo and
+ 		  Chris Lattner and Vikram Adve}, 
+     Title      = "How Successful Is Data Structure Analysis in Isolating and  
+ Analyzing Linked Data Structures?",
+     Institution= {Computer Science Dept.,
+                   Univ. of Illinois at Urbana-Champaign},
+     Number     = {UIUCDCS-R-2005-2658},
+     Type       = {Tech. Report},
+     Month      = {Nov},
+     Year       = {2005}
+ }
+ 
+ + +
+ Valid CSS! + Valid HTML 4.01! + + + Index: llvm-www/pubs/2005-TR-DSAEvaluation.pdf Index: llvm-www/pubs/2005-TR-DSAEvaluation.ps diff -c /dev/null llvm-www/pubs/2005-TR-DSAEvaluation.ps:1.1 *** /dev/null Fri Dec 16 11:44:49 2005 --- llvm-www/pubs/2005-TR-DSAEvaluation.ps Fri Dec 16 11:44:27 2005 *************** *** 0 **** --- 1,126183 ---- + %!PS-Adobe-2.0 + %%Creator: dvips(k) 5.90a Copyright 2002 Radical Eye Software + %%Title: dsa-evaluation-tr.dvi + %%Pages: 25 + %%PageOrder: Ascend + %%BoundingBox: 0 0 612 792 + %%DocumentFonts: CMR17 CMR12 CMTI12 CMSY10 CMTT12 CMBX10 CMR10 CMTI10 + %%+ CMBX12 CMMI10 CMR8 CMTT10 CMR9 CMTI9 + %%EndComments + %DVIPSWebPage: (www.radicaleye.com) + %DVIPSCommandLine: dvips -o dsa-evaluation-tr.ps dsa-evaluation-tr.dvi + %+ -t letter + %DVIPSParameters: dpi=1200, compressed + %DVIPSSource: TeX output 2005.12.16:1021 + %%BeginProcSet: texc.pro + %! + /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S + N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 + mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 + 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ + landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize + mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ + matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round + exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ + statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] + N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin + /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array + /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 + array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N + df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A + definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get + }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} + B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr + 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 + 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx + 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx + sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ + rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp + gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B + /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ + /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ + A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy + get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} + ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp + fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 + {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add + chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ + 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} + forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn + /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put + }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ + bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A + mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ + SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ + userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X + 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 + index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N + /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ + /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) + (LaserWriter 16/600)]{A length product length le{A length product exch 0 + exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse + end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask + grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} + imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round + exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto + fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p + delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} + B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ + p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S + rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + + %%EndProcSet + %%BeginProcSet: texps.pro + %! + TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 + index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll + exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics + exch def dict begin Encoding{exch dup type/integertype ne{pop pop 1 sub + dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def} + ifelse}forall Metrics/Metrics currentdict end def[2 index currentdict + end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{ + dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 + roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def + dup[exch{dup CharStrings exch known not{pop/.notdef/Encoding true def} + if}forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def} + def end + + %%EndProcSet + %%BeginProcSet: special.pro + %! + TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N + /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N + /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N + /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ + /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho + X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B + /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ + /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known + {userdict/md get type/dicttype eq{userdict begin md length 10 add md + maxlength ge{/md md dup length 20 add dict copy def}if end md begin + /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S + atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ + itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll + transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll + curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf + pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} + if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 + -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 + get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip + yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub + neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ + noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop + 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get + neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr + 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr + 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 + -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S + TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ + Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale + }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState + save N userdict maxlength dict begin/magscale true def normalscale + currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts + /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x + psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx + psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub + TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def + @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll + newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto + closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N + /@beginspecial{SDict begin/SpecialSave save N gsave normalscale + currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} + N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs + neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate + rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse + scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg + lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx + ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N + /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ + pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave + restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B + /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 + setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY + moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix + matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc + savematrix setmatrix}N end + + %%EndProcSet + %%BeginFont: CMTI9 + %!PS-AdobeFont-1.1: CMTI9 1.0 + %%CreationDate: 1991 Aug 18 21:08:07 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTI9) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMTI9 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 46 /period put + dup 65 /A put + dup 67 /C put + dup 68 /D put + dup 71 /G put + dup 73 /I put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 83 /S put + dup 84 /T put + dup 97 /a put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 105 /i put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 121 /y put + dup 122 /z put + readonly def + /FontBBox{-35 -250 1148 750}readonly def + /UniqueID 5000827 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 + 9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496 + 4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D + DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A + F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458 + 8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6 + 03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9 + 211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3 + E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B + D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1 + 6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9 + 0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC + 1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2 + 298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D + C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574 + 433484BA1466709A4B186761655C8E482833B697673E847C691079E7F1DCB8D6 + 1AD91101D757B83E2090337D525AEECB028FB3C9F6A6E6AD2F322CFDC5A833E6 + 1CE4EDBF41FD34FD61630581D222F854A76C2EA9FD72796A7C9CC1F6C2FCCD16 + E95CA05826A4ECFADA6A5FB83C41A7131E52BA6585DD6DD78515D8F7327DFC6F + 9404F893B4C90AD8CFC3B4867F335A197B1302B529BAA59D03067B67F9120ECD + F6BF90F1F66DE616FDA9F8383895181AFFE959970D8C64B22C2E1128F254120B + D743E2C7ECD279ABCCB8A87997932ACB06073D36F4E3D2F786697D6A07503871 + 7D08B42006DDFF620B0F07B8F85EFD9F418087E6225AC723AF777D58BAA52606 + FDB39B0FEAF7EA827CCE2B0A4D163340A11F101D9DC7BCECC69C7BD0FD3E71A4 + F2EED1DDB0BAD46826FC19FC8C3FF092390E99AA7168B7BA18AD7D6C59FF8EF7 + B2F8EC7D5919C9CEBED14098D89BD237E095345B6EA56DA746A19C95DEF815C5 + EBEA948F2CB82E6045AC8E168BF5853FCAFB35A92FE89166F6225DB886B0CF17 + 6275E6C8567E5B84EF68082DAD53D2B88ED26D32E91622C2CD27CACF33279F54 + 7D8444C1D0EAEACD9AD8FA61DA4D4594343B87E972D10998755D5F093B000BB0 + 2F7D45C0AA775CF342E316D686544DBFDED9769FB5545BDC7C9069AA7A8685A6 + 87928EE392AF99DD94F21C45892E91A427CABAC829CE8E92D59492BE8C2B03CE + A15220556E9FB7B98A502957AA9FDABF8E300C780EFA615363BE5CCBD50A46AE + 1D0A4DC50D632C9538BB5A1804DAB73669BCDC323CC846D69CC5DFF3C2E143A5 + 45FAA0DA8285A6BAD3A5BE2994A5D3A3439EB85A6E8375D8180F350B4F34A5FD + B3E023F5207AB785179FFE5B2753E8DBD699C53A0C7E6BF56E4DEFCF40A8D3BF + 1C52DE9156C81864B120BD03A60249ECBCD5B9B4A438CABA954674AF5E86CDEA + EB44476A22F8882890760894832502FEF71BCB0E4DD0662F0D694D9F7438CFFA + A457AE3D933217C55E5C33677759FC8E6856EBCF18DC80098DF628C011A26554 + 0D46717C9FF3314CCA61999B7A240B13B95E30479DD0A493ED7DFF173B5B5C13 + 9273572EC8D82374C43A64DF502EBC7076BF099EFB09AB9F852AD112DA365E78 + 4AD9980AD01441294DEE7B4944E63FE03259257D0BBCED4D1F7BE1F1521B50A9 + 6DA82667A9A927793842493317AECE5C4AA6D4D201C4BFFCCC14311C16B33CF2 + 68AC942E4353ADE1A7E3644F3ACF3F05EF017DA7F71D41BCD4B501F0F2BCB0B1 + 1F7BAE114CE4A4FE80A4CF8930FE6E347A65C1C38B467EE1A8C12557925A6F95 + E63DF635C474FAA0947CE94C0D58811D7BFF00175DFEE737046A42C07FC24FEE + 05E072404C138043E5F9CA9EBC90201BE841FF363DE034E3BE3EBE8434246881 + C8F389A30BDE77B582632D7B832923E0EE6C0588718C62E45C3BB1BF747989CE + 3FAA8784B216AF85E1260BECB687B934C4941D743082B49FAAE027A6A5C96095 + 8E9A6EBE0B2133EDD84671F440F80EAAB020FF07E602433287D5E0586F147593 + 8453BFBBA4BE657AE4CAC03C58433A3DAC87120C0AD613B5EDA9CE8ABB32DAF9 + 5AC5F44676D8E8B693446C6CB08E7248ABAAF6DCB3D591A5CA1E3A349F3A481C + A083368D752E585B4655124285D421FF79AFB25A5FAF844349E12F4F24679BDC + 536318ABA852749C4CE83363962DB7FB4F0AD32C015B5D1DEA0E83180E50CF08 + 4D627DF4DCFFA3C94B6A8773578F63D3A453D3578AE575156812C0BA65A30B84 + 65FCD2D59D50173A041D1323C8D81D47D6D93D446FAB61C55D01C8A09141FAA1 + B5C12983F1B85E473ABDB4966481A62E5DB839CC80328847F3741F1E80ACF5B1 + 580587AA72C939D1A9B691F783EFDAB6CED31B77F1F680A86488B9975D41A8BD + 3BD159D01B9ACF95D46180BD3FCC0373BEC40F8060521E00E7621F1ECC5D5691 + 2A766218ABE6035035632A931F383B390082241B47745BF6247EA51DC004504D + 4A18699F3036A9AFC14B8A1EB35C55CEDEBD7C855FD0C60D930561B48AAC3D1C + 1C976620530864EC5ED860C59107BD2CAD8E996104951F876B03DC83A593E3FB + 41568B904E0B583B71D917EAA1D7DF200BB76B012291B221FD85DF0CD9B5C6C1 + 791BD7301F0986EAA7168FFBEFCDE9D5001E9883D27D5CBD8E57082785B52574 + FA0F09CAFC20768A7E58B2F6C8BBAD1F314F008D19D6CDE6D0D539C0E823FD5C + C60940807728BA5513161C3C76EDC6F415E31DA50DB3692E52098ACDCDAAD401 + 649D709428071EBD5D9E30C8604A0D3FF8B959EA5C264922EC1B197751C42D7F + 742F386FB770FF12D75C4A0F9EB0084F684D6F4C2D43D38AE5160DA6D12114AD + 1FA5F1B9C6B2A3BF8B9D1A9D61848075393C8443AB08C6AAD3642F9B9BBF11FD + 5BF4AA81585A739F7EA7727A892C604D18A480012746F952DBD9A416D7463BEF + 7198327BB4FB52BFEB6621DB3A13177A93C0D97D484F9E122B2A790F0AA86CCA + 3D5BB673565E46E91C2D298B01ECF80347919AEF1F9B9AE13C8BDF2641E159A7 + 33E8EB2B1D51841C7CEFED078ADE2D338042C647ED9D05D3AB3F2C5FC1AE3356 + BED92361683AC33E8987D755DCB8126F0FFF4D64514DC06FA6B2C3A9F024710F + F6CBA54042464E1D6B94B3A656DFCC250364F98EF18EB82BF15640BF9A9D6419 + 0CB0441FEB714596703973E20AB23CEA29D76A49794A94534F15695A4CA440DC + 8B0DFF37D3C476A6B88966F38012619F990892A6D4D5DA9B5403832AD7F3182B + 4D11EB028B25E905ACA66D17D39959DC8B97632FDC70F408C4CE0FD82DD4A768 + E016E4CE42F00C4627ADF5A56F3E2D4F4609FA2D8A100D85BEA81DA94B7D2782 + DD0B41AB3D09897F6870195A8AA9C92B6ABE508CB317A268BCB66EE683378DAD + 3F0959DF7CEC858731BC8E26BDA37D7F9E371BA829CFD56980480BD1BFAF659B + F152374B2911EC7D56E9145FCC42040DB24F964D0FC9A237099E759E3B88EF70 + 944E1240D47CB17B0D8D54B8FBE6AFF78B3AD5E03DD7A38F850F84A8C4DDF5E4 + 98ACEAEB315D7FB3E5040C336C58B00FABD47AF70AB37A74B7CC51010CE1CF3F + 4E4B2143E8B2B2F816879FF7526AAAC002EAE48B73E851545112343C0B37C616 + 81F3E1839F339F0CA2B5F8BA5491F1F620E01DEA2683FD7F16813BB026E316A7 + 0CB91EDC201EE247D7B1C098602B4019AD349E535022863DF45FE19C479F3127 + D0789254C867C06D4945B08CF4024EAD33D6394AEAB5A322C08991E60F6DC9B8 + C966A07659D688D3E0DE09BBF1D6655B74C6AF4E466C707793CA8C2D46946F5B + 7D740D366486777A172009BDE6C3DC33A3861A770B8333350E32FFEB3AD81038 + 82D833DE35F66D6BF92CAD7B591B9970D2521FB0F696B92A5787C6E274369084 + D830DE61317AD27E58606F06483C1F47378C105BA1470FF0F0C992CE3D236EB0 + E98F0ABB629BEFAA1AC40BBC33C25A65C42366B439CCFB5B7CBFC0A62FDC47BB + E72136697D19B9FF68BA0E8698300BA5C007B4F0F0A477DE60055F3828CE068D + 8DC1DA7406DB0D29EB4B0C8426B21F67DEC89564977631862AAC6E6F64CD8B97 + B1EB4FEDA46AD6555E5B9615FAD7FD7BDB537309E068B843C39CE352230E58D1 + E3D9538BF4AB6E6AD788E8809E195543C479444C79D167F5AE1ED7851C2A8EA4 + 5E977F329BFA05E1A493747EF9CC0780DB2AF19E9A3E2CCC83DFBA38A9845047 + EC9FEC5BB6C834D1C1CBF42C937AE412732C8EEDB01CCAEBFA4ACD02998A9C0B + 0BEEF6FBFC813F3E6AE84A29F772ECEA6302EAF619820D9B912E04020194EBF9 + 6166B5A3929A9E59BA1D75A898D75E6953E3C9E1DE08E3020D34206D943E02D7 + 6035E6FBFF76ED5D8CE716E662EDF1649B99E805D032CEA66D6357E9E01ABFF3 + 461E59EF4B2A0D0EC745A25AB45C0A75D9D79DC14B44B1636E843E7FB06C1EDF + EFB847339242B5C035C97F050002A0A1E7E5B054F7187B48C0E10C88711C1882 + 2CB39AC31719A7EE7EBED7A0E8C7F7BEBA3732120405F972E494C4C01411802A + A9E2F312034E8F50F4D17E81B8B92688D8F15484DAE0D4E028C44974E82B6B62 + 506E4F73E0C0E923DBF8B2B27E7E84B4570A54B250603C53173AF8E9DF8EE6A8 + B833D531B04071334D13D338158F5739AE4A70ABCFA4EEDA24C78A8834067C24 + D1FD6A4C7C7BA4DF09EF57ECDC1F7433F77EB28F8FD3990E794CA9100B09CFED + C8F5E970F2334423C5E0DDA60B49F79FE4CEC35BC675C93564FC4A76799CCF04 + 8B4C18861CE4A21C86A6B044A2EA6C9F9901A15C9C912C859CE56F702C635242 + EDE773D66A346B6096806D76C3418D88987419CD3CF5B2215CC2FE1822096801 + 5B8C147E9D3EDEF2B7F1C2822189152CC8624E1B6D1EE43AEE8065FD58AA07A0 + BCA4979867FED06D2A091AFC89C5DD501F51906D050762BC49F999AA7D534DFA + 71EDB5E3331AE63957AE9B0C11648C6B9BBD5B95AE6603493136829BF36DD69E + 50D257C653FE53A3341404890297AC1E16F5F93126A2F226DEC275D1C5CCFCCB + 1E47AD0E2A33AA0F8E46A7D457806D563C4578E51B718CD30F7A13B47B7C5355 + 4530C991890623E15EEDA8697EE2B45CE86AE93575A0F88A68A5E3CC16A95D99 + 82D8E5A66C06A5E4E2D583ED5731DE78E0B6A6083C7B2F0971BB9DA1993157D6 + 5B6F0BD7315E80D50ED05C8AA162BE15A98776CCFB7DA581102765B4500C1041 + 845553407DD279AF975CA35812578A6AD2EF0A249757A309050D321E73E1C0EC + CF65C9495D56C8AEB381750A43614F1EC08B7E750EFBCAA6661CB3AE614D27DF + 64E35C0E06B7D1A5BF056C5A0751DAACE3C3649BA5D55485A0F62A49E0D83BCC + BB99A3325E440C3B7521F2DD0479801654F1C632EC31F673FEF5FB2023C4DAE6 + AC8C1C9B5FE1CFF941C503827CC2B85FE3E8A785D82D0F10F85B0F590A5E9A00 + 90186C521CFB64E7DFC14EC0218C73CC869B0DD2C840537DDF279529597A5EFD + 9F8263FD3010AC6A9A81B174BE16907EAB3E06E09F860CD99EBB99F8F2657638 + E31D1FEB5F3CC14AEE6D65B7E3AB768F83409D37306AD535E2117C572A29AE82 + F98A53557584ADA2126E232692BCF3EAC308601B205951288BFA89AB5CD3D54C + 66A5DDBBC468730B98BF829D4EBCA9D3AF44ED1F858025532F1D0723B2568457 + 13A7F89F0380A57E3F0E42426144E22DABC40758B4373E3D67D3278AF4C54DC8 + DB2021EBA228F587FDABDD84F79E229936EEB47DF78AF35827E65F568312986B + DF56F445ACCD49F565B2B8A4DDC8F83AFAA3D1B0A3C9EE7010467B202FFC46EB + FA963F81C081F5199FFA3B799C4D45D9FBE854BFBA1FDEB557C33394E47EBB7E + 8BD107C156BAAD7C0D0D9D919D50035DF36B192734742CCDA241200471968D9F + 1E63D98D1927DF77663897DA24890370B53DEE2D9CCAA41F4FF0CBFD40B26944 + FCC6D396C814F00D8F4840CA9B8E49602B7491D1FFF7CC91E8FC41AC1D2C3E08 + E545DFEE3C4E8849360D335C2B9D0900EF5F1156C4C0533B0E7D8C9F4B8FE48F + ED1FB4E5F4325B41DE3367DE77A1FCA564F8366BDD9A38B0C5B155A1758C4D82 + 470E30F9F105114FFD0DBBCA5CE2697332D1ABA0C286D2429DA447016A898019 + E95D5B488F7FCABD37D62EFB42F3090F4527CCAB4EF1B3E1ACD0BDD4D11ECBBF + A595E0DA9E9CF730980CB46248BE78B3ADCF4FB5AC573505BB785FD6AD983643 + 2F486DDC8821B59952E2F0465D00A3097A68A3A42215D39D5A9CF4AB52E39DF3 + DDA03BADA928FDD425937A1C06D636804A3B51AC206A7DC9C641298921C0F59F + F41B6EC1395ACD4F7309F39FA73D70B0B8A6B83B47AE9AC8DB89B3AFEC5738DA + 5E8F86F2EBB95877B1EBCF1A29ABC4F65E758FFFDD97058545AE370D9EBA0029 + 9836DC8FCB403EF8988989A7091CDD16171D501464C4BE309EB81ADDF77DC1A6 + 201122E9BF5C86D648EA515FF0B404968916CB8C0F5DB68316579B341256D1F6 + 6BBC5F55E67E55DFF0AFF3302BB174EF2C1F1DA20BA09D36681904F454475205 + D6DF8425540BBC5B469C6184CD9037D25126CA1FACEBAC26A4C06DAB32B0784D + 3847996471A599BE5D20BFC60BC66262E3F465975814D8CDB0DC74BAE7669663 + 8E7577D65F5001B6BC9FA2D881DB45ECEC2DC1B33F76950CAB3CEE9CF8E259AA + CF0962965B700B784D707286E98BFAE09D2F745BC3F216B75A3873C0A4D4C029 + A8E0ED115A97A5EE79350763EE3D3B921A0A03AB9C1BE59868A6739C50ED2F7F + A8A6AEA5ACC72CA429696D20FD944DAD6F1559EC22B0AAE89450465C0A99FF4C + FFBECBD85F2497E035C56034B4EFD4797C0CFBDA0FB94BE4AD124BE1C1C41EE4 + C7457CF82788F9A6B5DEC898D5648B6FB781CD1F65900B659A17314143514E12 + 5A5DA70E47DDABB6F1BEB5D888B804913B1D701129FF40EB3F6F9254AE41A323 + 5F234CE072BB3064EABA5C362882C9BBB2A8E7224FFFB6DB2101C01FF642D75E + 9E2E0983CD731F8D05C1C4FC6D6EF80FA0938E8754B4C350A0A1E90AA0A40DAE + 0B14FE06454675065BE0C03C1B9E87EBFF872D1EA55A58EEB9E4931FCC1FA526 + 2483D9D8D73FC6825CC4AB3FCA5F4C054048D5527E42B569050BCC4B78CA710E + 9F499B210B72EC8FA036715DF4E3C7CDA3780C230C0AFAF51CC44DE61C9FFA4F + 310DEE29D5C3D51AD8C65419BBE39CDD825D7E8027FD0BE6A76DE848A184A228 + B4FFD53708A15BFE7680D89BF63F984802194D2FE6F32EBD99F1E5C7148372FA + 01BC6D47F151E5B829B779C8FB29A3BD3985BA57C390D6D76207DFADEA40685A + 55E194DFE761A00CFF390D9D434B1EC9E6DCB8C195A3DFEA2302902E3A2CDCF2 + 410DC99B4EFB59D7C5E8045301D85261B5937860F8DD33BA9E761587931FF8F4 + 2B5D32B61681E55133D198F92278B6CE95D42A311B401A49C023ADB69996537C + 83F996776DCFBCAD39F9BF2C32BF807977CA00C3338A051A7A116F4E2BCE138F + 448036BC7AE505F0EB0C7916E30DC7FEEC9B406E1971A3F8A9F9F9C3A2866C54 + 006F3557594D40EB3AAF9AF9772208C079C47F9718FEA87827D0C4829909DB82 + F13BBB21E85828B01D0A7607B616B9962DD5EB8C532ABC9B53FDF863642EE69A + B4A1D5FA2574F92073D265015BC79AD2D651F73492700DAE236EC16725824738 + 8BAE5D2C414253D823A03158958C63BDB7206EF2E864E41A5602550818D33C4E + D973C309DA3AC658B705649893ACE2538D148AD66530C6DE71EF33ACC0C17A42 + F7272DC13EE004F37DC03006C9CD71821ECB7FAD51B1ADED3D7D99115334DE1D + CF5895E6EE3D355EAF2BD726C7836A63B1179EE353E4507BAB1FA85235D51B25 + 1F92F9879E22F5988B14F2303F991CC4C26C0E82D990D0194AD8CD1CB694240E + 93BE1B13A49B6303FFC3CF9A5A7854FDE3CDE32CA0821DBBE8D9B6FC09CFD8E2 + B1D8AD38DCB33DD571DD78818AA36EB0EFB67404482B026EC7E176886BFB92BF + D7D38A0836C23DB3742699F140320ED5015779D600AEDD0B37573A8A933CFF7A + 9F784415C9BCB310EF4130D88727C648FDB680EE33CF67465CB2F041A09E6BDA + C6DC2240C8A3BC46B2967A8DA50FFA46091F9EE03439CBEA3944C0A217CD9017 + 24E6CA77AF799CB6EF24438C867BF88462AA8FFB45C1050A6FA87C33FCAED3A1 + 99750375FB53060AE2D1AABB750C71921066C150EA455A082EF43D3DFB4EB110 + FCCE7EE14FC9508589D5F486510536C268D34D20E9BA9753B6320A32D46636CE + 8A485A9948E27E47CE5236E159BD734B1D7C1FF20799075AF59FD507523A0666 + 88CDB7BB6090129AAC8E1574ECB52F5347A71C35F89B2C91143DA9FF3AAB61F1 + FE06E602FB268194FDF89A97C3A5694F7D2DB008EB72B9EAB385DB802E7F2B77 + 5E6F74CFD97BCD8138D76107668761B734D5CF28D80695314A4026816828BD63 + 541D033A22F61D2C2F4B68BFE3BBF7AEF1CBC0C5F21272617B81F4565B626EAD + 0E2850D6083CD400AE24951431AC890A6FEF222921B630E280D3797061022F44 + EF489BFBD97974BFFE743EAA381BDD61283EDB87002FAF7882055BBACCA0C8B8 + A2A1D9B45754B546616E37AE6F47D7624A06AA6327C04C84073B80BAC01F57C7 + 2DD1166C311A7845B382A08C39ED06E73999C6721D46B47D9B02D0A942AE5DF9 + 9FA6178AC6A4E06909493AF02D18F412BCA7BE42B2F9483DAA8CA77C049EB6F9 + BD9CA76DAC1E3B0BD5F52BC8962398046D1FA203AE5164061FA9641D4670C202 + 41B2E201E7BE5598C7795F28CD80BA7ECEE894D18E9D77D58A433E5F1CA57977 + 8210ABF83E44ED39F7E762348961B3D6A72741B12BF2AAD278F286AA5F0DE107 + B08E54966B405B27BF15AB392CA41B26704EF456BDDF49378C9E02C2627ACBC0 + 770E06768C288002BF611C14C4401CD0A3B481E685C592B6E37859CEBDB506F4 + 9325A1F2509230AF1DC6F0A50BDBCE72AD2E57A1B836FB902A9DDDEEB24BC684 + 38D2AC46D925796E33A7F860327ACC6C697EAB7C0E66075F1CEBAC959B6CB194 + F2AC6744C8E74EEC945398C904A0C2CE8A984D0E7E077F91592AA9C00A7EF046 + E62C419D6873840287AFF42D8F4F5ACE56358BEB9CA9D9E8EC958D7108047DAB + CFF7744EB6AACE71F553632C364ED1E6F427EA2D43D1C4CC055407E036167787 + 5FC1FDF90832EF6595FCCC1940C8B8D1C03713CF05E73CFDD2C5AF2F3BD66C1B + CB305FEC296469CD2237DBA270485DF072D3798A2CB9A81C012F910D778A812F + 843CB3FB63DB17799D9C47C11ED6E9567896BFD0265A505A4C7F3AA7706DD0C7 + E8473EBAC65CE4EF576BCAA87E4432CE74EEB6DAA35173F8C33FEC379F5A09B5 + 3D9BEC21E100F2FAE96A39BF9C17B3C8E2710DE02C9CA63256C8FB9E6EEA0AE6 + 4822C62F300FEBF82E0014FE2BF3B3C0818BC6FDC2EA74D00532070D5063EADD + BFA96A3B05EF0D3D1897F1A06DA96AE69C2E1CF845F9EC694F05E3A1362BC434 + DF308D2FCC07F0F78536F3BB5AB05AA6EB0354B1D21939721842231148CE4B4D + 4C6A32BBBD5839982AA6455588D54F1644B40D8E23DA8688C201A8251BA521DF + C8EEDAA771BEC45340C1CEB7F05A85142C84FB1A3F8D8EEB413F9B04EFB8B4EF + A314D578CABFA8CCEEA8F22DB856B7578A61D90AE238E306B58E85A9514B1BF8 + F12F1A0894D2E9C5611A65698FA85A8045F99AC09861C2F23F2AC8EC89E10F77 + 426A2CE14913843C286FE230F4806725DA56F7FD7EE046790A895B40F1F7897B + 1A83A176072A31CD58B0C0B74FFBF88A71AF372FFC99D215F588B38799939C21 + A487DF994FE50BF3E3ECED84867E4D7DA254B2E96C844E14D24F836DCCBCE4 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR9 + %!PS-AdobeFont-1.1: CMR9 1.0 + %%CreationDate: 1991 Aug 20 16:39:59 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR9) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR9 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 13 /fl put + dup 40 /parenleft put + dup 41 /parenright put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 70 /F put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 89 /Y put + dup 91 /bracketleft put + dup 93 /bracketright put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 121 /y put + dup 122 /z put + dup 123 /endash put + readonly def + /FontBBox{-39 -250 1036 750}readonly def + /UniqueID 5000792 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 + 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F + D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 + 92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 + 3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 + 046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E + C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A + A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 + A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D + 731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B + 09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 + 49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B + 5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B + 54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C + C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F + 11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AC46268691C741B2D4 + 48A840F1128D9B2F9CF07D0709FE796B23A836417BF7B5B12D67F74453C82F5F + 25F7B30701D6F6D4F4DC623C0C27D6A6FBECC7312A3CD10932FC7C10851C3C52 + 24B75DEA8A648B7F34F5711DB0E843C914E25663C510185BC37BDB7593C1C259 + 21D8DDAD33982C336BF272BAB2F48E68217403FE9F54877B243614A87E64784D + 2796EE4179FBF96123D1BEE3EF89D682B427BA4F12A1318A57F18BE5DD903815 + 2617BDCF3E78E38BC25E07FF51D3C48AB037CDC846010F66EF622F5B45FF600F + 6CBAC17461F0183D4CBB4764172507F13A18F8A64B23A70182F3DAF727958440 + E1C3A25DC66FC656EA0A6A07EA06394E0B3B86D868A82F1CBBD74F3755301971 + 5DB09608301929A01DFFEE00A43EBD69BEC619ED533AA95DB8EB3EB360066C3A + 8C1A2753893BCD1AAFC46D3B554912E0B5103DC40CC6B7E0454C9D26AC5113B1 + 02BA2439C0826AA26F4F071CE609DB8657C60DFAD5EFF710887AFC04BFBCFC28 + 397E2C9B2BF11ADCE6599E04F5C83A2BFBD917782C5056F731C4A051E4697171 + 9DD8C822B75CEC1CD32058A2229905F1BF4D0EF045E21719232606CAB9ED1526 + A414E31193DA79B692F875EBB1611D9F9CA6884480A4E345CB941865923FFAEB + 37FA7CD7FFC6A73D88F84BC8C80D937ECBC182D5395D362EF682F7DEE83AC436 + B8EE4CB859605EEE3031A507404AE895B3CA5F9F90E135DE572B81DBEA2F0EA7 + 0704197499B429C5B0B8381A4CEC42983C8236545F6EC20E5FF84A097DF6800D + 245D7871C725ED095DFCB85FA5FA982745E933C4B1ED0C88B8FA1823E13AEAD4 + 150BA2B6A15D20441662274FCDD6819712991E22EC3437E6CFB114B25A19DE17 + 981BF56D036DFC0D304DAF77024F20481B755DF1165910007E07B87452FF9E0D + 32ACFC09713C6093C82BF2C6918CBF86CC7F412B5366EEDA666480992494ACAC + A8D553233CC4FFE616ED28D08C4BCBB65C750754F2C6FD7729090C32255E3D60 + D3906A3FD14E3F98DCE54B0E2E2D7E66478BC6EAE0557A1E309A633D9F37A789 + 70333BD2963D180E9E6B3FC4A6D063D674E2C0A5305F72DC06554C75190C6A14 + 2DDB6D5E7EE8BE5E983217520E1A1F7537F04C04F0C85E21D33208886658241D + 64C8AAFA936C3E4DD33208F1346DE5A91168AFE37FECFEE32A2891FB9E06D14F + 668A9DAD3DD371CE3E6BA9596FE01E489E20256201435C1440BF8FF8597B27F0 + C4E12F1AE5726D57D848A95ADA21F8210D05D0B3F04B0D488CBB8929DA424B54 + 3522E3C6774BB450D9F5864C6326C2C1911EA5184A2BF40CED631B1B1FAF51C7 + C7DCFE6822ACEE6DCF779B8A80B6FB1F85956729B65583E98B3F7A34796C895F + FF1F77204593A3B25DCD2618B7DE6A14274217B20742F946FCC3FDA3287AA04D + 47AE65C39C0DD0A6E4C5CF01866309D45B182A6FB11067ACE879616F7A4804FA + 73DE79716C007A5B0E5362F9B106B97306602C1097F501370E366CF09CDF2336 + DE5FFF6FBD808302B58A93D05A4F04B5ABBA013A5B9FE298DA9146ABAB23EF25 + DE42E57436621C7D933F8D136A17B9088FE768180FE5C4A86578AE2C585D68BC + 1FBC722728D4857E3F49E5C1CD5904746C9F2841842E4C847DA940683AFAFE4C + 7C8E91E98C1AB457ED8C23A036D25C25C1D9828462134F881D901D6870E37CB2 + 23DA060C2807071BDFFDCFE29870226EC2AA219104FC9B1EB20205843C12D8B2 + 4B4607AA72C34B6EE2C0B273ECCE5178E5BA2DC197C634FE7ACB9241D8D9096C + F30F7ABF0E68BC1596F43B0FF90182B92FB3FE4A924FAFC8EE8B8B51842F7F38 + 0CE6D91FD54762D992E620B98B325D17E3515D66EDF8AA720BD15ED6C8219BDA + FFBADB951E4D1144A9DFD1B39A699C38D3D19281C731BC8959AC3F847C278288 + 8C12246EB4DD05176A169A101788B0BAC34CED1E2B78E27B42F265511B07C0D0 + 4836A8B02B6ED37C1E1DEB618BF819CA7F8FAAB840F989B1541F1A649EF2F6DA + 341714AE90E438D1AF779E217C572167DD52228E03A35A50A17BCA9FD94C5871 + 19CDBC3FECC48AF550F6300A9507721A7E4759C97A4D647BF729E68D97130092 + 5484F0270EA9636FB209C6EEB367D8A3DF79DACFA500AB28B30389DAA1C27D58 + 7744D665A4113F40404A2C91032C3AFB052E9BAB5E88469B9FBE85CEAECAAC50 + 3F77E64532BBE34569012D504A0FFF0D34B876CB2C12954F2DB71C5340B39A90 + 059FFAB108618ED5EB2520A9D39A222F9736F51CB07A026BC8B20E46EB70005A + D25C7FE03749E45E18166D9A21F9DA38AFCE20CD35B0DF1FDE2D460571F39316 + 22DC33D2AF771BD7C22C3CB039F7DE04963F1D937DC099818BAA43914B746C32 + FFDB105D36D2B9C164377C8EE66A5299DF6D3EEBDB4BE5DC995D158B1F4F3D3E + 45E7F1CD361BDE7BC38071600CC2733E4EC7F376C25533D2057C04890A0ADC5F + F81BA73076EF975BEFC12EADF9DCD9701B4B740E30DDC0C2B43AF477FFBD9A80 + 58308677F13376BD611326A8B2DA7AF73E123B501C2EAEE2013BF9A02E2AAAD5 + A6AFCD361551352707527F769BFC43B54C65D09AF2911E25FA5A53E9E40635A9 + 7E7B88FA09730C32E4DE1884D7E08EAD27251B69E556EAD4015338C3F5C93630 + CF0B43AA094C3BBF159A51A92421F9DB8CADD4B105C955822ACF7A07E25D6B32 + 9145E252D49925EEAFBCFC79CA72BB99553F895615BDBF2217C7074ADCAB799D + 78230C22B38B8A109D7CAC6A4657133E3B224CB8544C98DD28696D646AC1D30D + 6BC1C7B7427DC7A71DD152A2A8584B325889BA154AF028E8126A4EB28764FD9A + 02D22995A61E16F5B01205C78C9420F026936AFB974BFEDDA138DAE46F52E77D + 5B4AF74029D39D2E8C194E61301209FE2C4C6BD956E5781D2D19CAC137FE6138 + B7361B80D0900D79481B1C4387C7A94DCEA28B472B51DAC09E3B73F600493308 + B5B1905708DF8E74D7DD0BF53129462BDDE77BE094FDCFF24BA6FA81162307F2 + 0ED6FA0B2BFD98778147E8863D3D882A6498486363C1F257E2850F266E332070 + 59A9BEA077841579B8BD734956F2C45B682139F830AA23678D747E79BB1EA72A + F8F1460E447C2A6A485AA0ABADC978545928230D32569B6117A2D772058D8539 + F116587E53E7A6713F5589EBDB1087AE882F1FA9393EA8226AF91B5C66809333 + B8C87190E5D92C334A2920E46BEED3747EAAF430C0BA0025D2408FFF16074FED + 992FFEFA2A933B2593E205031FF6125D213F2EDB804738112C18E1D93CAB3799 + 682EDC98074C95FFAF5CFDDE52293FE0D12482F9FC08F442870CDD993863CDB9 + FC5607CC5D7ABC1951D1A85DCFFFDA124877D6AF8BB701090C388561B63DF5E2 + 3BEEB5F1A4FFA893CA39B034E94E7D6545D4F05DB302DF65252569D6EF8D88CA + C10BEEE090458AC5E8DA7A8E08FE00370542997B7235070D9F80DC30C83D5C3F + 546F0898A81BFAE2C31E8C99D24EC6414DD46A23D3EDF473FF49A74B9F217441 + C11FA33F069994788916917785E509401C25DFA622F3F7B91C3ACCD3EEF23255 + 1E4C82EE0D1DB21A71E7504D27CFC71A395FA32FA5F0762958E880C536E9BA5A + BA1EB5BD0E92F60A9F8676D0FBAD5EA943D1E3A8E86B92F58AF2515D26898F41 + D035864641F7AC17015C7043222C2AB35BD2292F904E3B9AC8AC73396104106B + 95A7FB0420150D6C2F88CDBC815976F09F4A7B9D2B641934D0BA78654DAEF413 + 2055C2F1A995E6EBE74B1D9732A15EA9322526546C0B6D1D2DC3EB2FC55EA4C5 + C7216D2C63B4F5FD99D7AF32D071D9B7CECDC3693CDC9D0BD867BB2328B6604A + 3589FD498262FC00EED9AA1FB810B078AEA5EE6CA0FF4354DAAAD9AE79358F45 + E0251F202749670E6015645BB39F8D5D0423B91BF2676BB7EB31F6BA5FC325C1 + 642FE5D3A7EC9B7B3BE16C673E585419ABECE09951ACD1AB2CB356CF730C53CB + 1614BABD30416EE24E5721B4C633E3223E7603CCFDA6B672701CB7F8963D5F90 + FE94E5E6FE405BD8D27E2992E01F54A2C114927FAD91DCD942715CCCD71DFE76 + A925B13D92ACF0F33A24DBDFDE63CCDF23F948F84378E5E4DF620B3941077772 + 8783D5B185982F987EE3831875437AC8DBEED49062AB360254E88B738351C582 + 143414468092DB7D30108803F4A8F9A92B8C0EB7DFF3B97338A41D0160ADFB51 + 4C24C03BE2A6EBE7876BA9EB8D6F486DEED2C1655176C781A1E10533B6595F7E + 06A7D137645D3D5590AD2FC83898859FA072E957002DF52D144044F543532A70 + 418531AB0C27F9F54E38F8A52A7BC323E2F283C0BA693F2337270E5E5131E7F9 + B48DAAC13A8E6007F6C21365602B6CE2D340EF6C4C3FACDAB6D79301E58DC5F8 + 4EB9BCB373720122BD875EFCA7337602EA4FACD9DA4E0408E6EE523A168EB1E2 + 412F6157F3418616C258A18BBDF5916DAC323FB22AD1392D214AA7A79EF290B1 + 273458E553EBC7F460E098106F03543E8BAF2CAA15D4187F369083163BCB92C1 + BBDE228C0472B8B9547D5EA12C97B32E69EA49546E7741D3F7647F4844BA8675 + 82C31B1C2877F67AC6EC94B622D3D3D93747C3857781EF60F690143008D94FE7 + 66493FFF9779330E00C4E3C46953ABF76067ED24F9092C8820729A5493776C6C + 79AD30C2B344948571F765D59052FF0AD48EF9D9E690CEB49C0DA1A3629260B2 + 33C977BB8DEFCACE04DAD2D6AEC22A937FEA7A3F229830397F1009040B541B37 + 2B1A156D3ECB5FF407502D3D31678AFD2887104BD607AEF11F7E02EE0EDF3A3C + 0B0997EAC816EBFBB813356B6286BCEEC3D1C75EE08D9FC1CDF44B7FF27E03B1 + AC06FED0AB71B098292E72791C3D729450F09D820CC520855383755E89E9C050 + 17CC3ACBA83CD0D2450FD7F6F121E72C7E66005197D6A805498A7C1FD886E1BE + 308C3C3FE167C4D1E87AD27378EA6297906FB4B6E6272C29D685CC81026D1F36 + 2E2793E6AD765F865561C2875C43DA22E2E28B751F56B780A06E16A9048B50E6 + 5B554EFEEC68DD3293E075049AAF429EBB525D10CFF562E685D3CB3C38EC21DB + EE398DAF622F1AC8484F9225535E161B6A426E2D5FA2767E91A4F6ACF86BDF13 + 2EDFFDC9E21E4FE13D7A166A77E07479CA8A5A0A63DBF0221082756452F89D34 + F075C4479E978A8C86846D7FFF4E585219D38AAB44CD0B786E3C9263DCD88AF3 + 0C94AFD4DAF21F71FE8C378419E3F0C507830CFCB2CC26786DE2ABBA1369620F + C763ED8064664A08D159E5F895D7DFD513A229B986BA4A5D4627B956923B35C6 + B74595F39D779A3773E2CD48FDC9F4AE61C3D3C898E0EA04A2EAFB866514CA48 + 7DC1ECCFDE165C3AC38520E53FAB2B96EB7876027CA2A973CEA2C85DFD9C7F97 + 3ED0E4FCDBE5D8BD48467489D3CC715327978202EEF6C1F62B8DA686A42F42DF + F6852705CC975C9E9D0E5428F44E49A1D6B258BF641FE8F9C924FEE34B3503BE + BEBD961688C39FF6CBA1B93738E79B73618C269786D9229B9CAB3D2A5AB6AFB2 + B466403E5F3C2E5E8FF2D7280BACA44ABAE0A25BF90BF53F32D6D16B78649984 + 215458B596742E3501467ADBCE62882A5A7B82449695D5F1FFA69B9AFFD151D0 + 290206F6756A44F5F2774CE78DC64C239F0B269583018DEC12F60E9240511A00 + FB63CB663E0A907728729629D466A326BADEFC7F2BB3FCCE80F9070BF7934504 + 120CC7EA0F1FA981ED9244BCFBB965FB5E93C7192A0B5A2CF192D261074ADC6C + E9F705C08D89933FE3E5672F3E6177919F85460686EB8485645F44CA24519DF2 + 3819A77A2768679DC208B3288552646D28B7EF01B0229AF7179675A98729B4C6 + 0F4697778D255F258B3013749760515EBE550040ECD20C726BC6FB0BF2FE9111 + A74FE9634A15BD103014A29E8BB9F3E8A0AC36BEA399E69DA7ACEC1B8452F3C8 + 2A146BE24AD7F77679D4DCB6C7409FBD26585D2CB4ACB6780AF443B0ED60F906 + 961B9FA500D505FF03EA9556C6BEAC6BE046DBD616301E709480C66CDE7C2951 + 919AC72ACEFDF1CE41E1DD5CE0F8425C2D9CB01B26FC882AB8F7B0BCE8212982 + 1BB88AF39E039E631B4E10B2A528AD9AC87282400977784554320D8E89EE2338 + 9EB0942677AA8954E55C11A8249A6652DB715681FE43C69BEC96B88FC02B53FB + 109FE5A78FC2ED73A8AF3E0EF335862BF41C26716882E3AC6E774624962272D4 + 3A171230CB95835913035419944FF84376D24E12AC86B235ABD1DEBE4BD0D69E + 5FCD8DA6F5A53ABDE27CB42FDCB409B5321C005D134D9B0AEBF5F80DF1B4EB18 + 33B0A8E58E7BD9A10A7511D5CE0F5A025096B73266CC5CCD5DC9B544426C50EA + C5D902EA65A97F009CF91985B6E6203F80977511A8218A06FC651535E378DF90 + 60AB30103A805AC771332A61869D22413F09E487333B52E0607DAEEE750BBD32 + 7425D4A454DD68C8969E1F4B3707601BD620B996D8A8EDA9C1640488B72C439A + 79B8EBA65C1EBC60CAA382130F8142BADFA0883B0F6CA132DC644539D52257B8 + 03FD29D2FC7B30652164E667A8A85D8AF37B23B4A93C132BA28813B96752B384 + 6E989E21FFBE5779716AFB704BA85C6B77F9A78C198567E62240DDC6D452EA72 + 522DF531D48EE39691FBC7270EFC9445E7584F9B7E17CAD2A5A1EC3E86D30F5D + 5B793DF3282EB673ED51FF424D69FDAC9B0FDFA5E1BF25AE2ADF9F01A3B7290A + D970A588CC9DE358D615E701C3A838BFCC983DB2FC51C7F5039A7FC05FD20272 + DB6C0ADE9D906D6C20D626AD174C0777439DA7B1DDC2439A8FAD8B206D9212C4 + 0477F554BB14E2D1F7059A134C23183F914B6FD3205804FFA514A168D98A0E44 + E0830937FD57EEB482A043A5EDD2A6D5CE53DE2D6870D4681DCB84407BB18233 + 6560434E4013EE444A4C8BCD07B943C2F32FCE4E09EF1B47C75776719D94E474 + BF016DD6503C4310C80C1D39B8AD4A8AD97B56FE8465B26AE3BD3DAD5AA91C1B + FEBE06AFC82579EC035DAB40B0A8E9FC30B3D63277B06351E73CD022F38D772C + 0E7B645E2FAD853DC490AE141A9ED81CE6A0D9CAD64C8C29F9FADCBCE22E7F1F + A4ACBE4C97BF8639575AD07B55CAD0AC5A7ED61126B57E2A83ED70C940BE0EF9 + B3700A3AFB0A186B2B22547ABCE9E7A67F4F6B0DCEE0C6E3A93AEA28ED072978 + 6CEBD8FE20034149E089F5E2253F0FAB1C9493DDF206FEB14760EC26C843F22F + 6AA68C592B05ABFCBEFFDBC726B4E8497A02DF7E6E502727482914D3DF0E3D3E + D1EB604557496BB70EF354B499E3B021FA3719E3BDFF846EA8C0252598EB17A4 + 5D4D8AEC18D6670E957B50E776021014C13259606F9C94B82100CCDDD9CE4304 + D6B2D776CB07EDC0AF1444BA10A8820A20C20AE277795CD0C98806FF447750F7 + C0EF6CB99AB9A46A2118F1C4E2B4A32A9040817953D973C1303F5359C19C5D54 + C61F9F1E3EC4176FDEDB4B00E5C33F6F3126CD25431C0E3D3B334D022ADA217C + 47D06FCD90CEF636EE15916EA1D9E8EDCD1E0C4F253BFDA594F07EEB754AECB7 + C079BE3DCDAFBDCD9A7E37E7F509EB8A911053B6A699C65297A8FD70E81F1D2A + 56026267D3FFB69CABBC90A54F40CC6B5028FFA81AA66ED2C47173A53D145E94 + 4645186061FE8079F12042AAA0DDBCBEC34E88295CE22D02E2E0BFB0613CF025 + B2BC947B1EDAF03FEBCBD82BB50B80957F69C75F005C8B8CFE4A394B5FBAB24C + 633F3E50ECDAF2669841C378777D2EBBB8D042D602F67FC3B4154A8323797BB7 + 6D5CF9727A1807DEEC161F4CE772FC28669EB8B9909156056D40330FE4746B74 + D22EE3B46DCD5D234B95F087248D5705C8BCC1937FCCA0DC2EFFF4BF262465AA + 4511D8CAE7645F29E18C569C77F839564EBC5B1B543916ED0699C92EFC1567BF + C3E925E649C937D85036550FDE45954D1ABA2D316407B6BC5E2C9F9704077A05 + EFB00263D5648BAB62A75ABD20B51C922D4C79DD71A8404EEF7361A97E3CF7EB + EFF90E1FA7B7CCB0A12EDF514E5A6B4A23B8AECFEBA17D15C39BE72D509F1195 + 3C64B3F20933FB7AE8AD7BE8FFE23D4FC3DC17888EFD87588AD08EA4D587F1E5 + 827C1E34D4A1C27F3EE86D1059B31DEEE7130979C2B552E84E2BC5A2381F7B36 + 166946B84C27F78EAEB952DB66587EF3ACA9074B98178936846FA5D48A200FE8 + 9A0A780271848FCEB4BCEBA4A10AE4FF9F2EBA621AD900107225E4220FF7F4CC + 7889D5E5E7219C6CFA377FBDD8FA4B8F78616CB0832FDC24757C6460D99C809C + ACF6F13B150DE55AFB6F66BD49FECDCDB0843FD689C86CE7736BB5D40E849F3E + 66AA8C30389AE68EC0EFB9B98E295C3A9549A63FF1F934745D7CB7F88C3A3F2C + BB55E0DE5B0FF9553D64679EBCAB4B5FB13E5DF39A33DD073F5422CDF5D1F1CB + 1859616973BA5CBE86229B958B4EC20E403A3EF374B1295BCE010279CBBD3377 + 10AFD0A342CDCBDFAB6021F82347129C69394C8D01C13437AEFE03A81B353071 + 40A68807C0B5F65D1B01A1DEEA494B3967070F261E2C7EDDE9B4495B1280D05C + 284C2D2DEACD79C570453BC7518043C3EA4277A77E98681EC91E7FDFB39C1F40 + DD414F2B5282CE3847EF303D3B61F43DF24E1FDF4731C187A44CDE77372C6B16 + 80F453FE28BFD15AD2F8F3E4FE47ACF1D5E83C47F9F8D01FEDBE81348EBF46BE + F858D8D6BF28824682BA8EB900E93953A7A7988D645965C8707D3E225BBF406E + 378D6372F4BCB8CC264BF5EF4DBDCE8C113BA64F3151B78F09DFEBFDA263036E + 4A352FFCD782430348F38E746B116B324B2D53BB90D4E1BC665C97A78769F05D + BB9D4589DC506FAD6881D3DBAEFEF8E04FFA93096BD6CDF9FD7928998E79F11C + 476CAD7CAA2234308D8CCBAD031C237DE9353559E53A1354D626D1F01BB7CF15 + 8E08823ED72CDBB2C05708F4882E53D6AFA597CA0984C7C8A03B3EB176B39807 + CEFE5765EA1EB0946F3EF456E5460A38C29524A609EBC22661F4B71B1D6348E3 + 96119962FA833DFA686F7F3EAAD0D994D12E197FAFE1C391E842D05BA0902E9B + B014C6786F5077A53908AE6C08A2BBE3C53059CABFA6E4E08F835A16420BF55A + 48372E9025A322B470F46FC93AE52A4E3A92360422DE5A0FAC98FD1236C186A5 + 3342CEF472D1061B5E152D4FD89702D2BA140A3E96A06B3639BF5E4B77198F23 + DA198BE443187693428586C1A03FA166A237C220DEB7000E90178C7D5342CD0E + 01064657431599A42EA69B3B0F12AAA6EFA2DFFC993500AEC78ABF7478094174 + 6B7FEF4EED84612B7BE59F954CEF95EBB1FA8FD0CED720711573EA8E7F505323 + AFE88A5F309DAB722F57F101296A23A4F1FDA970F540967B16A73B9B1877319C + A1BBF8A46688BE2BA2DC240199FFF78E5BF3CB5CA30C94C4F920B532E41E8A0F + 4C80FDDCF040B44202151C269529B319B14CC8553ED4F9241EDDBC764F291775 + 5DD44DB8B7AA1808564F276D07621DE93B77A4DAD4067EE112E91D568C6F75D5 + 0E54858A439D1693386E6F6557510496F5EBE35800DA926A6041559F1A4A384B + C82BD0C97ECABE65B9E75B4D907ED71BEA059118134C8330551F13F80AC07CDB + D4E25F9FB09267D3CB92AE6F7C466EA986EC0E496A5B0EFF6D205C8877B63842 + 1A8EB1D225C48A71804A8D0F1394D85DD7099C49D6A36D0AC3D3F1A119158700 + DA93317962F81E215FCBBAD7BE11597B5C3F386CF9B72973081A422739649CA2 + B59CC91D99161CA9CB3B87DFCF0AE4B7BEE0CB3190725DDBD9DB4A634B5B9DB2 + FA5A566205D42E90DF0C7E438BB5D158CCB9B7A200EE528070A24A1C6F4FDC70 + 581BB35B5EA13E596AAD889A0A336E65C784BE89483FDF330A7D04B608505184 + FBC87C2E9935E8B36BC5A4F2F2B69B8AB2AF78CEC94D8275266A80FA1BA1E089 + 31E6FFBEF9604177ECCFC27F54C26A04316385E61932C07C694826BEF8F43165 + 986D9390F32BB4A7B4BD47DA2449C2BB23576C85447EC2B59F4A7205C7296268 + EFFBBCB03AE90867E9DDD430CF03F6A37BEACEDA249A78BD69B3573373D15432 + B6783DAEC9FE1D2C52BC47506996A4EEEEC1432114CA90CFD7683691B4092C55 + 4EA1F37444EB5CC993B4F70DBBAEDF08D0B64F651F28C5EE360D822BB71543FB + 49EE1729F037239A56B8E13F13EF4D69BADF18267BC022EC1FAF7396004CAD8E + 58C3D1A067EE3FE84D6480A6AFE459BB401907170C3E23910D9BB2EE43EC0D1B + E6F9C746959530647B4B85FCE75752015DB88B020B3C18EEDB4FB66D7460C3AE + 5B681A3A964207DB0776D5BCAC5DAA310B5EE8ED0862A2430F1100D4AF61EC04 + 7171C67E2E23F1095D92A15939F7B2476A9BAF0348CFA61C6FF51221010EFA28 + F17D975F62ACB6CF9B231B62A682A7240F1319DB7107342D93BF123FB1D18E60 + FF8C17CA212FE1B32287B9C8801405AC380412E2739FDC5022EA7DD0288DA6FC + 368B829D28CFCA3469CE9208C4090AC28B4CD551971B233B4DEE802F627828C8 + 8985CFE1CC59186838356482EB5A8DDD3CF98479C41A56F173BA0B7FE3E8AABA + 00A326F152C78FD17D48D716BCBA3A67276043683F9894BD0CA0A12D37D31A17 + D4CF870DEC320C705356861BB69B66B1F83615A93F16FF5DF9EE7478102727E2 + D0EB6608A4FA18AB308B11C44EBF6E91804D7F04E254D139934F090C99420F39 + 34BD6400F6BA2840F771AFB65876D937383AE247AEF1BD5C929E818D7F6EB8D9 + EF9EFAA0A79E459AA9B7E2269DFAF34DD9A4CD0261030F51A3C56DF49062B2FC + 56DF0C663094975124B4DD73CF591835C7E808D46FD6D68E2B6B3DCD6046E4EC + BA237803B9206EBD21543CB6E527815F519CF1CA85473479F5E3FF0B5D61B3E8 + EF4CBBE43D7941161145AB7CF7835F9F2D5B4ECA3512338E70296DE7484830B9 + B52DF40F23E1B4811C5375E0FB824C1303EF1BF0AF0486B208195F0B2341BC03 + 3FFB4ECA6BD8D5FFD34DE60A811261770DA27C8AFE016378342B3FEE07C99653 + E4AEB00519A047A484CF7B190649A559AB60F781920409DD6AE244FB258C8740 + E2E78262999E66C5FD848F6D497C0389CD33ACF1E6D74B4A0796383B1AED867C + 7CBF4754F08945D7E8A14D13CE5FFD1D9707BD879EB36DB782E622A87C6F9C09 + 67CFC9E65D2B2CB51D188B45AC9278CDA06B50FB164F0C9BE7CEDAF6E935EC2A + 98844036D3FA52883E8170CE1A37B8556FB2C7663E262AAD439DF76C2A996948 + 618DFEEAA6C38562915695491C15F0EF28EE8FD400565FDFA8CBE5222E66F140 + B6784D0778C1ED6A8B2AB802DEF964453813BDEAECD27C0B978D2CC0511C7366 + EDED87011B0A73235EB0DA31C2DD22D31503DE868A4EF89F50AA4267A99B0E40 + DE88E6B4133951A5755FDC2DA5259FD48353603284418F603A74F5D30D0D5375 + 82DB7046F1BBA2FB44A84018494E84A4A9E8A9F0ACBD6A2E7ADD569F0370A26B + 81280013FF741EF2872DC249C96B8331F9DDBA1EC253CF2EC86CDFBB87A22621 + 635AC86A75E6C15741DDB1FB465379789E082DE3E57E88D36975A9FA4DAF9A86 + BA4420900A8243386B5D1BD290DF1DAA675FBC68C01C66A156DA5C77AE5EE58A + 03DEB79CEE7C04B696E327C707922DF2F6A9F99E0ADEFC802E805A29CD08874D + F9EAB362930591D8FB3D783B7CCED3B89260E7E513F0AFD844CB57FB1DF32A4F + 1D1196E99B44A2023D7C7C1F218C347D0A8F1800A5E5E454088278B09BD1D5B4 + 26B73D72A1EA2BF099518E8617F9DB15288C32BC3A138D8C8EDAB0023A7E1E04 + DCB8568865E706A02ADA74550959A8046DBFD3483CBD483ED11386143B5AB38C + E3C118600C7C1745CCABEFC24302931BC0FC4D2B1453F4CF048B8B7BB5755C7E + F2CEA3516E10444ECC266DF95EFFF1560C004652133D7128A68147A19D65005B + 1FBDEFC091B3A974A47636107B5FAE4B036A83B8CA7DA7B40C4397A556E05CAA + FD832E82C68852E05A910529B79EC4B96C9DA57110933FE8890C6D51DF478259 + 7E089FE058FD3A217EC5FE3C1ED34291645B618982D5FC350BE41727088C9F41 + DE5476B497B7FF264EFD7F650C6924062B0499157278038A422CBB67D26C6875 + 2D06C9B3D8041583525A7357F6E278ED91877168A091064B249BEC2A1F01FAEF + 636A0BE7DE38416981928479603A9C58C4D8256CC01F008C7682494B3319405A + 06ADFECA3E997DBAA0FFABF5C44967D6BB26B4B9EE33266DDD5F04E7B3ED9D32 + 99ECAC147C823BC41E201B15DA58094AC70595ADE0F34592CE096E225311FD90 + 7FE04998619F80DCE67D768B3DB46D120D7B62E51163599D5BCEA740BE16B409 + BAF8E5725D136E20CB29FCE1458BC1F61B0CC68E83259D9F9AE3C4342744EF0C + DC2F535D095CD600705C196F4B9943553CFE6775403CC46C6D424631BBAB1E32 + 56D4566C79C15514AD8270AE81E927B6EC4E08AEE5C2ECB17E40EA2273FA3E51 + 7BADCFF1DACB514988DD840970BE437301F11E5004B0E020CE07E6F674A44035 + EB0EBFC76F954FF491908263E978DE194E7EF113AD453C5519211FC80C9872EC + B70C780309728EB1312ABE80D574303A8882E367AF2ED551DCB102885303ABD9 + ACBB939CE3F6DE36A9B4B36C2DC5253DF18ACE6E36089E8E7C3BCFC143FE5ADB + 76E229C2801B33DBB6F9F11FB9DAE18DF7566927F44CB540FB17EA68FB69ACAC + A279AF225B07178DEAAACA519B3F4E19120871A0CD3310C3224971000556DF16 + F54F70C12BF13BC86FF7CE8F9AB470D1CE0D15926D845632301F10FD35FE0432 + E1C8A61AB775E2FF25C6254F72CD273A776BBA5B47FBB0CE53A94ED1578B3CB2 + 4E32A553C9C03C606C0BF6A95DEE0A04E67025942401EC51D49FA5949D94B4A4 + 8F27650957702FA9D8BB94885DD868192B598509AEEF1101F9D818E47573DD18 + 9E3717424A2543EE32309F693D9B83F2BFB4CC4BC74ABDC3BA614C0B71709824 + DD295D80C0747247C81125AAE0BD60993F5849F358B656768FAA4618C55DEDBC + D4FA5B9B9AE1EF5ADE37BCD864A38EA42083EEA026A8A173882339F926AB8832 + 93C23AC99EED83C7A899DB974F084A481B6D12C613544070B24CEE40ECB17613 + D51A86F05AB73A48209ECFAB8F16D66EC0F92F5E1150A3A00F489537D33D2DDD + 250F5E3F80E71124D5BE546F7545B44B8448AF31DBEECA992DD4C69987A5AE16 + FB9A4C9B05D24E9F0A31D4090211AC1189BE14B17FBAF3E7D1A085D7A11C9219 + D9DC473AF3943546BE45107E1B7D20203759563976218950972C3EAE66905327 + BEDC2ADADFC579C12667141F631C130291FCDF4C8CC798C15BD7CD1A9CCF031D + 51920AC5DF0DF3BB3DD61B9F0F625B583B3B6F0CB5CCC87D3F5582A8362F4992 + 5ABA709418B2828B0F91FA07B685F79B55C0E027AABFAE4DC9C63858AE1BE561 + 4FE1949D0F143579BA22D8217A3282F3054362F02C9F795783274E3EF92A7FD9 + 9F05B876DCF98BC0A5537652A60590B28EAAF19E07BF8B3D3CDFDA0150370E1F + 2E2AD87C9561CF5B61309510E69FAB26C3FCE40F57130DEB0E8D475FBD3B971A + AB5E6A9285CD4B3FB38C22C81332BA1282904CE0F5D386B63AC36DFBC2635E64 + CFB2C4457D42D494B7C25AB3AF89BF07E3B32330AF6498438387AFE7DA64C708 + 766FDD8477888687A54679E0B03E6F6D179DD993A23542CF2B11F09F95975766 + C1E07C70CF22E4DA21D6B91361AB22064F903FC1F77177EB379D334D9092881B + B7786EAB04136337BD7843546CDAA0EE38A854CFDE6E8A9D4A09E242633374E4 + 51E8149ABF020B7DFF1D4291E3524E775AA28590234E9CF63229CED33F491D7F + 5FC15F522AB5AD71F404DEA9644AF00F808F92EE39761A9CF00583B93B4A517E + 26548A50D199307B0B35522D808CF3E2D3A92AC5340B0A666DA56B4B22C6AC5D + 285DEC777A0462584EF622D1FD26B0B7F5A53CEA14D23BF1254822898C21CDE1 + 71E3C8C4AC6744B1B1D261F8FFE7F68005EA8E130DB48AAB87F198A08222E5C6 + 8BDF2ED197B7D8811C45E9F64464E03DB08AC84FA156C3C48C1707504E507B1C + D1179880BAC2A1DCA37AB460A6761B3BA7B4DB816DB6D27D44D968A4017DC8F5 + 380811A5A979EE97637EC478A1F8DCBB9684A5E95C8E1087B02ECE7FE24A196D + 7C6B9C1D927C6B48CDF0F713D01CC172DBC032A3CB96FC6EAD8871EDFF3623A3 + 5B583C23F5A4C9630B9B43474F7F8A3C2D5F48C5A0F18F19B2500F9143CF6005 + 69B85183224B06ADE98F8E598FBFCCD5E47179EDEB93FA27C6665CD2220586FF + 7694779EC3B2D3758768C6D58C1712244C18572ECDF67433481A865F4407C82A + B6F76F9020076DD0D2FDC69CD7A906311418E9FF05EC1C1847D58D24C7BB8805 + C5A59C8E0272E1BD58CE7825CC67EE2259F3061675F9336450380D774B259921 + ECE7743D1E4675C2E330240C947A920779091DE1D152B1427DE5F1C298D34F57 + 80555679DD9493010E9DEE1DAA5EFCBF918DC4E48A176487394890C49F7A1280 + DC08AA68143AC4DE38F9868D2F82003EE720EF00DB628FD026405E9EDBD0F102 + 9DC456AE054C7CB55D5671068B5350096BB3C170DE7C17F047D9CD6BA4016D8E + 3CEB5ECBEED0012FD66717647924F29430144E44 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTT10 + %!PS-AdobeFont-1.1: CMTT10 1.00B + %%CreationDate: 1992 Apr 26 10:42:42 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.00B) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTT10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch true def + end readonly def + /FontName /CMTT10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 51 /three put + dup 53 /five put + dup 55 /seven put + dup 57 /nine put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 118 /v put + dup 119 /w put + readonly def + /FontBBox{-4 -235 731 800}readonly def + /UniqueID 5000832 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 + 38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF + D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 + EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 + A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 + F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 + 4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA + 6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E + A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B + E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F + 1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 + 452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF + 8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 + 5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA + DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 + BA304FA879392EE0BCC1A6ADAB001EDF5C9D6FE45735098A304A8BD4A0AC9980 + 7FFE62FEAD3843EF8C45E1203E303D028897CFE1D4D0AB8BBA74CE279275A67E + 81AEA417A3E49397386B7304DC9247290A5CE2408114441EDD82F9B3A8E49C4D + D9745142652BE8B82C2A9610B26EA1A71212CE97781A06B58C3DDD9179016AB6 + 740166FF986AE856AFDD2D8955D95B2D0C57BC179F1D9136BEFBB6F17E8DE96E + 921502FB19F0C21F0A491F951D83972DECD70AA8987112F05C939A6FB073A5EA + 495069A1DDF11DC589D2E91C1514C2799C5B9549A3CEBDEEF87B000E2686DF86 + A256B3BDB4FDC79C218947A13035A3DD2DAC7684B9DE946538F2015273B3DE1F + 40FA724FEDEF2A55EE15C84A5CF29933AB3A46E4CCF552939B7AAAB007CD23C7 + FAD6E3D0DC8157A389BBB3C8C2D91E42A8F3E97D7E71DB1D4D77D17EAA35BD7D + EF5A54D050720CEB18CC7857BBD287B9909D0465DF96BE516A2F12889B58B407 + 2DD63FF04EBA7C0FC8212900AAE39E289C1AFA97E415393E6B62F58F9DC86556 + 254A8A71F70C8F027ABBD9E82CCD3229B5836092A7444313C171B4CA0DAFD14F + A0E75A402A26F85854113E102AB81806F6D1429450A21C9EA0419C3A9D9E4014 + CC17E17E0CA2BB3C524664AE0AB89DF0865E14A2374BC9C5097DA8A8DB0FC987 + A13A3AB775A78B156FA7B75FBDC3DDC6A41673FF98007BA80DD04014AE118F07 + B7C4CE30D90099990328454CE1A7F8B0C9B64A27BFC58945D422D9FC570AECD8 + B0BC31ADA2B667B9A1A64DDCD6EB7831B68BCADC0895154E12B2238E7AC938E8 + B28962416E6B78A3D4FEB0E60995CF6457CF08F21619BDBD413D4CEF0D8C1DB4 + 5062F5D1071C013E75F1ED33B6CAD1EDD304884E36FB173D103CD481D27312DE + B6A7DD95FFF2BD4756A9DA22D192FE2D88969F172434B412B57E5EA4D5B2BB05 + 8BE8B5CF61805BB18109B5D1B4520FF18D626A206F1F615DF055CFE15DBC951C + ADD0D3F4DE2287EF5BE14509F6E874E73E05F32552E58AA063FF412DE7CDF577 + 50DE134D13BA90CFEE99ECBFE1F278DEC715FE28DFB21998A0D3A65B5B2C1A87 + C1634074EBEC25F721B1808456BFC6A30C47CEE2A1B1DF9911BC3B12EE98EBBA + 7E840F2C86AE822EA78526A80A3E2D14DC14673E9A8D689091DDECE1D830B284 + 6FD823453F08341BC783DD983579A30AADCAB259BCF25BD659A42F3098D95E70 + 07ECBFD8060285F88A2E99E108436200EC7A100EB65410312C2FA516E098361A + 1A94D09380BE277F596FD3D2130A1748DA6AB4EB78F9CD1C101EF894C745C1E2 + 8521BD464534E45B9BA0D79B6890EFCC103A46EA5229EFF12B6CC6A8F9BF86E1 + BEE476A1B6FAD491C32BEB20E410489D1D6D127D2A7E68AEB74330579626F3F3 + FF3CCF179E5AE31AFA300681B8D8B67F7D4C205373D11CCD6BC49544B3596959 + F47F9A4711CCA155D33C9599A403E89088EB634958C8B770149F7CDD8C6CAA3D + 8E3323827C06C7912DF725F4C12A55C95EFB0B8AC687A4A426726DFA163118D5 + 88E7BC2AA84AFA2E52D5D8C27B2A82069F745C37EC925B4D4BF95B5F715CB3B1 + D15CD6CCDADCC9E30A869AEE546323A686EE78C529DA6774CADF2DAF493CA5B0 + 4E6AB2814E2FCA557C4B06B28219D750C3C6279B9DE4706ED385CCD81F920326 + 773CBDCD1EFAFEAE627B0B3CB4358FE700D9641E98A6EC1AEF907C259ABBBF3B + 747E69B606676802016139C028A7EE613E9605854EA2131145C854174DF82989 + DBCA04A833F1B4FB09D25F49EF4CDDD024D7C2536EF43D3FD50FBC9D1293215F + E6378AF94F72C6259804A2DFB755B362E3AC7AB18E1D04080BA111724046D5C5 + 3A876549C9DD589D8AFA6D17B62B3F242652F0D8F1B7BB65A19E2B65B21E7CFD + B4A57384AD6651D18A6E8F8134FDD7A72D851120A355CE3F78B9B74520C2C9DB + 2E5A70464CCD1188AEA9BEAE90494C446D20DE468D60AE835F35FD0D1D10645F + A2C6FDEDECEB73B9CED98103E39EB1B3F97FFBBB865486306B6E74DDCFB4B53E + 08E7C67A242C1413C7DE5005C090242BA131B0FA8F789322209379C73B829D4C + 6218C29421BECC5932979A6E820FDAA45875B74850C03911EB135838CBA4EBCF + 39DC7872C5C1DAE651700CA656EB2251A9438CCF3B0EF9C91B1BA6480C658E3F + C3911C5BE6356D0FE98170F292E854F83DA97228074C23DB779C0DEE9947B40D + 1E89C4B858BC176BE3C327B7E939110E193C69891D43C338710835F968F60A3C + 8EB2DBDF634025A40A92E2815EB3AF9B4C45F4EC91ADF1944A96634360571F05 + A5CA3CAF5FBD436570AEBF002A6F17164B186DA9C2B84F96128409D1FEAF6E05 + 03448B8604BFB0874EA6A32AEC56C0D9C2730EA8F4B7C454BE2CA246A74E3EDF + 0CD0162BAA746AC3D0AB73EC1ED343D4C1E8867342E5CFEDEC35993C30C6C884 + 5A0B72940C914BAE65A271BDFF1F22C79E1B410028BE7FA1E0FE3198A144F932 + 7F4D1C4CBE50821256A2C1BB7D1859EC45E09FEE2565B9BA55EA261577EA3771 + CE0472A416CB56FB7A6EDD1AB862326ABDFB9A9FF43EC8879E784A95D873AEF1 + B919FF311D03E83CC6E486C007659064444DBEEAB20BE0FF3B543513176CDD20 + 25ADA4038FE2CE4C1534F9AB0D7375B1C1791B6B71D1D4A8B92CB5D12369EAA5 + 107F7E6DEFB39150C0287F855D657F9D8EF9F96345A4D6BA7A59203CBEC2520A + E62BFC3894927FDB5F2F9A45C9C699F27FBB28D308322F5084D458D818989EDE + 652556FF5C13F8BA3487820E569655376E57386E40FED988B97A272EA22F5EEA + 6FD85296D9ED241230761FAF86F1557B8772E1E8359A5302B27E63298DA6D48B + CC3A94C230329DF14F0E404B576143AB76F0AC98C4AD147EEE2591760B548477 + 73036B1111155B09D0D7A3B8CEA6ADDA986718FD81625D7FD4743F0C1F3EF1C4 + 7AC0EF2352E1598D147F3B6E98C19E79FD11270097EF0E71F4F6B9FAF30AB0BC + DB41D64171DA600837E7DD115ADF2D8FC3075D18317A06BF6E3E344C6CC8C5FF + C4E5CF9202D87240CBD56DEB517EBF2082271308EE54C15F83ACAFBF5FC00752 + 68E2A4CB533C773C957F1E6CA86A5763F56F62427E05CE81F0D72B6A96231B13 + AB224834F61A5C799A5C48B019B0CD7B7B97351A1702749C78C17662F11B16AF + D6A465014B28C19778D20BC95F99797F3ED7E10567ECC3DB4D8745EF9861342B + 64D3D672E4AC9554CA5F08607843EBD3F9EE9D9517B1FB0A6E0A605A9CE2AB3B + F1E1E9901E3C9097139AED5BF903AF92EFBBB8DEC1891B59252DC792F4FD9501 + 0BED0C070277C258C47DE528F0727C0A8B2A0F6CCA462F731C03D541EB20A840 + BAEA843EA2C9A584B0E01F2726D239F484564D8D04847E547529343D4F48FD03 + AAA187F40BFD951D322044369768290AA18F601D4AD4F7A34B536402670A14F1 + C5AA8E1F1CD388F2D65970A7DC0FB53692C24234B6F14853C00A95C49822EB52 + CE88DB7A6CDC580D3D44FF0E8ABC6BB8D687BC6044A89A72723F8D82FF19F2A8 + 24D41E06B8C7FE383AC4B35528EA773CF429178643CD290ED8BA7133D5974EE2 + E2752192219171C55EE822BC6DE6AABE24C2B749FE68CA6B181DE1AE926DC29A + 316443DBF3B25F5D6E3C99F4C629ACECB949FC1CB8A241E1A33ADD0703E5C2B9 + CB9A215E56A59E489417254EB74C7CEBEBD4623C56045DE4A36826CAAD4897E4 + 6C0779146895A5E5E278EDC1222D49F9D44B5E89B769FEF4CD57057949FCACDB + 1E63095E0B4D042B1775E4F594F62CDBDF83C352369EB8445C410B76D7201FAF + 9F74284FC71BC793B0AE03B2A78B395C3B656B6D7B17B41EEC3CCCFEA67A5A47 + 71867B0D3E2B9FE5B54F63267E92828ACB736A56172645FAA4B5FF712599DC7D + ECCB4F8EC2213C4C8F90727317D20EC981C172D57824AC428ACFBCD7FE8A03C4 + 1398D0CA6F8E313469403EB89C8A8E0140FAA79E365A634A063D5A3BB3D8D9F3 + 8D1FA8AFFF018EB2640A4B4D5B84C697F9FBD60D0D12A335E9CE18DF06CDEAC6 + 1BA63EB6FBB984081211CBAA549FD67BB3AFA8627B0C359F27D7BE39ED563D5D + 3CEEE844E96B494EE19C634117F0A676232143B7F80C5DBCC25E37CF4B84AA7D + 8AD9E28E1167721D71F407C2FE142CC7692CF3FACACCC174A9E5CF804F24DB5F + 1B6FE6A41065E54C9B7D69A0D26EFA071A81A62C8519C92391A513CFFFC4B155 + 013A875E4ABB5B8692176E41C930039BCF5828684E89B0FCCC35852CB3802858 + 2BFE31DA8CF6E4D5F51C3E28E332DE0A035326B2A73FB70B3F32039EBFBCC4B3 + D659A0DE727E4AAC85B080FAF568A4C9772FBF52A1F7A850EB1725B0966AC398 + 959F0B9D8E34B93614C127EBABD7F2AA532F3FEA2F4A201630B312114787D57A + C5D182B1069D9E3DE584B7E96706CFD4EE0EA7514FE432D1E2CA1458BF278493 + C6902386883380D6AD09FC52FDBBE68DFADA8B9FBC62A01FF45B15E25071BE33 + 928DD4BF1F1752A99ED98909C5CD6744D6D35DD0A80099AFFDBCAC796FDD6472 + 4E777AFDFDC076ED16D50417F373B81F36D719402BC6217627D79D41A1525F6C + DC11F3F4F58F342309B75B599425741E248F802AE369C0382EB4D31B19A32E8F + 994B81591D387D135405D3F6FE65F1B36F0D90F8EC403B66D26212F8972B1D67 + 3B7F0A7FC49C23C690926B66CF3E025B87C155DA6FC644961793D9C1739DCA64 + 39A74F833DE08CA1AC088ED76797A2F6FB2F97CF9E12091943F7BE8A063BF8D0 + 84DDDC2589B4452B2C926208F460433B587E90EEBF217EA4DCBE9AD0F980D655 + 51C3F2E97212601CE4B0C5EC846700272624A1FCB2351F8ECF472F082EA18D17 + BECC393F6210B5F8CD247ADCD5EA66CF4F910A59042B0D20C40FF7696CAF42A1 + FF6711782937028E99BF2CD836BB8FCD2DE6AEFDDF2563D285C9C1F740768E30 + FDA5ADF4294EE09FBC1D22075DD74BEFFA39477023A6B95A8479CF7A4EA54646 + 3DF0226904421FA247E46C98BDCE455BC8E6994F554B9B6817A5080C64580472 + A5EA9ECE1DD46247ADAD215E55BF12C59B4720FFD233685B2D41CA1EFF60F580 + 9D0CC17D7D9B55F510812B607213DBBCEC993662140ABFF33F244FF06BC9FE5B + 025DC1E5C1DEEAFF9FE23816863A7FC098C914FCF5231B989A0E5D20C60E1FCE + 7BF18C42418875C829505FCA8FFA0E91FED98B5BAD583C6A2F6AD44150FE25E2 + DB227698F6F1F7812363D21A78E469FB251483E35604BBFA2F1D430869EB2715 + 5C0CDAC6436A7F9CD5A97AD901883CE4F9D04B3414A88B36977F2B3E7F22D66D + AEE53C406DAC1D5637E81928EC72F3CEA6949D52EB55314B1F37D4A344FF462B + 6AC53D92A31EC1DF77F34A0E258B2A2A64E44DE2835FAFEC797E027A9B7C5E9C + FD77103E75A372EF6B289401BA6336EF70AF12E32985B648C6159D1D52576FDF + 20242F991D2C193AE050B8A53CF8C71E106E7A4AADD998F99B40B398D49686BB + EEE378FA8AB01EB4695A137D1BF45A5425CD5490894A0D801B51248122D88E82 + 8BCA505146DA70985E352EB1A645A7BCE04A8899904625A98CAE82B63B7F0E0B + E7FA3A3984BB1EC062515C08A73B9921664D5D5EA29E2AFBDA67511C3F47CC8A + FA0B461E7C6FC6013EDE08F90F0F407BB9B795B814D995A2197005282EA9B5FF + 5C52F25A6226D123EC7C4B40853792EDC6C9EF9A0F84DC79D9A1C227532E9CEB + 9EE456CD864FC35718E47177814387425428D0989D4DCCE18D9CF452E80A889B + E37F980DDA451C83E1DEA145EAA7CB6FBF04E2F43A976AFDDD4B04087D9437D3 + 6BCCB64FAF30544BCB643A9D71E2B8F45B8326DE483DA1995548E6C691C6542C + 08694CBA3EDEFAAA401602B00ED0EA3E06C25762910262EF5143C33838F7B3BF + 5BEC9F9803947F811CA081507ADC08105C919635C94A54BCF699EF869375F5FB + 0DE7D13798F21531B364A1696928F91F66AB7EC7DBEAE1329559A7AF134C77ED + EB0AD99CC8D66665A3A128DA65E05E695C8147BC2B86BAAA6483FF4CB24123E9 + 26CDD2E8E29DAC86682CA8000285F2142CA0A0783562B167CF622342CDC4F32D + 2500986385A9F56026061DBD13B7E135FE2421722FDCC41C5A75A6C3457760A7 + A238565E0D11FE99477AB2A51AA1AD4D08DF7D83CAEE8FF084C08B41CCD03759 + 276993127BF518E9E57A2638E44F2AAEE11A6D06B4613C1EADCAD90A17D08342 + 5872C9F13FE93B5E8533DCD6A0BC25C6319A62C99044AD7C90C60C65E3D15CBA + 0DECE5D09FBC6EA1E0AF1079622DF6CC989869F80CE5FD3563A1CA3EEB78AAD7 + F8E916E545E697F719E2B4A1F32D9D8F62B2558A2060D05C74DC1E7FB3A8C532 + 4EAC08A1A8FFB376768F918DE946D0660A9727D088B942A58EA22DB19477CBE4 + F7625DBBF6CAAB7DAA785572C3DCC05119B3EA58C6B79F474E11A6E41F6E5F71 + 90A950FACCC786F4F12FE6372410796F0FDC09A14BC1D0E2280121E71F3FE43D + 0A05B8AAACB85868E89E24E1E5ABB561C083D66C083EB14AE824A14CE46F7DC3 + DBFB20C23B0B0A67926D07005294DDF961DBBC86CEA0E7E5A4BEF28C8CE5BDFC + E9345DC24BA7EFE3E57ECDCCFAB1D378CD7BA865A170ED1D53DE64BAF34102DB + 84136A6B126847C81D2DF85AE442B21647434E3E25B2FE84C4F7AC150FBBDD3E + E84040375ADCC4B0D5530ED47816D765DEB24CC5E018CB9223A427FE7E566AFE + 50BC004A55EC2CA0C57AF83C3853F1A85AE5787203EDC76F009234236CFF4FF6 + 71A17EA77A77FE687879A887242FFE4EEA7D8071F355E2319760208F49678165 + 641C0007C30B0BE6809C2B4BCAB275B8CA6B2770D3AC7CBE46333522E00EFD56 + 6DAB97E6E8AAD049E78339D0F11C791B0ED430F43AFCD4A651F5A1FF64E8057F + 8CCE065F1C290E47E38069A49562EF4D55BABB97936D155D513AF7B7A0584626 + 1A04F727069BD554F6E6D5073D18D4D396076DAEBD33755A4053B4DC7DCEF6BA + D43CC4F933C44F7153440F2C13296E9A7E4AB9071C59767A1301F5667B623629 + FB6997EB325FC739CA5A9F6E06247A48EF2918482C29669CF61E5FC7F5F45D67 + B7E63D2941D36B160BE21DEED79A041D32F47BBCF56379143122A0897541CBC5 + B4E6F1C75E93B2CCA2197E7819A5D8796E530068609D14DC23D3A42E9C12B3EE + 5EFB625F3219AEA47264B782743C281DA02C1DCC853D8CC7D43A3389A3FE2132 + 66611DBECF15D35CB072F899BD696A1E15F60D535BF5BBA3D20CF50627A5C051 + 09E6DC02464433B1D9E4CB4967077E13E1BFE02AD614F0682C8F84CA087AF188 + 001D51D761F5381BBF2FF19A09E76D087422A6A21C04C0F34238647122D01713 + 63BB37FA4EB7DF42ECC711525468039D2B5DC9DB42FCE3B1CFAA95E944660B85 + BEF4320F01A66C32204E293FAAAED7CA9B7908C1D7F3B4DD00CEC31479454D62 + C0E81CF5F1DE533176BDEDE6FFFB3EF586B3DE23DCD5B48E4AC2C09CBE413D03 + 1928BAA53AC593E554BFB171BE13E849F23409A774185D8C1B86DAF5C33D5581 + C225011E419E1DC33DE9A74D42D701896214E86F17CE35791F7C7EC829E420 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR8 + %!PS-AdobeFont-1.1: CMR8 1.0 + %%CreationDate: 1991 Aug 20 16:39:40 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR8) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR8 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 49 /one put + dup 50 /two put + readonly def + /FontBBox{-36 -250 1070 750}readonly def + /UniqueID 5000791 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C + 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 + 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65 + 48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3 + 9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB + 0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB + 8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F + EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466 + FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3 + 9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62 + D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8 + 9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5 + ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6 + 10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582 + 83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493 + 2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA901C077A059F709F30 + 4384CB5FA748F2054FAD9A7A43D4EA427918BD414F766531136B60C3477C6632 + BEFE3897B58C19276A301926C2AEF2756B367319772C9B201C49B4D935A8267B + 041D6F1783B6AEA4DAC4F5B3507D7032AA640AAB12E343A4E9BDCF419C04A721 + 3888B25AF4E293AACED9A6BDC78E61DA1C424C6503CC1885F762B86FECDA8944 + AA3B20AD6019056E01677B959B23107F1962AB2CF6A52AB2745FDD5383ABAC44 + 22F83D93327D560012C565E49F2EEC04A6EEBA9D605FBD223B59CD8DE300A5CA + 3790E9B4CF846CF5AE93B687F3D3EA411CAC0F03C47ADF9D83887702475E36A6 + 9FDA88B48C6FBF07959EF4C6F61741CDC2D503CB8AA0135458716D07D1774C21 + 750D01533D7CC822892EB494A82295E9537CF478A381CA7146A6BCDB1FD833E1 + 4D59DEA7DE0D1976AC7B448C17861ADB891766639B6F06B1CF3B56FC847D6C37 + 606C5D8EF98FA61D8943C404756BFBD2F87ADEB2DA92585C7521D88F486F5DCC + 92ED93565808705D38E9DB085661B771872CBAE4DA363A02669E99EF1AD09E50 + 636CFF7172E5EBFB1DC08E76123FD5E5D60D76DB7A5DDBA4F32521A4543169B9 + 8825E3F2A124A1CDF79BC32262897100B0BEE618A92806BBFB7C1522821547BB + 7D97346A3FFFDEB9A36068828431810D0640D0F3F07D8EBC8F1A952BFB809BF7 + E54C0444110A1EE0BC7392CCE28224C70E6872A8C91DE82508094E3418C02118 + 5507AD925037FC20ECBEAB31D84929D5C6A0720FBB3E + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMMI10 + %!PS-AdobeFont-1.1: CMMI10 1.100 + %%CreationDate: 1996 Jul 23 07:53:57 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.100) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMMI10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMMI10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 58 /period put + dup 67 /C put + dup 71 /G put + dup 73 /I put + dup 75 /K put + dup 76 /L put + dup 78 /N put + dup 79 /O put + dup 102 /f put + readonly def + /FontBBox{-32 -250 1048 750}readonly def + /UniqueID 5087385 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 + 9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 + 990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E + 6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB + DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 + 59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 + D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF + 8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 + 6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 + 1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE + 03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 + 95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 + 74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 + 3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 + 47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 + AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 + 42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 + 40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 + B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 + 95601766758C197F327101A9C9BF396ED625E27A7791ADE4B3BEAFF82C08A2F1 + 07F10F86FB1EF3E90F73EAF3D48B1A37B31A693509CC8173069307F748CEDFB3 + 7B6C3D9C22C71E1C72561B8B2F39FC1256F383C6C7BF0B0B07D70E9A6DB10FA2 + EA43D061A114FE787C46FB96FBD2F5B5DA661E72A954F35914DE9BE2C2948CBE + 8E9408F2633328FFE8BA31FC801E116F42F744D39EEFA0EEF5B8E898B918C264 + 3ED11CC421C0DFD6F384987B3C4AEA2A1828EEDC104D7B02C684AC433258F29A + E5EA32D5650E38EF362F8B73C0B861F877A1696B89BC88130B76B4B83C55B509 + 5E32C0BCDF425310FF1198DE07D7F93F01E5D7B6DA37DF76BD292707636B801D + B2A90443FE2484A157F2BEBBDCB6CBB8D1EE8F967103B2FEA62A56D14E1AE201 + E68F1507A04F0CB976DF263B9C03A22BE19F5583C1AA6608763D75539A8BF2CF + 209C40DE53A6A28D8CE52AF08EDAF74B01A57D3B0592A2C9E22841D55753600D + BC8CB2E6F074B69BF94999B751304A52D5C646AD9F463FC568EB544A4FD28615 + 9DE122B8EFCB99D2C224DCBED00E44397FB3DDBA4B0549B2B8635FF3D3D1D427 + 493F8CE80B7F19BAC0140B4D7CE87B4AFFC51414912CF77F8CC58007966CC0BB + ECEDC3C59894E4B9B516F30DFB2C2871853588626272EEF61BB9B495BAC35543 + BE72B747177C458644C8BEC43ACFF49F0D5C49F8D12C401765E70C0BC64B8D55 + 1E2A344D4D0A8F01F750531C277F45AE21F11F790017ADDDCC775BABA4FF4953 + 7345776FA1ACC2A94C454A07F0BA5CCF1498E0491B6F7793F0B7E12A581D5BBF + C2060BB990388768C5005EF227A6F351565CA3A0D3BED9AAFF8B3BE6680CA43E + 3838926DE7216F80193D748E753A6C5B5240C40AEA881822DCBD61FDDE9F4BBC + 1C09D67A309BE80BFC88F24B4413F3444E3EDDE2C8C0EDFE88D7025FE98B71F7 + CA451142814880536009E268CA0A1FA99FCF6F1741C4DD6A0A56C472C8A42181 + 5AA5C9AC85911BFB2358AFC42D5666824614325F47DF0A3CF853F43CCCB4538D + B11FC2D930FFD14367F6317003A1FD914AA0B54313D065EECCF5A501C128C2D5 + E7BBA1358D8704970CDD531F1ABBA88DD9F717554DABB0ACDCE3C3E891831662 + 49293A075E09110211B2F88C0932DD71A9A61DE33B0F3747A138579563A57322 + F555B5004807E4ECC6BEC6D432F2D6CE8F2897E6C0D0681B7876B2E5E3F780A5 + 4FE218C45E12F3C1E0AC920680208470B2A3187AE36AB16359ED19E4C999CD35 + D8F983581E10D62839DF9B04FF748582A72D67C496C6BCF58DE2CBCC4B17C54F + 98212126833EB37AB2F7C9144E1C13859D928C23BF028DE96261F979C568EB26 + F97AB138E9127949630813BD9627F2F775A2B6449B5AC0A59CFDB2C434D75193 + 15B0A4066B30C48BF97FD9769FC85655EB647652D87C50168F2041E1101247EF + 455A8B38992FA81C50E805D876C1E10BC0196F18B2216BF6ED761A81A1D8203D + FF6C34E3101413252DAB1E4078052F5F6770ED0BDFBEF313F40E0A2813FF762A + F56758510BE2304F5029820AF0C552D20D53C69F149A23A02ECC2FB1C1946B1A + 35BA5ED89370CB8801AF5B1B7F991C5F5C89A90196A2B3A0B9EFF6003D845975 + 7FF0EE2640B943B6ACBE76B8C2C4FCBE1D2418F09E59CD30A3843CD7DB4C1F34 + F959C516EC16BFD008848A0DCA9EC21CBB650AC7FC7C551DC8ED40040CA15DBA + 28F4A2835DA3E7BCC4008DB6BF2C5E26712E867C5B835FC760857067CEDF5A3D + DBD8168550C8BABC5D21C093A6031CE94544347B56D8A05ECD637D20D36E3BB4 + 89DB200CB15315ED4B12DB725930FE871388556D1AA9B7CD5A00CFE4B5257885 + 0F7C2041B7BAAA645BA6681A87E0D5C432797FE4AA561DCC5B60D0F2B28D033A + 40CBF9A1728874F5A764B04010D86C8E98D94917C02A684CCAE8623ED2DD846D + 335F2FEC7444F6F2CCEF8DF77148DF75ACE115F174E5EED1A7F4FC283DB5FC9D + 3FFDA81A8BBC269F2BF6EE379769CCFA4EAD82509E12009B25AF2E32303462D0 + A4EC10ACC973D16815BD26AEBBF11E094A2BE92A5797F5BCB697414E3EC924F0 + A2848FC04272657B203B61D5127B6D309BD490C7371CBB142F614EACE921C37C + 3BC865CC9C38501DFC98FC2FD85782A9CBA36A93B936806BDE7D3D024AEE5AA8 + FB060952D8B20B476A9439F7018B4CD0551FC8B7FEC8D511E1AD715904C55C78 + AF7A4152B054113BA2BEDC57E12D1FEE65B10C73CE4C13BF7175D6E786DA90ED + 433999500F6FA319442BACFC2C05F73DF9163DED081A8647C2A66D402B54F49B + 1728A8744B5822B7AEC3070F126E9389B691AFD172960A0612C63CA78E4DD286 + 7CF802FE5376BA21737FC9D71695840A99025AD7070916B64BB8D568DFB47700 + BCDE09012BCBD0B8EEB50476046EF3FAE23FF433B86EBF78FF00C4361DE8F9F4 + 5FCDC3CEFB76FEEBF68A5FA333DC1AF9C4B97C58713C5D679C607C54C2C11C8E + AE26C44A9C9473601D5A020EFF7B3F1CFAD418E91E136F5EC06093700FD6ACB1 + 2EC00C7EBE332879154B1464BEC0601F102149A7FA1CA7ABD2BB44803A0A7F25 + 2FC4DF03C4A11D65C1E4DBF37C0FCB21F4281F41DE1382698B70721ADF8B85C9 + 39B60595DFDBB12A6943A915AF9454779D0D906898719F54ABB3E20CD903 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMBX10 + %!PS-AdobeFont-1.1: CMBX10 1.00B + %%CreationDate: 1992 Feb 19 19:54:06 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.00B) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMBX10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Bold) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMBX10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 35 /numbersign put + dup 40 /parenleft put + dup 41 /parenright put + dup 58 /colon put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 83 /S put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 121 /y put + readonly def + /FontBBox{-301 -250 1164 946}readonly def + /UniqueID 5000768 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 + 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 + 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 + 2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 + FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F + DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 + 7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 + 9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 + CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D + 6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 + E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E + 8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E + 3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 + EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 + 0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 + 4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF + 1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 + 757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E + 0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 + 6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED + E067598E1B8B781EB59569E3D0D54D8EFAE0F3EDE26279776ABA15341E42E636 + 6E02817082BE6FE0B04249A4840C11F95F8ADEFF72173E9A5F2AB2F62C427E5B + DC010E18641EAC906A5EF0F9BC2108062134A7F10956219C5847C0D82F0E8663 + 12D963E012DF0DD899911EC5D8096F80B49CA3444CF1294FBFAB57DFACC9D01C + 46F3BA2F3D1C14EC30CBF83E5729F1C074D4F1665405CF54722827FBC24AEF08 + F6DD0BC6A79A2DB1FF539454E8F5D1A42D40CCFBC093AFD3E57973A009095CEA + B91FAFD236C47F453B38DB0067907A28EB5E9ADE87A2181F1D6DE4E183631716 + C21F0F952E0666AC74371F8B5C888DC44FBA5607435A619684F502CF625663C7 + 94B0DAA79BE8E129E7F5C5AD1B7495C1BC9B1C759867467F55148C7FF2F914D8 + 95218C4C3C2D2DB3482C21EA050F23D6A7A056B172EB210276CDB3B1DCA47A9E + 8B03B9BADC72F42D28ACE31D0633A0A1B22254F37EBF0433F0EF1CFEBC1CC653 + E3EE6D197AAF36E7FFCC75FE1811BD701298F763AA466B7843770F5F219F1118 + 5AE73046838300FF9A722327A7A7082A730576333A59BC13FD56361AB3665FD8 + C34D29C8C30ECD8AC816C0139CBABD4FFCF1E22FC983B7B242630B5134CD4881 + F09F567DD18C81FFABAECC3376C03FA58CE90EF10FED0A19A1E6464D99B7A5F2 + 555E40139298F3F8B1002683667CE7426C6CB949B12F7F0F337293FD794424A9 + 763FDBBDBBD50A0C0962116CCA214F7DB35D245402E73EEB56A8A5D3D8BFCEF8 + 9A6BE3EB9276F37EE9C4D0251F21FF313C62B8C1946AE90F8F22F5353BBA2FB1 + EB1795111596A7366AEC99557663D5587549F2C3D3AAE61BAD3BCB333C5CE184 + AF9A55E19298848D5728E7E764671E5A5F3E487C504CF38327EBE4CA5F9F4AFA + 2EB4241F861B1A7175615EE8BA9ECE2DABBD7FC3646C4EBC7B0BE5614E50F408 + 8D7B9EC592824716357B84BF6CE5C17D21922197FC06BF837C82CEB4F266BA67 + 4CC7FE390B4E320CB26E2BD241B993D1925C487FCE04C409D748D3355E7BEF91 + A429AE26B6170DBB585E1E677FC5AB6AA9CAFEDAEDAE3EE92816034534E69CE2 + 7425D2AE4ACC0CD0D0F588DA5F4611C668A03AD5ABD50F10CFDCD78BC4B589D0 + 9E00FE06779BE0A7AB6F729A5C502D5798060726B3B7617B07EC564292EFD260 + F276EA65614227C71C390C300B293DBE443764E6C9E3B81349E229B1366CB4A7 + 6ACB2DCF1A81804FF4180B31AC4C3100FD08A3A0E9BD5435C249598578CC1C43 + 7E81D737DF5B9B1CCD7694D468DD0856973E51CA6FE48A34343175A275B4B9BA + 036893890FDB194B267BE953C1FA5A97C7FCC16C8D9FA3CDFDF2BF53E29664E1 + 4F138FD9D0CAE8BA44859D55A5CBA0CFA815C7966F4834D8654AB4CAB5E419E2 + 34188561135C0F8415F0E422A2C78B35D0B833D0D8519106C5125662310F2953 + D5F28332338F71CA6F8CF29F761CBB1D9C78B2C14686800159B4CE55B77E83A5 + E405C9A3F1ABD17A5BD37554E4D36BDA46B72988D77013A66C7C7EA3D0853F92 + EBBEA05129CB64886933669E15AE61A1F3323AE54D38BCB19C87114FDFBEDA66 + 2A2EF844E852A178C50C18DC5E7920411E76719009C65D0A0DA76AC47E0BA82B + 7AC6F3B13218773AF16A0B7A10F8D4DE647B1ABAD06DCEB289937924298E0D64 + 98152C070B69C38508038125C7AD7C38A1650F7C796A615533AACEFA3EC32C4C + 11147AA0030C3C55AF77CB9EABCEA77BEAB520D1D5A0CCA5750B09BF5A2BAB24 + 56DD087253A0D81C0BDE841B846083F56A6D79C9D4ED47F957F855AE06E1F300 + 39CC2AA374DCC6FB3038F87C0B7BA7FCFD9589697F17520623BFFD3DC3EEF113 + 150F780F829D5AD3DA756313359ECBB4555BD32960D791D759E9376C74828E3D + 129795FAD2EDFB9EB15D2BDD4D83BF2F4E914607CE46D209D7465B4418219A00 + 6CD542083E95A71692A6911480E171AC886C2FAD20EC27345E5DF5342403D871 + C9C4587121073F69D2BB45A3B495853FF9F0D9A0C039E4545C0D56D6738EF30C + 038F46D69883CB08553731FA1818BDC466BA3AB7DE650FF6F7AD90383D7DB606 + 12B4AD13F88DDC728B5E5BC3DE976FE8E1D93667AAC54A928AF812F60BF7AA90 + 2B80A7CB58AB2B607FB4D67183D40A4663BE3A22F7B5F7D7D5D4ABC6A8208D66 + C7BF2D15B27590E73D32788AB755002E57D0D54AF6115187746D6969EE0FA19E + B812579657545488AC965F8B593E9DCC6F32F48EA2CE8F7904CA925A57C52714 + 99779888C85593028948036D80071AD883DC1D17D9BBB0159F2953B63787135B + D665D953F91E813E91295A2637D1B6A8D6F2FB7A6ACFEE31AC58EF46C9DBF702 + 76F64BB3AD00C21C1E7093E2D56E7EC38707FCD342DEEFF5C5C3A30E8789A914 + C3AAC695984AA2A94C38CF131F7FE9D21B46D23AABF5647B0401A13C71D1A2D8 + 8F582523CD907810423FF1864ED271F683385259BC8165BCA0FF7D48E29DB102 + 9D1E33C132DE949B09074BC1F0ADD3FC0F249D31445944056C1547A67580067E + 5A9968FA0AF6781C8C95D356D540161EBE237AE1162553C80045BEE52E041B3A + 082EB8D9FCF3D9CEE4FEEC2B1428267AD1802D1E5099BB9450236101B51F2D66 + 4FAE586FB4F9709554EE67118018F1750C32F732EE4B8211FF3CE4750201F391 + 0F08AE39ED600917899DF3CDA3DEAADB391F75E7EEF3CAA528349FFC42927A1E + 0D7788E1D10ADF695FF4AF810CDEEEFDBF628D11A9175A490788E7296A2AC32B + 6BA82E386B0046562D5933C0444C66CC91584C1595B6A8E1D698AC2BCFE98AD5 + E9E054EE7ECB8130C07F8026893989CB04A073E4AC2BDB4BE69FC0257A757DAD + F9791BBEC9E2C01DCC8F492F1927F39AF1515BA0AC23A7BFE7851ADB520362D1 + 71B06928E168F0D3E13A1BED33262F4A596623127D31345F37BE6FAD19D30CFA + 7A60D9B54778DC3B107E96EFC24E079CB62273E0823CB4555CE883EE52C60761 + 8C1FB49C7E51C9916AFD5D9A44C30F6BD0C4956F4649F1438B8F1BCAC199B252 + 7AF4A7678B9FA2F13F9E0F94F29CF0ECAF97C7DFA3169C14ADE8649EBCBD22BE + C01C2C86B69F81B84E4D106709C5FE479C22E9CA796B956DDDCC183DE43C27E6 + 4591F4A7866B53AED64E1B7A4F07315B95C210D4DC4D0865B7DE03E3071A09DC + A76C069B09C19AAEEC445FF0E63C775C6BC9CABE744ECD0A4E90AF2F75B87B43 + 8856A2A143D9F753AEE0B9D3BF4BD861DE70540FC75F9F7FFC948FE5AC48898A + DF969453D995AD49D2FDB48A7179FB6839F44D8B25569D05D70225BF8557CF80 + 0872ACFD4E36C7EC962C4FBBA21F74E0582E9837C3CB47DF61D3D1E3B4CE6980 + DB3D74C4E087FF8632EB918E5F4BB005CC36C8CCA2B84191120452B8DFB51FCF + D376133DF9822F806D554C9B2239DF8E1D57E03768F872A8182686B9604F8DC6 + 7EB80CC041D2BA8E54B34BAF9B10E34415BC7E9018977E605B5E9BBD52060F72 + 008555A4260BB11FBE5E0601BD925C35EB13699033CDC3BB7DD16BEF9BE90EE0 + 564A3E34855BA685EE8A9C05133072C9FA7C10138D55C43E3F6BA68EBCE01258 + 0EDDE921AE1115B67E9D086145924EF29E0F92B62B40004AEFE6223BCF40A606 + 7E69E1906DB03248F66AC5212674A7B51F186E90512C382152F5E22425705AA3 + 497B772F653560758B7D3C1E2F976B41A091D67C6146F7D998BBB2F052E1ED44 + E97B30EBE7C565649F40DDB1C4FB83595FDE1FF3CBB9AB100A80931A7A53FCBD + 4298A27A6DDC364636ACF070D35762CA77D85DE3955718607D4D735706DCBA76 + E4F5B6DF763EF8815C6F7665A7075DE660AA336742661DB553744898D019DD01 + 658546804997B15952F6A4BCA38E88338FCD787767F7DB74D58129F1D7144278 + AE333A0C472978D599B5B5B3D46093E968A424BBC12997AD97CE33DF927481EF + 2F7E4D44ECAA50B5B4FB4DBB8F6B34B7E4B595639697A7BA4ADCBB385B5683E1 + 251501C0A4674F56B36A7A3AD0A39F855DA331EF6A2FB5C8A6F42430129DBEAC + FE92051C625DE2E1DDEAFD6F9C555958E198C72DABF2ADB24B5D4684DCDCDB23 + 3DEB91739D3706EC2FF9FFBA30C7EAEBDF660C2EEEC1D5003E24E563EF3E5AFB + 720889422CFDDA0047CD62CB38057F9D3D8E9A8888007B9EB6D827C22E40807A + 3E4B51DCF58AB1244E8CFA5D7CFBA2DA999587190EA7422FB5FE1991073A916E + DC7A7148FCC94DBDB66263115F1A2D53BBF78B2E9055AFAA9DA15EBB7496404A + 2A5580E5DE5C531192D8BD96AB9C17AEA75DEA23B2F802D617B17FFE2ADE377E + 8ED224CB2DB75974E14ADF86D660BD288F3A2C8081766B9EB61620767467F1EA + 24E21FD4507F32F0A0074D9D4CE08EDFC992E809E0E9DADC559A1E752909521A + CB30E6A0E4534D7DB6235E540F756CD0F3A047A9C6F0EDFF224FB0A17B8C1D33 + 987541253D9B7F62AF97BD082E344A9234D876BC6E11DA0430C73FBDCA2702C5 + 3FA6B0FF20A0941C458E0AD66CD7F363819D6880626C811278BC463D9BB20D4E + B9EC3F7F99EBE192F147AC274CDFADE04B50DC4FE1BE9EC51AFBF2C4609B3F26 + AD15C5605398416A8F8C8EE815B2FF0B3AF66783AC5E5229062BE74F630F6235 + 7BB58CDB5837DE15EDFB68F6FA9E0FA7354B58277E73E16B0A423765C291C77A + 37669DC6EA5E5298518DB2D2A4DF49A0EB46CDE7AE0977055566C15BA92D45D6 + 5D186B2944C3D77A8F89BDA490779E32202B1F18F6C24AB65DF812D450DA7268 + 53EC40B00D007AD4908360B93DAEABE693CFF2B3441F863F505D629EE001F705 + 2AF092DC12CEC836C18D4B4B9F64A2159EA1E76F7279D3ACE85A01378B1BA1A4 + 88CE9D0BBEFD0178903C1DD4530AC4D12C276F691ED5DA2F94C680781A3985A4 + 00D8859EB531CB8E9EA5E5BB5B4899BB6F9776B9F89F14D3B97A7599984E3318 + BF5F87BE987EE8D37E65C81955D2F8FFEB6483E3DFF3A74D50AA10FB6E30FDC3 + C3892AA698929133F8DF04A5D197FD17DDB89C5FDB9FAF9D9282217EFE92A1EE + 334D54866D19C98D724404C4C8A3A0617A1510B1AE170A77CCCA2C98C510773C + 85BC50B2C4B879B44E295AE76E9C964E4C57406929B3C4F352CEF983509F40BB + 01F909C84B4488269C360265D8E7B37B32153248CB4AA6550FE0F1346A4CD768 + 26564F5302969BE6288B7BBDF13756C4B9535F02BF19F01BFF8369A01F8DD027 + 56C7E1BE144172AC7BF2CE75170E7364B0F9DEEE71107688394CDF83F0518493 + 74E37D2C6A817E3C2FA9FED385B13D0BE24CDB238A102C96812BF34E85FA55CA + 7FE5CC1DB38B2F1F55172F66BD5F269C795AB298A7C8A9DA27CF7429FE8112B6 + 5B5F2E3F4863DEBBC766D4B8DC0F02BB47A55E56BF88B85F36517EDFFD414FFC + 8C392872F993D8C07BAA663CA0392E9962981B0C29CFDD7277AF7735A387B471 + 9D6C9C45A9E46AC5FE879D2D9471F78D44BA8963F38417AD8964B960BC11EDEA + 98F947E978BA001DF2DB2945462864D92FE826E2B525E353B6D5EDF9DFFCC5E7 + 4C81629C4A803F7F3F7388301B9CB95EFD16374401ED584217F561F4EC867A18 + 7FDED423F1CE153F45172B4D18B0CBFBB2B6C65A673BB790980D90E09F4A06D6 + 5D6DB3F823FD5480F61D83557011F66953EF758A235B92C5BA41B7E450F4395B + 2A156A7DF95907AC0AD4752D56C2D3AF3ED44380ECCAE0FD522A56CF1CAE987C + B882BD3A63872A4662EFC17D3379B0A79DC08FE711A468866B2FC8ED7FECCB7B + F91382B2C34CB7B98C586009337FD4D7E963B13F8A46E37B2CFC39D6616EDE79 + C76CFDBAE6F46EE529AEDAD72C147270124C6C09CB2FF0F28298B60BCD12383D + E3900F11E4BE0B495E271E01EE1B92973365F318875E7D6AD4C8A62BAE167315 + E3A2DF5988E7BEFF38C42D31A86FDE55CFFFFB52E456E93814887292C82FC0FB + D84E05706CAD994D7F99C47A742542A82B877F5712D2E0893EC89604E6492342 + 867D1E90701850173B11A33AD5F05035A13C73CA20A475FC1617798F5670CEFE + 5533E0ABA2874F4475EBA15EA6599BFE75C4AD702DAF429FE602A77674BD9D02 + C33BCBEA28697614F4ED0FAC6CFA57305B96CC9088C248571F22A539CA5CF2EC + A8A25BE996EECF8C9601E6BECA09217D09E64F319B94E549F182920D19D261AA + 1563FB16B765A5FA1CC7EA3ADF21CC031AE5F5B296CCC2ED6012AD32468156AB + 63A54733BC518B0592AE34A3077970AEA40B24D3A0E038263DB8074029AEF743 + 74750C541ED03E0CE02E372FFA89D4CC383FFDC33BBD5787F7D3BA0AC326CBD3 + 00B5629F6B9D78C58B0D5AE1A79EF953A6555537224947F02D0CE08062A309A5 + A90827320DD4E92BE3D11350A92EE94BF0CEFF24E9925FB98993850FF9FE2750 + D74415E9FAA6196B8E8653F59EA4E07B4A17EAB3D087F6484EB5AF1B8322EB80 + ACFEE0B67439D14121DE3B732776072CE9CE0A44EF173507BE4251C0F4E5C3FA + B46812D1BD3F0BE18FDF90A6274C9FC29CA150BFA2514292CEE480928DB623F4 + F10E7B3B4B08BB1E10F2E2CEA8C52F6B420B7BFFA47432C7B4158A94D9F19EB1 + 392D23F8FE4FE5C4D009D2F8AE8185BDCDD06D82A51ECDAA68AE4A53F00E7040 + 53E85977A337D19E4667E659BDEEB5154384682188B0B1F46ACD5BE14D7AF042 + DF69AED50A914946B632CBA2D4FBF0DD5769866257D17AC2BB810D6E647BDD9F + 9219AB30E62A0035DDC8E9FE761AFAB50281B76646186CBD044375B8A915E4C4 + 5B69C7EEA9DEC406902D21AD0EEB7ADEA0A23A317A287941D625359D55F2D11E + 0F481956A2A7CA8360F9596C2FB2EAC0DEA170CEE10CBE91115ADDC15ED965FE + DA81DAB04319821CF560DDBC6B3D053E0E94DBC1ABF3B913F06E4ECFDA6EB2B9 + A199AA72915528DF76E7DD0590755C42AF5DEFF4CDBBAFF2673B1843BE3D5E5C + 8C2842BED2553ED72C96E4EABEAF05D84BC3B8E12E72B0EE74650BABAF0F41BC + 39B177B3C9FC9135E8B142570AC90CB6701AC8FE3FD4316CC0072A5B5ABF4D20 + 1793B5447535D59EBD2F17ED1C1DB9BD022858D904C5C130937264586993222D + 29B08B97AF20EDD52DAD9A9699F34CBA9FDB04ABED88DC05F39D3F3B77C55587 + 53DFE7112B07EC397E18D313952C131F65EC666AC2060757A3ECB2AE6FE28722 + EAFA5BEAF3E79083813CBF2AE6067ABE5C972BF84FE5C5882DBD9465E885E248 + CDEA884E40B8456D7115E635A167D6B717683A8A6C81660E716C2CB361A0D599 + 967F24BAE786371E04E9585260F57A40E230009319CDFAE474492A34877C215C + F6568A81307D544619E2458B3245D4D548D51B38F6521E2F151C4969D0B412BE + 1111478701BB0A3214F9CDDADCF2F8E3D76AE404E69BE7A5CA2B3E342806C14D + FC63E9B863EFB56FE4B6D11DE7E0663A6C181CA32A836CF6D01603B5BDEBDC90 + 00E0809B6741CA6B6B8008E99DD8B1378C5ECE0EE46FCB7D1B73DDCA365EF2F7 + 83D312AFED3F6E8AE34E53AF8C8D168BAA5FA6041023B7E89EC57B3DD45EDAD2 + A5E95F85779A880668956E18F473EEC8D67213B343AC5EC53A4FC8E28B3FA9F1 + CF4C2430D87B642560B14B2A5CF66ECD6433F1CD1610E2ACE73B91EC5FFBE5BF + 5A1F5F8C6DB8BDA4D58CC6BE29C30E52B73BBB57E98C9A03D4A9189F4A6A133B + 88008CA5ADB37C548DC6EA9093DD3F69E2D01467D11B4401FE17B51F46AFCDDB + 5252FF21A0CD4164C09A16FD8BB48C0D6D9AA7D433F500DC6585EAD3C20DF833 + 9503A6EEE968E33213540647164A28A85876CA3FD3D2C4277E9451B442B86014 + 088CBCB79D4DAEE2A7A2A0366DFAAF610C08172F696792080F101D5E6D0E89C6 + CC3B53309EFDEB01801315C7EDBDF7D292A919400D8DE5E649FFB9A68A29C229 + F6F81ACDFCB1B283615AFDC74F99BE894B89470E9427841FB725461840F84B5E + 79E27C1BDC5C13CB52BCD26572ACA7A58A023C1DCB1B8D436CF959CD6FDE3003 + 1AF680786CBF0CB852A839EBD96D815FE2B6E8215FA3E0EF6CED882864CC3CEE + 147D390D4E2013E1D434CC5394D4D040937A90E34ABEBE01F8D454AF4D4FCA80 + 43B023C4AA1C38602624C4242447B7006EE7BE3F2F3B727F8B5158C4A872720B + 0CB0799E5EFD95701CC8FD0190E87896FDBFCB84CDAEDAE98D6CDE9D2121223D + 00296ACD497854168EF3F737805747A41C038AA420A87C9C80794A8BF269CAEC + 8205B838D93D6E6199F663362F25550418522E1CEA670CC86EA66D1EF4995358 + AD89D70AA0FE013EA0CA64BA367CD3A621C4203D2F7B7248506937345305197B + AC02F7AC5C7D323C9467D40C16A7351DEE3D39687303311233D04DE50AB2FC7A + AB66CCC0F8312C65D9BA25C3828556ECA80C0F6460B4DD12CB9AA9193A5809DE + 80103A3296219FE317FAEE5DC25B0E84D8AC067025692E80BBD0F6D44C37C11A + A01A6709618D7D16C8E267FBDD619057B5E64B6EA94AEA8C6A20C2D0BE597E42 + 1B3AE0EC629847EC76A272FCC9E8D86BA72083E9BF558AF9DACDAECA0E1D28D0 + 8DE1B4AEAD214DD95A343B13AAA6000FA771CC7C78C3E2D9A549DE6A35A12D04 + DDECF1AE32F48EDC66621C1D4802796CD7FC5E4B1D9B009FC51B0EF8E6C47657 + 39BFF9E06305D154E64392402977BDD6633018BE7ED2CA468C3D227CA95A0CBC + 44EAE1E98082FF0EDC50470E851A0088E57DD740C084147908BC3AC469D3606D + A576F609ACE0F1A19851DBBF1F9E236A92623D7E09AEDC41C77C135CE4C0EFEC + 9888831202E4145A66180A616152AF86F1BE268C330412AB9D958E45E22B7096 + 941C2FD9BAC70C3F434966AB8B8B6CAF4E17FBE6E9E77A4C97BDDEA7BA804A52 + 0A03EB1E7E1E4033CE845A3C881C750FFE4BEC9DFD06571012168B942DD91CF7 + 521199B9D3FF2C0E1F08471AD35870E4C5FD3135945C441A6911B55D6CDF85DE + C47ACDD0D43EEC9A07F39F9352D6CB90E7B628715BA10A90535D4F50263AF49A + 7B3B46CEB4E4D817AF629CB2C620A2D80C0607CB6B8E39F38735C79481CA1EA3 + A574AB53114AB016EFF5F6B967F30A201AE9A327AD7C20458993582AF642B228 + EAD882256149681A5A31E0ED41D8D27E2E177E31DB657A2570DCDC1067D8F949 + 5AD95B1DDDAF51BF63BB4083C6C5FB8957A15A857DEF3D610F6BEA0A835E92C1 + 029084CF7B569EE7B37FB0637D70F90E219868D68138155F1727F6C0053D3F44 + F86EB4E2F5B54019E755C89E457C963EA89F2F4EF40793CB4F99FA8CCB47C6E6 + D202DEBFA6C4D283D1D50AF2C8120E5F608EF4517254DA2E05F1F13F21A4A286 + A87A1409CAAEAD8FA2CDF67C4E4A2802512EE47FDA7E9875A7185DD8CB12D5C7 + 0A46B8B10560658558D0820493B73D2C0F9FD4B9884B17089EF1801200D34C3A + 2DBB7077439F5594E16E86D1972B0331D3EB26A365A817C3E126044C38F45B98 + FEAA346F66D669C433B54C25BD3A9FD9416842898D921CB038D7E55E89DCE4D5 + 7079B1307451DF419796AA5E86891329EA32A35D7A1EA70912D70E6DE36BF64C + 2370C112EF4D6F28D0D7B2B4D10C2F21C6429AFDF559A097D470D9659C2B050B + EFC0E6DADE9E39A0BD8E6D91E2CCB1B6BE6E1435BB922AEB6CF6EC68FCBF920F + 350CF752406AC2B2FC91E6931518991397A62E80D0E481F4A6DFA187618C7954 + 410520E8B2D4141AE0CCC7E5D02FB2276F209480E703A2FE03BA1E92CF95F786 + 0C72E2C1B58BB04B161F1F848213EC022BE71616CF6373588171050A21EECD58 + 6AD60DDA4A686B2ECE199C2DEAC55652910800D854E2E8EE9BE7A1A1CA1995E9 + 2330F6AC062BB8FA3FF338CD399560159A939534C753689EE7FCA3F564BCC05A + 72ADFCD91B3F28BE25E960AB4EF978BDE9030BEA7034B8AF2A2A40130064750B + 1500BCFF7A1D8AEC91EF05B60A99AB14E3AE24C813CD7DBDF9FDB44DB55BD5F9 + AFC7AD4B54FEAD7623A73FA51F6F041C5F318E1294DB65 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMBX12 + %!PS-AdobeFont-1.1: CMBX12 1.0 + %%CreationDate: 1991 Aug 20 16:34:54 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMBX12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Bold) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMBX12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 45 /hyphen put + dup 46 /period put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 71 /G put + dup 73 /I put + dup 77 /M put + dup 80 /P put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 87 /W put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 119 /w put + dup 121 /y put + readonly def + /FontBBox{-53 -251 1139 750}readonly def + /UniqueID 5000769 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 + B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 + AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 + 7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF + 20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 + B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D + 68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 + D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E + 26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D + F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 + 77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 + BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E + C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 + 30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 + 148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C + E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D + E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 + 337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 + 0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 + 472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E + A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 + 3266FEEFE1F2ED62F1442F13D5FAEAC4AEA2B941DB306153ACE7538972692DC1 + 443B024E956B1043B14B9CA60014D74BAC4D58293D122EDE0B22FEFF84210BE2 + C61DC20C0909B27C1E9A9D1E8AF681EEDEACB47EBD10F4DFD9033EBABEFD046B + 3D1B3B585F0207DB3A053221892ECA65267559719980AD3912C807DD79FB08B5 + 9FD16BBA997CF5EE588385F24845DCE5264597B65F7733D620D4E1A6EE550A16 + 680184E46795C7B2D9DDF9AA39871C2ED6B647E8BD40630711BCC02C06B11B92 + B058049A1407E370843AE0CB82AA985CBC04F6D9B3F9705DECEA11E6AC46213D + DDC74BE3EF9DB795EE642E8FDB304C98058FC53A4C6CEBC5D6E0BA177FAF2FB3 + CB677FFACE15B7C2DE63EE2331424839BA4050A446C0D7C01936F059ACF4C0C3 + 500937610DF864C0E150C2C7094DD4CE54513573DC331A741BEFF8DA0213A878 + 2F4790F4414AB1694A4AE4E5DF64CD26BDA0FA1A253FC58BB1B078B449D1DCD4 + CDAB87241515801841577D68CE80F0285235D701E795EC0B18A9BC84B0DF669A + FF10EBC69BB3FC6CBFC2988A20DDB60E0D3B8319720B5B935FD6E14304580D57 + C7D5498238DDDF0F6B292AAE4D365CAEC8CE10B6A44644D19B16D9D4E531EB22 + 16D13B45862EEE01325C94E79FE1FA57852F3CC8B66DBB2655CF1DB6F82DDA01 + AB7C29F775A0F60E0E50CA4FF90F2189E219A559ADC75F2F96DCF92084342C26 + A1F02B23CF73496F0DC40D0312C1C61D1AA61F8C5AF93B6202D85B2284082A6A + B1D22E1145C331D883D9FD9971F5FB38441CD00C63F1BE2F398E76FE9C896389 + 52CDC93C61950E553A95ECA4D736F4A0E3F801FC34AB07D6F372FB62E87B3EC7 + E8C4300081FBD7CBFD3BCC0D22532458AFE69865728EDA24609DC005ABDD8508 + C10F520556CD4C8CDDA47E056168F30C1BCD8EA117234BCE97BDAE172BBEE6EC + 8834201591AFF337DE0DCCD9A830826225DA8BD420236DBD836606FA40BEBC7E + 6B62A97732547110BAB5E7B348587AE0EFB8D74F4871C430773102A2314CCD80 + BE5D65AEBAE538A41E275B5C71182F4D797B415D20F67D560F7902B67744341F + 450EEC227443EACB776FFFF2C45DA542B1DA4417183F8AF99A4375C87249FF08 + 195E03A082A66C75B94236348641EC14653B839D197C1C40935EE3816846A6D7 + A4687743993D7BA02C16065E67ADC24734D0C315024D0E9BB4AEC7769804AB97 + 51645CB42F452E98843E2D4511977E36A8B30ACF5EE181649F9ADDF451E167F1 + F2E304F2D80D9DB5F256BCDEA2EC5E888161154097F14F08EC0AE02F44499DF0 + 0CAFF3AF5834ED59445D49309A0AE09D1B68E56D7B64B3003F0B02B115EE10BF + 014DBCFED53199CDA6C4F88EEF1B4C37187B878C878AE478B0D7D9B501A4077A + 392F1F4A45EE6C5D4E9C1DEF7A37199E18E03A81BBCEFEE13166CBE9ABD4E367 + 8CAEA64E3EF155BA8312133EBC56CDB7ECC0C19D87E8B2F9CDBC4233B64E1D5B + 0C40B333734318F9AADBDA43E43646500D4D3BDF2AC8783D387D8CD27BA853EF + 8A2E76C1481C964C08D0E1DBD54FA0E2436EDE235FA2749779EA9924844E01A0 + 2F93715B4D32AC5DFD5725E767B721E533843D473641D8D931BEB32471550B1F + FBD0B9F945EA85DCE1F0690B0F40EFCA14A93FA8EB84AC7BE2C9C3DDCC7E374A + E3AA2444E090887F038A603FD06D8409383A1871579143B16A5154112BF5E0E4 + 5975D603DD2268EEB6DE129EAB074F384C7DE718C1ABD03823656097E803C8B2 + 51AFB800DFBE007F8C71722F4021E1385CBCF66237D3961D0728FB2FC55D167A + 5766B432FFCA63E861F1410FA55A6D7DFF5F5E0DF97E020FC25BAB04D3E4B068 + B0526219546DD8F397E338F756E1B7967C6E5FF0AAFB90870C9D7D4BB5326FB6 + C127429C1618214810E34A318A38CF70558BCA3CC5E865349DD76B1677580CC3 + F0CBD10123C87839DF1F744A6E831574EBA846F60C2B1A2C9211219AD140E088 + FAA3EBD55A1E09B3FAC0210EB12724E6003ADFA45DAC71D6D342E74DC644A819 + ABAF8E855A67E279C4A0E8192FE012169C64AFF50E1BBCA94A0971DBD7882E37 + 17ED608CA613E59412EA149DD20DD396CFFF8CCB3347E0F40159B5A724F37205 + 5BBD5708E0334F1EA93ADFAB997F7580E813D6C2A2B78917AF68DDA216777545 + DE70A63A27F5478E3D2911789B0E60707C21032516AA0DCFC1D0A751EF1322FC + EA914678B0667CA52B0F0A2919540C9A938FD70D3B799573C4B6F6703AE05590 + 44E62C65A73DE360F11228AB50F8946421C6F399ED4B35F7B32F8AB96A624652 + 778F1224505859A349E208C54E1C7566DC3CD64BA18B5E29593EC48F393B5AEC + 5ADCC25F3D317900FDC4140AE986A144A7E53CF334F886B47F7FC9DD5DE7928F + AC7C225707AF883AA6700BDAE1D55F5AAE7C8EC6DE2DFB9B15290F5A9CC7C835 + CF663AE1C3F642CE4E150C583A0FF97BE59792D21D46F7E80281726D43C5D32D + 41BBBFA78E88377579DED5EEF55CD8D6E0BEF32D816AE86E896EED85FA3AF8BE + 142C12C5CB37C004BB8BA1E8F6E275FD4112EBFF7A5CF34A74E4F0C94C1CA8EE + 6173E4CC92E09F9A33BEBDF4CF3C4021B909BF712A297B1EBD6F3F8D4B08F405 + C1F183084940692AC4EB2D1C995504DA2C917EE0F89E901BE309F86F82EE3E2B + 77542880ECC63FFBEFB68AAF44D632B6C4653BE34C53CEC091FEBB387F5BCD97 + 36087E63A5A7C991B7A1DBB70D840405C16C588D300791FF20FFD1856B64CFD4 + 445C4D67F71F138CFDA7E9BD820A69CC83589E237BA209A0C03C8087C31501DF + B08368EC096FFC08528CFEA81F1348F899395C12EF912714363CAD9D955490DF + 6D2CB08B26DEA06A77F48FD63C3DA094B64FE399D5E28B7DC7AC866D1B0E37F8 + 65D2BE6E827DAD94CC7B3478E275A6B8BA981E32425BB723CCD63A70A0C44956 + 7A7F02C4B534DB664699CDE5988CE2C40B3D3B4E66620B5F6C236FC7F68A8038 + 5D22A933B369EB96A2062214EFEF4692DA5EC39F2BA79B982D06E25D4D2F50B3 + 80AC5B24176B9BBF89504EF4420EC81A5FF11AB67E83306A3469027AB38005CD + 2FBDE86AFC5B52AFCBB795186473B78555D27F041B57221EB0C208F0867BAC9B + 5AF43C16946EFD6A09D239EAD6AB9E1593FDC7934D06BC0C8641005554ED2A41 + E23BF4923C7C1A1591DC0023A041CC1A4D3CEEA25FB6159512E55B1893F439C4 + 9260BCC87E1127A8F2BE774F199F33DDD2698C45F19A18AA3C5FCCB854FC1211 + 561062E6F8B6CE47805B4577308F219385B1D307E91C3CCA3E04E5F24BE60A06 + 2C0DCE1F015CD7874CF2307F8FEAE008C67A0DDF7E79FCBF2913FBCD8BDF747F + 444C4097874223B93BDDD7EDF279F9EB8A0B3BF218034ADD9A269716D71AAE35 + 7F886B72F6A1C008E38EBA2D3BED39D1478E4CC29A1F5BBC8558320CAFFC6AEA + 2960110E3A16EB97C8922A9E1647DE74A5AD2D8E4CEB0A57A5FF75B76111999A + 0A543C2C6174B0CE274185897113B0439D6582D9269F8697798B0AA796C089AC + 55DDF1624C2ECFBB5161F9B5FF1AD8FFCDD2D4D17A953A922D8C6CD75B85DF56 + 30143FE762E588400C8F6C96422C73D45CA656599FC23E57956E4F985403BE37 + F397C27538F920EAB3B64EB854A13B15F5EEDA440BA302237890A086A15D4BD5 + 4A391B76B892D3C06B36CD9C2A630FA498309BF9F9EA2C2D99F0786912944EA2 + EDB02421BDEDB294DEB6F22FAA49F934467757971A81EBE9D8391D8C760B62C2 + EDB453C188CF15FC73B21C89A66F6512656CC181F848BA34B1CFE15D24A69704 + B5D6E109D28E22F1C1D243604948ABCC2BC8D34605AEC85B55A8AC3952A8617B + AEC533E9B2DA98B1853438CB0A7D9E191B6AFDF4F10B9B08ACF79996B8BD1B92 + 92848CD1F83BA669465FF6A3DFB55E5FC7198720BBC8CD6EA08E1DF6F0EC786B + 865FC9CCF66A98B0629D8BA4D913D7C196C0D18A26A0812F6CBDC59E4F469A09 + 9A5DA5C203C58127C6358FDBE7E19213D2A2FC380C2D6D1B2E1E8A677B35F482 + BB12488092A36FDEEAAD1415C8208A2B5062B8FEEA1A5AE10A19D9984DD5FD11 + B5E21F5B38EF4A4C8393D178CBCC12F556D1033D75010E5564BDC1B54231C3C1 + A38547686F779F0A972914EE1B91FA13CC2727860A9A32C97CCAFC21990561F7 + 5002C70573894FFFD567E15005E13643E975754865359E74E1AF22FDA29773F9 + 1FC4B1AD87C338A7265EF0C1AFB0FAF39440C63185611A9888D0CABF81F9033E + 6327EDB2B17883DAE3B8F07FFED4392941912C25F3DD96D15D71CC647BAFDB73 + 50FE847EC43DB3D685A0017B4C5C4014B137F010FDF9187D83B13F53A13FEEAA + A79B4AEB18B86E6EF848AB707953B55C3A541997127D5C28E128A34A0861CE54 + 6C93A82F4DABC734043ADD6C540360B2489A226AB28BD786CF421F9868B8C14A + CD862131CEE69883C9061A3D514C534BFED9167FCCFB8336B07EBAADBE6C13E6 + 2493DB95A5A090E2A89E5E98B029967D7EBF4221D9019F618F5B76DFE4794C35 + 93D59C08A7A7233F5B4D28B60136DB6E02F62CC0662D72F4A572D3247A3A08A6 + 34BF8691D7F537967667108FBE5FF2335BFE1F08FC2CC11429F8BD61C4064C6A + E64F569E940A5BE5C4280B8236D4D7B895D2E1DFFC4E05E1E823F28F793EE84C + 6F6F0921CF6734541B66328DF947DFEB55530E87EA49F9EEEAAAD9109AE36343 + 79E63829436AAE62CAEB4E61A0732347FD69D8B7C951637F277C8CE1E3BFECAA + 6F48E6FF18AB650CA5B0375A38D89A04584D5635149FDEF5B65D226E33D1E016 + 8D43B67F36F35904F31A59B904DA00D2D048BBEDB5AAEBB446A6BD302915B9F0 + 2DCC35B98C6F194DBA0F050E3A1902B45966A9D646B01126A94241B92C86A453 + ECDB7928A52AB28D211B82ED2425C88660B5AEE13282A80AAD461B1C423E5DE2 + F23B0582022866AD57F27002801945AEC3C84BC34433006B21232A88EB23FB3D + C9E37ACDAEFFE37535925766B5F23DB51182FBB4CA7414B3BCD94A4EBAB3368D + B2C8B18477152344353D5F319A1860BFD11F3984BF1EBA3A190DE03A69E26305 + B73516EFDB0E93AD2D05AAEAF0A3966A11D571789552DC0D9A7E29A948EB45A0 + 249DEE2984990392DEDE23AABC4673986D59D3964DBF6A8124E856B9999959A8 + CFA8FD15E6419F1491580A364EE7244961F88ADDA603D4A800831768F3F53093 + 7C045775E75EC9E3C1389F6DED7E8AC261B63A8B4B05926F58098BE1E56F615F + 5E30D4AF54B71D8787C554AE785EECFD321F2A55BD40E2375FD107CABCECBB6B + FB005F14051F2D306893D12CD26523992ADB6B67507D480826B6EE7A8A91E24B + 65CFEBA577999C5CE9B7F14B1553C01B9ED584053E46F5593623AE2AB3002D24 + AFF64BBE183BFD617A64F20420DE60B0D3B7B29BBD61E7E0FF1FB31FF86330A7 + DEEF105F6E441841DE4E6A8FAB9AB796BBE03ABA672050273DAA20C206C55E31 + 900304CE46A593929FCC7951DB40105F4C2E2EDB217957585EBB1F159FE982D4 + C0CB22F4AB02EEF6CD110920C1ABECDD8983C28F89540D3ED994DF791ED3B8EC + 401134E7048A0F7AAB51BE8EBC50A2CEEB4F66FEF4F3664653C21ACE00076A4D + 892561BC6CE95DD785219F070169E7C6E21D960ED0A9B8CB7A703C6D98DA43A4 + 85770401540421341F92359C365BE9E58F97D78F99723AE54518DC475AB75FAC + 28A4A495B03227141BB83598AF3786F7710521097635586DEC51B3F713845A8A + 22C87FA6FD2D88C566CD23B40B915B605306FCCF38320DF271E20E9E15ECFCA7 + E89A3419721CD4E53D80554B0A18F7B9055FB6AC87AA8525FCCB5C8F4CF6EFBD + 5E6BACF1187093A1185CC0CAF4EA663F73C515D18D92D000CC2F5B02B7D27F9E + FCB0783BF0D0B725E542769AA222481CCA19D571E9F7893FC5DFC68729727C44 + F624E95D640A95493713C8E33E5A06C6518EAD1D905D5FD0012288EAB03CBC17 + 246710E8FFD5F61BA13C56DD2CFC7D076E692E8C73B01C92862C8A9184CF0724 + 9E14DEE12070D1A7B122FC3CD4017C34CAFF1F2A596EE9772014AA25CA8244C4 + 6CF9AD85A76DCA0EE7702BC4C829613ADC74142F5BDEF516764913A5E31D7797 + 6333DB681FEDE48843AFC369B22AE2D048A44515AA56AE3032ADFF426EC4E119 + 69245CFF019D63955757AD1030A465D5E7AD2746E2A96D648876B14188F07E48 + 2AC7D4D0D201167B3659B932225458D77DBBA7412DC94B3BB6EE4F8D481AADA2 + 7A4DFCD6446CD81A6E2778C1630A622BE4192004B14E83B783C7B7009B52210C + 1EB8D459A761F3BAC2BA4A75A8543F1A31F151A30ACE40590D1ADAEF75CF91D0 + 774F059F45AE06DD4273D11A018440B2B1C4E5C9F4C9E12D1E00BC909FCB0DF2 + 1563DB1898BD4545C6873BB5FF06E440C437029A1A74D57460B2689C8F8106B1 + 546CAC0811037DF348D08EA548839082A8863FD131C108445A572AA7826F5E36 + 19FB36536C5093D939A3DE6BD3FBEE3BC74B600E086A73B73720EAD08BC5F145 + 4F16A8FCF0B083C1D64C90702360281E175549413B9AB4765735E8EF6A1D7A3A + 4A4FE21EB580053D3798902B2FB9625DBBC3A9C56988630D6696F0B134442D4A + 17A5EB01C91B9C55A22D057D929329C20E5E1DA97ED7D79664AD663C6F8034DA + F68CEA9D75B0898610B638C599E6FC50E836374739CD5C88BD6825ED6BB4A434 + 427F9ABD5FE4B20C0B6C03A178F642A66AA3E0E0F64864D77D9886E9E44F16C1 + 54D348FF0FFFC12F059B50F3D2F5AC40C4100859E5446B8BB359C481B1901863 + 64D03C9C7A2F0B2176AD508C1489F120EB4C5A8EE1838D3AF57D208C2E0AAD38 + C1510206F4D24C2E2B93CB201A87B0CF227E9354EE4B4153D02DB7245FE41ACA + DD152902F73B9416EDE0CBBBB6415887C7E95CA1682A61F95A6E77161066C64B + FCC59E8AB40831DE77D5EC50647AD3A2CD336D860E9A439D74C48654EFA3868F + 142DF30E79DCD997E89FFD8E8964B1960C16D00CD23170B1BF977800D1FB73B3 + 167796018DE3303D939D202F690B119C3EC24BB287040A93330D54A0EB603413 + 79DC9CA22B30FB4D69EDA77B505AC5F9EDCAAA3659470C780FFCB25AF98E9841 + 5B31F826BA6E0E61013256E0375AFB474ABB1B89F35835481569F80C2F8FCF44 + C264D388F2047DFD133C1F96C34AD78394AD342A9F06BC86A4748D3430E7DA89 + 3D954617CE769E714CB52565251A8A5E26FA922B469EC6104324B02642030ADA + BCA075D6DB562382FCCF242CC146A55819F586E43385294CE86082DFBE72EDBF + 3DBD81003561210AEF1704FA866A112EBBAD1F649616E1D912228F3E40BB4212 + 8165EF467E1725A6320CF6082D9C92458D33AB58CF92DA57A8E0321E5D571D8B + CD1C1DAC006FAECA38D45E9D7CE07FE9CC021DF72E5A4A249DB7AFCDC1DC8FBC + 70078E4C0B3C3E7978922A64CDF58F6ED07BFD9B8F6AC9DCFC6B64F24FCCF9E6 + DC4374CF04A94A0A7CEB69CECEE5A3A357161EC20CCA8CE9DEA607086DD7F755 + CF0A59B656388F766770FB16DD50103C65B96CDADF0E3CD425DBB6156DC5EAA2 + A00A14E7F5E443B7F7892D7DCBB43F364AF058E2AE10FBC6B607C9FE1C9BD436 + BFF1A2BD847089336B6FCA261CEF54393FDCE1FF38FE44D855A265BDE3BB3EFA + E9AE1DAA0DE1BE3F61C13983D7F875CD69EB8CB30E9AE124827B9A1B1523F623 + 1A1247CE6C33CD80CA6D3778B1881C0C6799A670007558E925F5507D5C926959 + E86246080FAD7FBB8A569A13B5CEED32600798A9FD763A8FFB78263A643918DB + BFD72A48BFE0A5832B2110E40334F9CE3098C842735A5064FAACC781ADF9E454 + 5EE37D8AC777BCBD7E1742129A850DEE5388F8AF05FFBBF326FFD71EAD23DEF4 + C8C68C12B5A4EFD9858710B34D756E8206D70EF0E66E46749F7D9EDD60618B52 + 8D2F90996D08D59268F5644F3193C6F1045CCA343C16E139F01492F81CADEBE4 + BF43F9198A179D7EE019188776080E6236AA95DAEB03EF86980C3EA413DC80F4 + 98696FBB204439D1A5C450DD1709DF1A56925709ECD8AFECF32C0CE874F12137 + FCCC3ED31A0FA8F1498AA9D524932FD9233632EDE9F16090F0C179ECB7E7F45C + 28A365634A4C26876B7A29380EEC3260AD5F298200572F8C20B72BD7DDD77093 + CE84D7433DEF0E0E59A63344A2D71367E909FD95D9668ED37D100564FC24B763 + 18D51857AD17EB7E10B4084A69A3E4051682C296F2567D9DB4A57C3BF921245D + 042771EA72891A980DD5AA02701CC666A51F6F0B2C5F57226578BED148519AF8 + FE2D6EC79D613E00E07A15BA33B76D4746FB72EA0E5AAEEACFC9FA785F9267BE + 0AAF58EE9C1D0BEB57463D0D57CB88A6CD09BF9A5AE37AA48A3A7EBD3CCED386 + 9550275812EEA30359C4DC5AF3C05803C636354C63542AD6307E606097BBC266 + 8C8AF1D42F7592E6130C7ECB65325BB4DD30210A6AFFA10547B1788C1A87E42A + C14C32C742D33495D66C13C6C7C9C88F1D859EEA2F0F3FE2DF011D863D467C9E + 01FDC6BE13FFDDAFB844775310F0315294DEBD70D86A5DED5AC15F272DB7F3FD + 51E244CFE7F3719FDBCBCDA85D7503A1D1AD10864723047DB97D6EBB169F7D8D + 7D969DBF4488B171286D02306C1491EA0CA504629FAB5AECD1B31389047BF532 + 78A6A50DF06449BA1A836BE9EF4FFEBCFBBA868BEFB6D422914D6BDFCF285C22 + 694C10DB22097AFFD768D14489D0CF05EF043A07DE2677644AEB01A9B653E301 + 7C62476B75ABC0958CD44D49139D5A7A4AAF905023DCF34E8FB22B64E19D439A + 8749C1F0B5236E03642CF0CD34428B7A09E6F53FF9E4A38D9BF681D404996FF5 + 69FAB0D3AC671C63E7F005AD0A3F363735CE517BCA273AE7998C941BD21CFB74 + 80645379B9BB1912DB60B6FB214FCC9F6BE00AF61C058195A63BB628A4E2D6D2 + 6F22A58CE0425CAB1F29C3B270331B3200088FD2919F07D2CBF39615B353BAC2 + 612ADDFDD55A8B0A453B06747AAD90A0E95756C6B3FF921C740F6D3D22021C9B + 3A1D7D13CBE563E7B9F4AF127E018BCCE531B1C78CB151A9F845AF0544EE5A89 + 4D1EF87FE6F8AF47AC415B7A564D5181B26FFA12D1933D948AF87022600CCEE7 + 4E8DDE542E65BD95D4C78BE12AEEE85061B5FA83504DAB1114CCBD71C7EA34F8 + 9F4016FF1FEE2245C567BED039E922CFB0ECD65408D646AE8889902197FA4C78 + 89B7911F6BE6F1E8466FA0D31240993252D2B3A2F5BBFF47BF9E1F033F2BCFB0 + 81B8F682AE8D8C13BE7D51F2DFF46A3C075D564E2F51F3440F3A2A9FDC5D2EC5 + F78279A13A49B9109FB8A399764E062AFA6037F10FD9A688023BB9461F4A3D05 + 9B2B25AA7E4A3EFCC81B2C513B0D7E684E556E8CB1EC9283F3DA520CC4F4B4F5 + 0150BC2B7DDFE9A4E8000173E95DDC8A5E217A4AE51EBC4AF2DCF74473E81480 + 38AE56EEF640637603473642389BF5025DAD63F605762A847CA3E474F2C746D9 + 791EF04EEB3AACD1C9787F59BF4A8BA8C1FD32FADC4A7DF70C14C418864F4476 + 88046BE996FB3AC5F338D2491389468B278334F9BFCC85BADA1D179D564B85E6 + 377E1525FA4740AA4FAE9C6BE2DE2E156E22DE6E3248D392D826080334CD8EB4 + FCA643956A572126B6D6530744038BC604E8B423846D26F74354288C946DF822 + B00DC1ED4CF8F9A821E0B93DBD0E6D8720E64F495B828D819CAA1BFDD809D2C6 + FE2792901F2E6545A1F4CE4F5CF452FF7AA28D94FA00A28A9B6521855E418DA3 + B271528C8E9144940491F69552D397EAE6A38C1576F3AA0E9511DBA6562F7B55 + 25A1BE1773894293705F7B10EEAF2D88EA212D92289C806217185FC2E2FB598D + A59D27DAC52B152926EFA6B15CC837A27DB62FA9A433215E352D4C602E4C2423 + FE83D5E098A44A0304CFB1E8D6F950390BEBB196692C389EC589817A76A7046C + 5F53FED5E29B80A3A45DE5830AAB1AFBB5FAD5A75819DC202DA664DDD6B2025B + 98BC7AEA803FA236F58E4C329C0BDA97EC2C476ECCD9043BAEA917E8313E69BF + F3760F5FCCDDC7C0BD0BD18A2E78F87A2C6C604EEE9AA3D569D38AA000F15695 + 17F523F85914F370F9BB4685514BD2986EAB758BAFA69580CA3E2E031B60CD2B + 04C1D5D89DA2648FC4D2B4E7734380F136B5BD52FBDAF23563C22F7D767F148C + 2DB1BAE55395C9F54F1949B49F5C52774C6169 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTI10 + %!PS-AdobeFont-1.1: CMTI10 1.00B + %%CreationDate: 1992 Feb 19 19:56:16 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.00B) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTI10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMTI10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 11 /ff put + dup 12 /fi put + dup 13 /fl put + dup 40 /parenleft put + dup 41 /parenright put + dup 45 /hyphen put + dup 47 /slash put + dup 65 /A put + dup 67 /C put + dup 69 /E put + dup 70 /F put + dup 73 /I put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 80 /P put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 87 /W put + dup 89 /Y put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + readonly def + /FontBBox{-163 -250 1146 969}readonly def + /UniqueID 5000828 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 + 9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F + 21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 + 06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF + 55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 + B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 + 0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 + 1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 + 7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A + 7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 + 356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B + 19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 + C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F + 244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B + AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 + 5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC + D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D + 993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 + 2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B + E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 + 309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 + F42EDDCF39AE522A1DC2D80B2772B05DA60F3DC15A815A6BAFEDC399C7956E75 + 3851CB3588E22936FBFB63A58300298B11C45D82385C083D07AF133BB1BC941A + FDD9F34D5E0B8087EF2A58C54D8AB7580EE3ED58AEB83B72CB9028F472ADBF11 + 05A77651F118824F6CD00209EFB60C1D32D46A78E8C8DCB8B0E742828E3B7D17 + DF5200D68189C918C2D1E2BCE076599AF2AE945C35C8F442DBFAD21892B5A756 + B1B5447FC44BDB516C6C2DA3C7BD5593A7DEB7BFB32B71F78D0A99E9BDB58BBB + 27B4E189F93BFE5F98476CF276D6C72089E75CF8281A9EDC43DB22A2E1C11402 + CDB1D75D90BE00A7C4BDAC69B136BD53DC921F1419BF36A9CBBBDF351E3D756E + E3977689EB91D20E9A9EC4C8E0E072F72ECB42B64BB10D9BAA63EBA58F4D586F + 57DA03E70605C6404B9FB7BA1EB23749B262E24BBE4682EBF731BD0D89CFCEE3 + 750B6349A156C60FABA18A37F36472DC8A02B6AC32FE82C4838234F2B46B01A7 + 958A1633FBC0DE718D706242B5932D635C426215C6D3F18DF359A2D8D56E9B29 + 3BD2B223CA9AB447CAD971125614AA61ABDE522F8C51BF10DECD61C49A06F772 + 06F6A5349FC63A8C19B1DD56E394B5A073DF50C79749D12590E137922F1CC56F + 7FC5D0EA5B9C239991B723C5577A4A822CF62C035730C745617819639D232E5D + 586800B0935CE25BFBFC3DA806D00D2C7B81451E9FFA2BFBD561ECD64446CA9F + B41E88B414A0F596C66EAEE5E7F5575390C065C89F3B6A99B06C1BC496B7CAEE + D2B3B206048C027EB88562C80E159B3C9FC42185D4412F76FD8683B24E3C19E8 + 95BD62E20665B0ACCED3C243DB658EED703233542A4B2A31AD4702A790FB14F2 + 5AE9E4ACAA865183D71932A0CB99A41A9F2171D658C77486D6ACA46D5A9198E4 + 1AD938D20E0B472ABA5E382670F551D0331669B840CBBD41040C6C62665D1E00 + 8DBE72151ECEB32B2FB667F1DAA217E0ABD654771173C4972F6D5239132A43FC + D2CD5F9908EBF135DB7D4BE03767CC8A2EE33C64CB85FB71222F7BF3797F61AA + E4F1077515B5CCE027AFE7E7DCDEF6853ED0D05A89798DD78E02354D893B04DF + BE3ED2EC650C5E52B7A59B8E5598FF1618A3820606ABA324FE30078E3039C79F + B18D5E3A651F32E4CB04D37D0CB401A0127DE84E988E4BF3A2520C0E95917F87 + 96BD9142ED48DE1157C8F6BB14D80B65761C6BBC8F595C55DA40330F78D20422 + 12EDDCCB9A173B78B4D70792FD841CC6664747BEA5176E1596B3D87369A932A3 + B73E95D7615988CC003D0D3BAE2663C71C71ACB64DD2087F0B340394BB39B5C1 + 1BB487A189A11A8D5836CCD2C2B936F4CDDD1A4B0CC984FF39F8024DF5FB16F0 + D0DED15AF11B1BF4517BEF07FE922D29B64095C7434432098707F4A90E88FD29 + 53F95734097BDCA31BCBD7BB1D80CE8EC01C947AB835891668F6ED98ED7F2F87 + 2AE6FF0F2EB927666146437C229454A80424402EB47A06BC94ED07F954E7B06B + 88E5968670AB82C61F1D354229A90922A7DA1E4004F7A98FD8889B5EACCF91F7 + B502DEFC47F65CC1677204EB3B8C6B515F9F53B581103705CB9B7D58EBCA2DFD + 14A7B0B62E8DB6BED8247077E42B06D30CBA285AB235897CE9069903BB0CD782 + D803B879F9F10C09D67B167D23A4B980B4F08C0702564AE0C94E7E82EEBD3F88 + D6ED38405420D3258478279C010989511AF275FE28BB854AA60EB954992251BA + AB7E4A0AC703E9700D95FAEC610BD61DD047D8CC4E80C39643E21717375D9FBE + E59FCD04489A237B6539626D03D5DE32976862C69AB7F020CF31DB6621FA5E5F + 1E3DF0756BA4A9302E8FD35CDCBFB3BCCA6234CE7505A1994E1993D2B88916F5 + 996E15CA4063BCA0EE1839F62869F73AF2A802039E487CE78276DAA3CEC1AD63 + F5EB517AE8AFA5AEE80BDF2C46AC40DC5695DD1935086FD8DB93C5F5E112AA41 + 6F31E8B1FBABA41B0F35A367E522D1D674667305F772EA0BE551B4EB1B738FCD + 1CA1A7F107EC991D37205840640CED2DC2A0005EC97B77E86398552C2B2EE099 + 56F2B5DD2C9BB484700D11C874F87EAE20DB9FCB88CA8F3C957137EB1D12F9A5 + 704318792BAFBA02365DEA6905EC5F47F14E9E7BC90BB302E6CF3B7699E7C962 + A88C97CF864B2EB4888DB9F418C200E1DBAF3A72ABD0BD203705EEB05AC491F2 + 3534B48BD05FD964DF531C6DF6C7A134D8759768AA3C58BBB98764B13528B78C + C18F652310AD7CE0A8AE4D1BD159A2DA683B7D3C3759DD360142509089F11701 + 7254C86D7A19118B635AB2F06521DB3F6251089C510C4D2213797129F822FF04 + 0022A052529CF68B0B4C4E1AB77626957268216C45CEE4757620C16CE436CBE6 + B15FF8477DCD9C28DF06036380DE66D31F3F7D449C8AD2C0328C9416C6CFD6EF + B824D0AD931543BE78A1F4D844934BFBA0E718A2E7859B59D42B71664FB194F4 + B442291AACF3091A7BA16400294388F53B7E8572B2D1B3339167CAC76BE67750 + 95664E2A53B07079CBA709918A1912698DCD8660869B2E990A9CD7C5914A99FC + 645223BD4D6F886FED441219F4811A6401D460968B07DA1DAA780092572C8A95 + EE9FE9F64D1D9D62797C536149534ED4EFD74853475F41256BA7ED7B492DFFEE + 30378E83FF121DF1CA33B2059AF311929370B3AF4D6D28E47CC36382C2F9A3E4 + 3A5A08E792AB6EA8D23E09A2BE0F7DC18CE6B27AAD880A421E7823629E927BF4 + 7E22A13DBF657635E1803D426903DD57457679306D1E3D5CD3CA9CFB40376739 + CE2962A8694D29BB584532E63F38416F73CD6F2B7F738E676877CAC83F8FC046 + CF4C4A309B713E015DD6C14594C39DC839EF85F2954B9A55828CFD8A7C1E4283 + EA55C11AB963D4CDA844CB53FB91EE6ECAE960B64F6BA9A6BCF5E4164838AD7A + 655D8C5B281D2151165C4AEE0C7E6800A2F86F809E88061CBBE5F1A8D2235BBC + 239723197F5459A027862082937E10B4E26F16BE8878A26DAE9343F6E5F0DAB5 + 7EDEF4437F9A9B21CFFE034E449541D884D8EB0774F2ABED45A2FA8588AD928E + BA12809E1EA21DF251ED161BCCDE039589ED69BCDBDA5D3CC8FA65BB2B633824 + 82D2C81F664A53C02BB63ABA410EC116899D8120FEC23AA4F4B36685432DF435 + 676DC0BF6675DAD3CB1BD20F166EA3137ACD75924A7826706F1EB9535FE1F2EE + EA703152BB2C4892149A54F267423A5536231B803836EE7FBE9DF0B6B4C43F31 + F44271E3A9AB3A6875180D49377BB3860E04E4D4AB659E9A300299650A2603EB + FEB9CE6C64B8158CA49610FC5B719CD40D584115B753255C43F2D8E20F64165D + 2C1B60735886E223FE0C19B782E1A9F80D10F8B893E0B7C99443E5573E3083D9 + 3AB22D6162358A528FB754BA3B014E87DA12093D71107A63E59071BB62D49DB3 + 52882605FF36E4B5D4F74BDA824583756BECBBB434794806B423E9A144B60F10 + 21C87611EC61255821324C497E409D47471C6237D14791067C52B299603C0AB2 + 54A7794D7E32B41741197D58ADA046FEB7A0CF51F8369B8CEE08110E6C935E9E + 46560906D7875048564DF6E6E2200DE7716A86AB78E0C9EB38BA8252C488FA7C + 20C36F98EECD172E2538968C990A718144BB61A4A875ABE7E213B6E9C763CD58 + BA543C244D5A05CA13C2DE7542BB290A995011E5DB57B5D572FDD0082C03094E + 30536BF5DBD16C8DB75B034C5CD5C3745B6FC6612C6355A66529AEC9E2932998 + 4D701ABCF63280E2F961005159AFC48790D08BF7A4DA9ED7BCF97AACEA6888BE + 7B426689ACAA0E2A072F22247C9188C4A4B65A17B80BFA7ADA4DC517AF2D3991 + C98E3AF4660E56C747D5661E586E51AE4ECD260D89BE842BD8D11E8255A419E9 + C2EDA40C3ECC8F19940BED24B82357C9900C68DD3FD3F581C3BDC26730A0F0DD + 59A0FA8C62CFD47F2265C1FE1CE90770276F5C86E230D4985CC01761D8E316AF + AC7D41DFDC2120333C99A3D463E9BE254FC47E0B616FE18B815AF94C274EA672 + 348BBABC98A5C8BD5E7D2C1946B3E002C636230693476C00DB69536C6AA4C967 + 0BF00ACC5A41D16747F1CECE2C98C1F7901D061787321AC4DD8AE0E3E3B2E918 + 954BC97E1731816E10451B57E5106E3D7DA248C2084D256A63A5931DE8B20595 + 9EF83B2737048C208E9FFA582C456A465F16219722DEDA6AB2E73DADA38E95C2 + B8A76E5EF5781FD0E79CD73163AD7A97C819073C22D069993051512AC3E714D8 + 3F64800BCB0EC139DD79AB09C60873324CB10C6F2307BEB8C730A2B7457D8516 + B0D4E60F18EB3123ABF4AB14837FC8D33FA91A4FF2CDFDB65DB2A3654D893BC5 + B881AD40A95D31B1BEBE814E81E3664F35CC783EF309FC5DD5985F2B6FD67E78 + 0E0A0CC77DB7B1C24C9037B0E24DA45006F94746505E7474C7C2E62F4EB1B142 + 53B45DA5347879A828F1B08B80DDF8A991A7F623D86264C08CCEC983EC8480FB + A9E91F7D51AAF68664A49D9F869842BABB05517CDBDCA9E134FDD12531855A74 + E740311450148D500045EAEB12517500B3CE44AEB5C3429A584817A751EC8AB4 + 7EC91521B2434A282792E9AB1DE299DE87B99C12D391A3F0E0AA732D402879A9 + 313B0B846E042BC060E81C77C14FB3010FE58AA547C8C7585B06FECADE36AE71 + 3BFFAB149E13AF906BC33102BE709BFE33C390806A8D5B14F66DD21914DD43D8 + 746217910E3D8AF1994E6B6ADD6262BF30FC24C0F1FAFB0C0FBAD72FB6FADBF5 + F6531BB644AB415916CA5DD1F69AFCE38E4C3E718B8B0590FB8EFB69206CB71A + DDB26EA8A66AB546011034F371E72C5FC9C5FCC07BB6D8995C8A79B0BB488752 + D17242642C8125EF94491AC478A10F7319C801ADF3E8ABA43D7BF583CBEE97D0 + 15A358A9C6CDEFD74B79DAB97ACB11E5F67B5B61EA4F8A7F077597A15C0F029F + CFF21DBD689FF6474EF2DAE56C60017B4E1214F41D9C049F4C1F0C91112B7701 + 61CC0E4A28B831EB7398075A29B503C6FC513074A79804DF9071DB9D29806FDF + 8A78C3C14DEC74A56986657DB8E86800ACD7177CB9492DE94AC265BBC20F6C72 + DA905F9EB149CF3C87F20F61B0EFC57E291CDA86C2D5043FF5D1882307ED864F + DE1D3CFA0966289FF3C1920E2046FAA814C363AA348BCA160C4A3B13E4B193A2 + C65D120744532BA614EFA3DC9E8B223F4259B482E60A6B09AA8188721A3AA4E0 + 055F8A6AE8716F6E67523E5C3B7A1E1B055D64380C00F14375123ADBF18DA379 + 55D60ED35AE173D17D2706B612F6BA92D7BB81C1E4B2600720409AA21CB220AC + 5373E5C3CD794B0CF807DEF48DF8462A8C0F17D5DDBB55AD784376574865DB1B + D5AB2603986542DDAEF18B3BE78AEB63BBA78150BD541D50502EBA50F98BA83B + FF2451B9C459D9F20BA1C31C95CEDDF7F8AAEEC4F40A429E7BBBD8ED985BB987 + AA235F1158F946EB09E5EE8CEDFE52C39271124DC17D72E5A85FADE281B9DE6A + DE9987170C0CCD3AD9B430D203B4860DAB0ABD67FA04E256E77733E80AEDF92F + D71A433187F1C9E51A210E5E9190CB5F863929D312253E60315C0A38AFA57903 + 3180BBCB7EA18383400DA8BE942793773E60FFB8C3C6286E03DA73555FFA13B4 + F489ED410556E496B49CE0249D0B1BCA2A96FD2BAA65755A4FAD25BB400BF62A + 128B7B1B0CD59F43CCAF8118BB6BC86ABFD22373204E084BEA3C582EF5275C9F + C7D13E4320F751BE6B27CDC198D1F4F95FC04220D62B7B89621FC176C87721E2 + 352006D78C8F24C4B8699CDC1999B7EC705EA9543BB240734F692DDC0A9F9EAC + EE4F22E69A602D91047B9DE90B366012283E842B09A469F0AF88B39251761B6B + 1753F6EE6BFABD66A38CB75ECD6A2F8D9241D8538B688456B19A2D36F8DA0788 + 252C860FD528EF11D0C584470D3EBFCDFABA675A0C69692D00515248B2CF5163 + B9C2E8676302548A6F79E69D250EECBD83EB8E1AC58CEFF9AC8CDC73410B6673 + 4570F9A541D7D27C1B5A597D74C9BAB034578F28A332631CA95F0244CF7288F9 + 7FB8179BA8FADE735B646A8FEF9945A8AC98816BCA6F52403E5533AD044DE058 + F927CA1C87AECB80E711582FF83A02E58DF2FBAFBECB059D1286C29C94370324 + F35DB81264512D3FA2B35364559AD4F337E9F3D2750D8A403F579DB563A1842F + 46AF80AC2316AA0D195ABA17269A4E5762D583F86DE1B2A0CDB116F96A694488 + 3587A616287281FA289F23D31B03179DDBBBA2C66255BC31F225AFC865EC01DA + 047A46D4479FBD029F4D88218DECEEC8EE2FD28A2174DE69573A1C1A50B966E1 + 8E4F3ACA32C6171DA1C2DE0F7F3169233B7E1EAB93E81CDD7E6C35575048DAC4 + 0937BCDEE487FAF0918A29A09058CF4B3BC67351DCF0BB2E949C51580DDE0D67 + BCFCE251DA27708C46689BE95B7F2869641BE9A5D1B1F23537BFC155B5922EE8 + C1602D475D273D8A67FADBF1D310A91822B61532E1A7D625227A0E11C0B0858F + C5E4D6A2265761BF6BB185667E15D333D253C7BB6109978015B89597F8C76E90 + 9919F6EB522E8F5C7A355FC39B876940C7C7DCAD103F9E96E7E5EADEF9C809F4 + C0BED48DC0708AC17D796A99ABD8A035BD9771CD2EFEF6213A492E948C396BA0 + C7DD774A627A631F4969EF39727728D5F2A9C0B9B26849905E536F33B8426094 + 2ED0C9572A32213166E3AA0EC43907BB65A914DD14F44FF6630D05829093B330 + 3524810AFCD88DF33497BABEE6054C06B1F2D5B2837F2D98B5F6BCB3084C6904 + 50144ECADC0E4937C8F22787B3A1FC4F7AF3FA75C4BA39F2CCD123547C330C12 + 7A239D5F47147F65D732C72C365ADE42D8788666CAB8119EFE0815A78E60217A + 41903FDD90F677E2477DAB402BDB3C3F610B723C718F48377E8F4228B710E275 + C0F1F9C3A55FAB7BAB8FB13E1A008C0DD90BBA1FA8022ABFCE38D5564B7CCB5E + 660E11B28512675AE88ECA1A5D99C65D98EA9C1C3576EEF20D9E1C89EBCD7D2E + 70614C26511671AA1EF3EF602B4ACE5AF2F731F90ABDE20CFB87292ABB227A08 + F9DC864749AA5ACEB697536BE81D16E6F8D6F64CCB33D9BDD430ADF8BAD6CC64 + 1AB461BADEA2B2214DA5E8D836F3D722C5D084AC7142116AFE526D6CF95C9CB0 + CEFD12AB1B2245B54E5E6AC1C5662D402093BCEEF0CD2C951817449CE1651237 + EC6E880F28516350B6CCF9703982F06FFDE484008AD726658F66246391B20017 + 72F1D14D5DDD217612B6F72DE5CF93EB5E8C1CEC54AAD0B11DADB86B71E54B3C + 26AC3D15F1754DF7BC0945385C800D1E4B149308B208124BEBFF86DBDDC97591 + FAA9351055997281D904665ECA7409DE80FB6513E793ED2E839751962ECE9364 + 52653398782CA5906A639BFFACDAC7FB6FD50B29BB0FDE966873551468CD3F20 + A0AEE89A799E3372A7DFCAE3325E7AF1BF9306BB5F0B5772A887E1A84EEE9016 + 4A5141D8E20EAB33FE8370032EB1063C14B7B71527A9D57C4500F5B0A6A8BDC9 + A3E2AF62FBF9CD3276400620DEF4FBA125B4C03F0506786EFB03F925F824E132 + C8486AF43EC6F45029079724009549DD942879A0175552C15A89AB7B4C421B14 + D1B8EC2CE8F9832CD519FC8B693AB5C222B129BFCD76472C6CB30CB233113EA8 + BE7695345ABE186C37DFBD23A03AFCD291147FE971182A1F561A680385505D5D + 6A3CCDC06854AC53F9E555F79ADBB38B4B87B05F3DF2DE4AD50FF6E14DFAA65D + 154A2E77BB0CA581F294480A39D7E4C0A65392D977D66D7702BCAEB58D4B89A5 + 9D08FEF81EE200DCF4A6117F836B58BC4D89706D9FC38A90EECB57CCFA5795E7 + 2934E36EF215AC6BFFE26069FAA9E80C261D701526AA3A2D60E628C2798893D4 + 1A913AB1491275CF4071E0F8F708AF11E6CAECA6CD1392F40A7B307A4F8BEA8E + 13F190A85A1BD83190C4CAAE3C0E36B36083E4328695BE62F229DE1AE99D37F6 + BFC75BCCD503A4D3E06040383A41CA8EB08047A9CF36890D547128DCD3B42EE4 + 47564F9D5193460689AEA62C2CBB6EFB835E4621B0573236B59571D0647C802C + 9CB22F762C0BB60C2C36B08F7184BAEE5EDD576D25EEDC9F3B4ABFA438852F8C + 6DD0E4AC156B6D95B6214198CD703D4B89548491164BA483F72AE3C7AC623C76 + 4FB8C50ADFE74082435F4E2E0EE96BBC485538D0C81A2E5ED2B7533F8AB596ED + 167E896E55718593D0496696FA92A174E2D668513FFFD23C329443173B047CEA + 6121234523F77930A6DCB44C203D3AE33C8AD2467C314809FCD79E263104A843 + F99B14C7E38BB18FF2DA419BFE216E07F3251B50DE3D7E96F76D552D5A81341F + 3003E39E7A974B24E72294408D9C26FA47AD0520B9603974774FF8B679CDC57E + 60C01B19ED347364B0604CDCAEC8C705258AB68FC934ACF4252D8D13756FE77D + 9862B79B66ABFA162B4A74A50A3EB776BBAF7A3CAEE1D7B9AD8907736FB5A930 + E73A689BDC499DFE8B74F6B267DA17D5217A6C67620F12E1B357CAE032E1A9C2 + 4AD930BFB986A39811DFAA6100AD7783317AD03414C2302948C640963AC03B81 + 3E8FC311655193F03216FCE74D81A94C6767C7DA01266A37D2146346162CBDC2 + F2D58BFA37008251DAA5E609B4958673570420AEB6B7ECA51339C4ED7491C902 + AAE6B352A0F0E34A1A274A5D285C6D4CEA5BC09787420A4C878BDD9068B4E1E1 + 82E9B5EFF0111081A4AB9606C67621AAC2EF6588E7988A12A8C43C270DC5226D + 975A6116C007DC6D67ECB7F8A898D6DE84318049DBF5E07A0689DBF28058D6D0 + 9CD3E132E2495A4EE772A30AC40CEC575C3902C4252AB952BFBD8BE814697908 + 9A54DCA4D6F9DB5CA30F0CC45BF7145016782D5CA6E2114393326AD5359300FD + 1E188246F081761D7F956EF7D340F71F6198C448640E6FD53D3BE0B707E3E47A + E09EB3037C6743DBE0256E4426AD0E2390E5C23F2FD7555E81ECD3419D83D061 + 0ABB304F4EEEE47A2B7C0D1667EA99C9B4BFAEFFCD9FFB72443FD3AD3BB1E1FF + F646DC53005D54AA5923E03C61BBEDCD3AD0B654DD81D74F940851AF10000CAB + E11889FD1710F52D20B029D657F1646814EFAB4BB15201547EC2B7997C9E82C2 + 4989638435B1B6D08AA91CAE7DE39F719A40E005A78B4FBCE9BFF58B8402BE51 + 47EEA8E7E78810211C30ACD9AB0D9622BCF7034A1EEDD9579E1DE23FCBB60163 + 8E4F792BF6F0BF20D6F19375D6EFEDA04D4EF63FE313F9DF0EDA94763074C6BC + 1E372EBBF5648DCCB3131280924FC6208A315DDC2FC9FF9EB9FF9A0A6498116B + BFC6CBF1695779C5A2F2F429AD0C7E0269D2777033E98CA7E7B58D89726829C6 + 49608A05D92EB15F2F234D73525ACF93BB7B534176BB431532DBF3D4D3EF07C8 + 3425A0E125044F9828082A2330C61A512637C0A617038982D5D8A2F1C7874A8E + 83503544A0CE7A27FB9266E5ADEC3C69F393810D39C57577C5B181144480E5BD + 4663E0CB5C76DCC5A37657F5C038630A62DF60A789032EF83C94EDFF97CD0A1E + D56C66829AFA2947A6A18E454D0DFC5651DB09707DD9B71502006DC66A7B25B1 + 76537CACC09E439DDAE95BCEEE5721A49209DBDF280FB795B6EE494FB721A0FF + 4B951669551F8EC0407C6ADB96147AAB6794190B475C6A44F64BF816A35604E2 + 89DBC6A44F1DFFB9B916F834FAD3CC54012D4F7FD4D56796E2404ABAD0EB2598 + 1AEB89517CCA1EE6A977B3B062C6521924F43C566C53D0045B9F02A6D040CF2F + 1D5AE0D2685A968114848735ECE1AA6A5607363DA2CA626E19BC3E747DE44680 + 21734A794A3311AAFC324368B2157896D377CD1B2DF638612BD141B5A5665A61 + 7E71987A96A1E621DA8E5AFA7E6AD69C1697E0F3220921448CD81955DB9ECA4C + 2513BE2E398BE012418ED13BBA47C034B4A65B29E70985C1EA5F1BE13F2DA06B + A105809D4FD541C38D2D2078C0FD0A8765DB109290387F431E3FCF8194AB55C0 + CC3AA6D364E12E3A40ACD8B22978C137EB808FF02746B191E17604AD24C012AF + D8C196D82E0F0680129D11A1C86A38FF3B03371F55945124C2DC4472D3F3D50C + E57E7A9586229528A22E5E0CBFB5BB38163F81725830D14232C68962B301F1B8 + BC510C904A79FD48555E35555FC8BE1A9DD4CFC91383705021493347C01F24DC + 85C67DE8F7FAE5D9D67D92C685044AF6E5CB0C23DDCD960A5F649D900664639B + 7A03161C5BCF021B299AD5A545F1B23550A7F80016D2467EEE34FD255645FEE0 + FA35D5D5A058E39536809A73BB16C1B29FA701B658BA42B16B406D9DD7548E95 + D03BEE5CB863764048B81D449B7B3694D6C8320FB1612BAA14DC455DE50E2A24 + D165907A48183FE7044AE8424A69DE019E3B3F50098C15B60BDEB8F2757E7CFF + 9FD1AC6BC93F8525313BBE0CB59D6700B797A12DCDF333C951CEC39A1C59264B + 35606ED6EA7CB994BAAF1DDB47263637EB45B7E792272FCAC1E2C88FA9021C60 + 907CAE303682D354D1F5883D2E5C87BB495A6202C4336EE236C803A164AE7E3D + 3D43A7849B986523BCF13DDACF4DB3E3E7F7CC81BA7AD1C2ADF0B5B526319BED + AE38D2A83A04482683737A8384A14450D5234B0779E23DF9F8EC904E515CE9D4 + 167BB3191570D0628337EB91B7CFBE37ECEE19323F0596AE5AF286EF7D8288B7 + F191157E6A4B84E072222B4B1DA3177D57B847E9EA4040E6E7D11CE5A50AAEC2 + C3169BCA6DB1E2CFC5312D98764AFA49C4601C894112F6BB0322C4C21CA22EFA + 1DCF15EB38416BEB4EB9B3B113A56FBD1E0AEECA248B8CA62C43D2DD8BEF89B3 + A097183CF23C6FC311EFE64927ADDD056526BCE4AE850D6D1E5D1B1A79936E27 + D7B9159397ECC32447A21256E840E92038810E4773BF469403A18B6249B81FD8 + 341C58B4936621F3D815322CF6317A0C9B04240E2029DA72BC17896036F890A4 + 8FF050A07E27ED7326148909549A71FD691E9D73A217468E596CFA7D9F332C6A + 4C2DDCFA98684B1A9B0DF5B4ED575820007D077D00F9DC726F1CDB70AA5AD86E + AAC5E789413476EA9D289E6D7E14FDAB8E852B51C7E6AF1CDA6EF67208AED2FD + E9E0FB9089A54E5E3EDBEA4F2258A48703B2CA3565CFB9F48C89030645BE83F9 + 04811F07277D77DC15EB098E551B143E9DB9382205F2EDB4700BA1A2BF1206F3 + 25EBD5E14713369AC86AE988C0F46418C8EF0115DABF98C61351B7765FE3E0E5 + 37AC24286A2CF62664BAE2C7FF9E5B9EC3C8B14C10E447515B03A1D45481F525 + EEEAD6B8BD8D01FE9ECBA4B1119473BC89E1C6B4F69D83EDAD1E7219791D843C + FD58F986D87F2C19FA91ABD97E82422FBB80895D8D4A589FD3E62E88AF7A76ED + 5D36F3A8AC44ED80BDD3A77333D9D1EB3CFB0BB789EE8C0F145F5CBFFDA65768 + B462762D37D97243D2661D68458D89E646615B85F0AD792D94B9DF4E37582E5E + DCD093DAC1EC992844DF499BCA4C062A8EC90B582C5F2E4F5A8922A11954EE8F + C3C279DBA638F642DFB4A1986D63EED26A004F1CA6F0D281F1236A28B7C5B5B3 + 75C3631F42A5DC238C308A5D54EA4C86CA7EEBB609E4440F04EB6FC87BAF9F2E + 402713EE44099090447B850AB13B1489D986172A532AE1E4413802F0E9CC7F09 + 6C4307DFE77A2E04AC46C8D9A7F916F9C3E945B6B25DBE515C4DCDC729732A35 + AEAA77CE3AE53120E577BAE486809B838C418C06C62C80BE7B77D5F66DC6EF12 + 65737F5B0B21681CC96B9865BF70AA8E15201B76105CC8DFC03E62CDBD974511 + 2B124336E7EE92A17EBB26284286FCED660CBFE988EFB43C02723537B7F9EB4F + BA8A59372CD116FA92618D1C33F3582ED6BB3FC23A13DD69815186876A5301DD + 74C30365901E334D1A1DEF4701C2FCB5EA2E9E3E8C7E9D52EFA462DD6627D98D + 64621AB925758FF51E771FDDF456FEA3BD7423E0A0F9595AB84748EF2764CBC0 + 7CE08439D4C33D685672E5DA1CAF39A3544DF68B6E70A8B55F7CA6543637B925 + 69FAFF6527D5DF8814DCB911B257E23C6B1AEFA323ADA72F0B5709DC996C61B3 + A453313F0D3BE9250932DF361833C5ADA04445AFD1CDEB66FC7F6427EDFB60F5 + E4FAEEA66143D6D06698FBA59EBA8842689F300644B500988EBD1F614CB66AC4 + 5114A82246ADD6317C28234B54459C71F9663EFEB07203135D8ED2B20385056F + 3F68EEAE6FB7D25D7CB5EA191E1849C659566FBC3F89DCDA605128B002664D42 + 9ED105A89B714423DD42BDEC5B95839F9CBA08A8D70AEE3F8275033BAF69FC97 + F9A98A079E6637F284E054CDB9333E3BCFF7009172B146C776F92586996EBF1A + FA2C966469803C47323C88A4F1BAEFAF63E9D2DAE77753C7745C06097F42D645 + 3395F18C16E9C4A9A3487264AAEF97BBC16504E42C80433BFAB51B4AE90B0A3F + 3BE827342A5BBD835F607D7AE315D556C386EA7BE21BC387741333B98BA0FC2F + E7D51449E51ED4C6783ADEF59F1AD253DFE62C2E09F56352A781C4FBE70979C4 + 07C9377548E3E20AC8076EFCF4B88B8055BD536C20ACB4EC779BCDA05B4732BB + C24AF64278926D45EBAB44A0B77341762296A6F0DD12F6B448BCA2FCFEDD0034 + 730E1AD8FAD0F6E0A879E9CA76446746B9ECDCEE679402CBFAF49674499F2D99 + BA146CBD2932BC8A4A59313DD60B416FE830E50570F1382C72F7687F30DA6352 + F2BA3A03E7C47FA6CFB77A70EC26279D24422CE281F85C75DDC656AA845F0EAA + 76BAF7C1B55D5AF29E31C333DAB197A400AAB5361BE67EC31FDEFE27E47F2F3B + 8F8216F831C8460332B0E21305BE7A2764A29EF3FFD5C2A1B7DAAD14DCEE7A2F + 8734FFE2E129C110C24C63499608A5E31BC5FD32EF069AD47D7100488189C192 + 27F1DBD2BD31DA6B2C0EAAFBCF2C34B0B4E9C1E0B73634B7F66131B51767B4E6 + C63EE1BA44CAFF5FCF2089EB3DBD9FB6C927E2341EC55F5EF96AECC55D9A59B3 + BB99264934AE24C9688D9859448893EE8804267E0F78BF06ABB03B19998B1395 + 3AD2D45F283EE7380C90C2C500A38AB3990956E2CBE0BC07E64ED9A055589B44 + 42588108E4AD986382BC03CFD4A7A27F2D24CC3FD021C8D4146AAD7484BADE97 + BAA6E1AD137090E846A6EB7D3D1AF6A3434764CAAF3E0493383C112FF840116C + 031229B0B333D549441F712A03B0004DA683661BEA555B7507D2ED654A250210 + 455217245AA4B380C0B28818CCC7EF5A4C265C89D84F1248FBEB6AD3268AC6CA + EA2CF00B97D132469993D325DDDEB753A8ECA1F3FEDEDFD4EA576DC98064BE36 + 02B985F248CD0D878C4998303DF6D7DF164C5CBE48EEEDABC258833A8EF74183 + 36907B09522EBCE6500942BC4492BBF3ADFFE7726E5DA1B1815482B724D0D6C9 + 3D4698587E9543204998B7239AD59955A22BA98237BB4E666D98B65777C0DA51 + 46D05B16C3B2EBC434EAE4444BDF5E8E8E70DA9FFB2DE523A44EAEBA4B767882 + 51C141D79008F8C7CA28BB565DC1951767A9D61D132F21B39748FDFF21B9380E + 598472CD648C7DCAC0BF6EFEEC53CE397D22280D8F249A150DE89EDD4E72BF08 + 7BDE609B342996790B4C629A4545879C77A0FC84196B1CED824648D45D993960 + 6CF4981340EFA5F61F6462AA80CBA8F41150EBFBA074902E1EC8A8BE7AF17CA6 + A7E6DD779121F67E252C7BA388604485BBC2AAF5AE05901D6CFFA851BB23E67E + B516436E156E41090375403A776C7DFC644818310606324FABC4BD8975407C66 + B5845D50A1D97CAF5228B77B95D129B5A7831A5629B60DD450AD0BF109F4B591 + FDDF592AB3A5B84F2B5CE5C814D71B62E70CCA8690CDDE6F45378647E230198E + 596293ADADBB35FFD0F61DF8731DFB1EE25192B5195C0B9DAA22C81CADE17AD1 + 4B6163C6F3DD63B6555F0CA2A0FA8A73E199E2582317973058EFC14AAF48093B + 3990F6EF21CCF1F355B06788046138EAFA7364C3FD208B6B84E1FDB83B80C781 + 02EE0AA0683A22501E18D373F7E9A1962457D252765814FDF919851B97A5D467 + 52531B8300F78CAA4B33CEA2CC91230C4B9859CD4F099F46769D3267F8570E39 + 88D016ABD4ED3F63296E1F027E4A44951DE6C04038D13F1B792E1A1BE1ADF14F + 3E31FD716A86C065AADE49E915A7A83DE6A1B89FCB7B2E2B4B2A80C91367F0F3 + 8CBCBE4FA563B56607100FB14404A3F8FB64FA8CE0C289C386FD58925C1CFE9A + 66C39FA2CDAC2B4AFFAD34A1495CC191CE8CCED085CE0D2262190092DBBAACF1 + 9D82FB97E1C25F0DF8571C2F854D686291A0389BA1D48EB9C4CF353007D8EB12 + 9A1092EEBDD5D58074647E70DDC17E1A9FA89CD008EE63725AFFA3197C12BA08 + FF580E8388E7CAA0326CA6EF77DC371925DDBE1400EE6E6DFE1C37EFCB1629AD + AB64ED3BD477C9F9B7EE9C97CFC2D0ED7EF28AAC218C2388A5EA98A7FEB64729 + C0B8B21D700D1FD7836D2867CCD0C512DC5F9F55C1DF7D9D4433594696801F24 + AD2745B5E06A51383F659BCE4C476F7296D1655B19BF1D99259FFA9F7CB660FE + DD72F646DD22B2B6A6B1E949007DCFF76ECFBD6251239333246049A7643C3C5A + 8D761A4EA708F709D1D0C6B82357E9C9914C0599E14FD7781B82D6DDC77074C5 + F8E43B4383D669AAC03126E7787CB4C6F5077CCE0792B9585AD6904E117AD3D3 + 5CAF26C1CFCD4429982FA9A4AF7CF63441BBFDF58AE6785EA85B7F78957B121C + 5712940F + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMSY10 + %!PS-AdobeFont-1.1: CMSY10 1.0 + %%CreationDate: 1991 Aug 15 07:20:57 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMSY10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.035 def + /isFixedPitch false def + end readonly def + /FontName /CMSY10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /minus put + dup 15 /bullet put + dup 17 /equivalence put + dup 33 /arrowright put + dup 102 /braceleft put + dup 103 /braceright put + readonly def + /FontBBox{-29 -960 1116 775}readonly def + /UniqueID 5000820 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 + 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 + A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 + E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A + 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A + 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF + 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 + 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 + DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A + 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 + 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C + 515DB70A8D4F6146FE068DC1E5DE8BC57032092296D5371C275E56FB4903A60E + 73A22818DE22EB78EEE0E69EDE2E31BA367FE9AFFF8C7D74AB1E2400953F643B + 7BC604F821A4CCC56FC4E40E0B40B8CB82A045EFB4B9F681EDBD012AC35166EF + 62940137319D3082A033F939A0715024F66640DEBDC99C9E943657E6856418A1 + F9348B36092089EC24A09C1AD82AAE28782BAC696A8716CB991CC8423B30DB87 + 9D0316E79E3C95C9C7146DE8C101E487C5E4930E938BCECCBD1B1041C5A1FED4 + 78E364F06220836336AE11B3C135B17AF973BA98C692FFC78E45EE60E55DB7B1 + D3F801E894CD68274E424E0857D3C242E04EE6E1F2DCC6FB597D96025B8072BB + B806BEB3E01E1C830ABF6DE3FC8564AD6C7E246808DE01568D73F4538747C24E + 8274322D9CDA76753754B6E96207D428CD6C6A8EF907636114026EBF2574ECB6 + BF9450D6DF22B997D00E1AF2186FC11B1BBEBBC268CE415BAE2066A1A886048C + 8BE09EA6CF3C10376A65476C3350E8B0393CD6DDBCD70BB5C85917FA8DE7F8C8 + 640D97F3A58AFFC84F6FA92F060515B9A6950A20DFA73E5FD3DE2D1FF0FBD84A + 8405EFE13DD9B45AD5B17FFE9D4EB8D20724F2ACE7F70B492A19C5D4BBAEC9B0 + CCE2CBADC3562D3752F77323DCE1156BB38DA5BA084AFE371EBDF68970D6DB16 + 4AE0800B0DC3B96FB207618A70C5A8CA1274174ADC15D9129C7302F0045237B6 + C6088DC00DD5FEF30EF5C858620A66983C9DF1BD9DF3DFB78D4AAF57F3E1E405 + BACF85D63464334A6B55DF28BE8B43FD35CC519D453E45B92DAF42456966D0B8 + 9A7C1396BFBF5FE565DBCAED4FF2AA58C56895229EB85B8E70320EAE11BA6410 + CE794D7B37D326166DC317CEEA2726A4876AF13AA3F1B369156980BC9403CC5E + 309D8BFF13DCC3A8EC5312A1DEC0D869852029E7A6136243ED15209B4E823C46 + 9D8376199F76D80177E6EBBC5EC4CBDCDE2B61B10C7586561D549637FFAE736D + 187D6B3A30FEAD9A2F6D144C5F010BA266D888DD73F8EDD776F5C65639CDE996 + 294A982C5ECDF568D884869F4D61CF4B871BDC73DC841478421414728795EA6A + 93FC8AAC2271848A3A7466296E781B3CE39D1592ABBC2466F834D596A8D3F636 + 9197198815FC6275899107B6948C97BB472BE3470A1046BF124062B260CBA454 + E7143C2C24BBEBB9843B57B0F5C276F9499C98F5B83D8420C6C3EA226642B0C1 + 3FE6EC4A50B2702BF92A99DE3789C015C226FDD17D2ACDA62CE23515FB8CCABB + 45E9D0F6A93D4DAD3F8E1D06ECCD19C94E7E86739F83EA5C7874200E4986C56B + 49358ABF383E6A94EF7E608C + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR10 + %!PS-AdobeFont-1.1: CMR10 1.00B + %%CreationDate: 1992 Feb 19 19:54:52 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.00B) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 11 /ff put + dup 12 /fi put + dup 13 /fl put + dup 14 /ffi put + dup 15 /ffl put + dup 33 /exclam put + dup 34 /quotedblright put + dup 35 /numbersign put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 61 /equal put + dup 63 /question put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 91 /bracketleft put + dup 92 /quotedblleft put + dup 93 /bracketright put + dup 96 /quoteleft put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + readonly def + /FontBBox{-251 -250 1009 969}readonly def + /UniqueID 5000793 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 + 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F + D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 + 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C + 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 + 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C + 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF + 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E + 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E + B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 + 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B + 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF + D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 + 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC + 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 + 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 + 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 + B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D + AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 + 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 + FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 + 20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 + 0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD + F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 + 3E6BB526D2D21FBD6D78E21A936F2E123C0F6EF41AA2266CF51B513EBF49D4D9 + 2C0C93820A37010A4C8990B3D2551EEBA36E8B8DC122B1432A6BA9A8A674CA2D + 5F3DE1AEC33589A13F6DBEAFAF69B753BC0DA94017AD3D1CE981FF38A306FE6B + A6A35630A7D636C1FCDB936F6BF9366ECA151A7994261C5753A081645F671114 + B5E2F6BA80448EB6D0B6A8684436C85634AEBDBA68A8B17123CEC9CA768F4EC9 + DE5AA98D6B21EC2DED0A7A1F9FFE461331CC77B39295C2147E9DB9952F6EA63E + 36F76D0DCE3B3E529CB5EA6BC7F7D79D6237A51DC132399FC636FA447BDB9085 + 1628A8A4C3D1F8C10556655D41A1D4529DA3CED89AD4C4DFBF5F896A37B2E54F + 3AD351C8960C05B30B369AEFFCEBF3074565A14EB60996DF3EC971F4A0B098A7 + 31987F6F8605D00C7E77326764B6D67C2BA05C4947EBCE004A336500CC3A1869 + BE48305E54B8B4845E335A3E2FBA1FBC689884F1057C00940916360A5DE97CA5 + 285B5517039417CA2DEAF593D62328EF352B0EBC76836D5D5BC5A62F47AFEADB + D316DF805799009523340FDF8339ED63CF34CD7C6AC38BAD25DBCE0ABE02B225 + FF51C3CAD527A8BEED6ED5154D7AAC6AEB2A2B24E12D32715C02E2C583070241 + 6A32C038FE38C0D5E342271D8CBB687A780F68DBF95FB0AD237FCD569288ECDB + 235102554B2B05416412AEBF69A229FDF99F550CFBBD72F17F31B2701321F8DF + 429E592864A0059FB370C4314DCD6F7D15EF7776A5809686E772C4F06691FC78 + 53626F8FFE3B371678E4A19801FD9498FF09F5BE9BD54B02FEDDD360A9B03429 + 4B00287F5F3E3A65CBE0F71FD114622A96080CCEA497189ABA25EFE4EBCBBB8A + D144FE8EC009A13EEF8D385737D32BD4F30EE078434B7BE9CC2E3803B145716D + CECA1D614CEED2768A48DC52741844B49152DABF1684E6F3FA8554CD0BB96B4A + 25818D960C6F4A305CB5D4B77DA9A9B55C9EAE38E0E778928D28EA4A08DC223C + F4516BAD8141E947D488D806400AB4CECFA43ABE3CB4F7CDE5148B88872B6AED + 68B39B1CC842308B88972E984B0064C9EF7BFBB68CDB7C90D2878A1648E23E17 + 31F0B4EC326EE69C82CEF6EA0FA9B58CAF0AC9484F7EB9492285DD8A63D3E7F8 + D73B13087CD371B36BA9AA939AB042AD906253619351A796C4AC3A91EB65BCF7 + 384C7D5E552E41C99425FFBF8356B9870646093D1946AF7E26E46DDF6A83FC2F + 530BF5A1693E324CF728DDC5F77BD592A865F81614B3CD3A6D1B1E93F5F3F516 + 9EDEE2F577E1509D8D186364757A6DE9F517504555E3E63BB78B7DC148E6C546 + 8DE6BA368EF9B23645830A1DDF7C9AB9416F49ADEFA665C21D1CE954F4F359CE + E3EDA3BE1F2D23878EEF7238CE889DBA9248A1CAC93D61753193DA1420600200 + EEFD6EC22A739146522028A2C209BC09A2987C42711E5AA9E0D9D5A338B849E3 + 107694EEE965A4CF4F3B900C34193E943B45389534AF9C9E4BE8B40C618DF21D + 6EA0C44D4CA4ABCDFD1FE93AD29A2B1CB25103C6426AB97477654FA8C69B415F + AEAB5A3A7CD90872B69BFC8DEB42D200DBAA47E6529B2B2DB7329AEFDC902E5F + 8BCC55F5F40BF3040B24EB6ABB4B1D43EFBEB79C270EEF4F93AABB109C029BB7 + 247093FFBE8924945EACFAEA6B485C20186A3FCCFE055F89ED367DDDFF73D6F0 + 0D63FF8212B117A1F28BBDC9060E29DA88BFAA40108D4BCFC0EBA1EC25B32A62 + 6211BB1BA53C3CA4A49852027EFAC4CBAE0EA29DF3954D22EF470D22014463CB + 913190D4B443A237F023D356C2F38E107ECF3D9000D8404DF832C7763DA08413 + 1F0E2F9F88AA2E606BE6506D66956BC48EE9161817C7DB834B21AE4C7A1D687F + 53E608C82BDAD9EFB7AFAF2EE8D5E4DF67F7BFBEFDAA0D9EE9D303F64386404F + D5F311C525DDF6F3B2B7B89F23C95FE546EB3E572B5982D61FE1F84E2D31079E + 2BD770BA4A4FFC79A5670273FE0B6B38B8CDA5980DF74BFBFE538AB206AA7EC7 + 75296C8878BCC3A98EF58EE1C78C5DDBAB2D0358130E6525D212F0D6F4698F22 + 899CB188E3871C1278EEA7BE08E73890646B80C6DD68D8E178A6216232B5B750 + 04B1006897D565C3E649C937FDED77B44A3E1F0D39342029301BA5FB033C2790 + 3AAF22443C051DAD818074E0D45AEA05375A97A660695184B230A65268FA2987 + A4A1386F90454E387D5ADFBB3F31344915266F98F6480BFF0B24B9F4B19B8FE4 + E14CBBAAB4C181D24D88DE32379431E3EB17ACD908CD1E70E8DB705C7728B649 + BAF1E0C076501E3F2983D0D96B1247EEF4C1D5325BFE50F63F1E82BA0FC01783 + 42E2D74E5CA3D8F177AD22B143833F32B13D2DED39A1026D047FFE9A65BC5D90 + F6D3129E89DC6AAA554840775C1410D67F6EB7AF599A118823AFB2D34E36DA07 + 28F6C6070B780AB4FD6312F5FBC9D075D8706A79FF761EC03EAC06E5D7FE6921 + 78C8BA359E678A2731200139D4C8D0992BE85B36F962F3C48052D27095BF24EC + E6966D129DEFC3EDC53C9429691BDD3949BAA9DC0DE24621CB6435C1D1795442 + B8A6B30643E62F229B9FE60A1B65FFCAC64265BC67E35A1A7BEC4FCE05BF7394 + 76E8FF44FFC27F056838CD10BB29029A7CE2EE37AB8130CE6230985AC1D1147A + A9CC5BC79CA517040C21AAD68FDCBAABB2E4D318A6B710CADC8E27B63DA2CC9D + 1A61C05F22626EC9E0EEC90926C75EDDC4DA7BD414D4BC7801B66DE50DF326CB + F82EDCDBF3E2A755E68735DB4BE6AA7C8FCCE8A7F793B914D4813D53D24C7F99 + 47087FD10EE2BDD9EF3119BB2E9EA5F4E3A70B84049E2887F317A18EA51AB21F + 51AF105BC0704DF8009B22BDBDCD89AC329D59ABA43E787B57246EFDEB69499B + EC9486D695D3BCC88CC1A668BEB99D0FD0FD1CC5614FB342BD43F603A8579C16 + 9FF4D95A08EEFF2E68EDDCB1A242FC36B3B609846F6921D121DAAA44423FFF05 + BD9032B97BD4A6A8A7003F8A0884517FA11407DBE55A60F21C1186C728F72272 + 34FC77C00FCFE0353242B0B9D4FBEEBFDDDD49DC7AFD32EEC348B1DFADB6B31F + B080CE4AE12046B10B23490A16158A0871E70B62B5B07B1DEBAE272321FBE0B1 + 97E79AB6B1BB341DC942F6B4925D56AFBB053BBC27953590DECDF435EDC06544 + AE6826F14DBFE78F3A56DFAC31709F5502DEC9D0618F12CA63AD7ACBB83E7012 + 962E1E666A3DEAF6354269D16CA5DE760E5692A7C1F3FC6357C7111CCF929BD4 + 03D4173C8E7CA4693DB6647797D6DABDCCAC78A48EF05CCE0CC71DD5E35C83FF + F453C207BF73D782C62786C318DFC82F084FFE350058DA08986774E2AB747DF9 + FE73389AB88FE5C4847DEC2B96DFAB4F9586ED56E58BD27F7DFCA02734AB5630 + EE5FD7737C181CC410E79D4D22687BFF4175DF03DFCA0435101EF3ADF5D71F50 + 17EC6F756E1BDD46099A0CD8944F1476525DB5139A866EB172F860B06F57A89E + E786E369FC53F93E5CC6CBD853346AADEEA6EEA1B15784DCD40512A528466355 + DEF5706F96C01529110428EC059E35355922658C8729088230DF1C3CE53ABCBA + 2B62A957E930E2A4EAFF8912BCD4E79653CAE0985FAA1D39EA9201593975E79D + 7317352CA29CF3FD4B78D0D94F689851E8DB92450A7F11473A6611E4F7F68A5E + 6B3684BDE264CFD6C5E0A35FFBE8A5D61BA2C7C5AA7B256F57699C8DC5C509A5 + 522300F91D770ECE4A4C43BCF845879D15FE26BE67264424A7151A5FD0D253C3 + 339FFAE5ABB829BBE1192B287261296E88AEAA3F576E0BACB51F50947A44FA84 + C0E9DAD4E239E4129770269090386E5D127EBA449E7076D077CE700C0D97AE8F + E01C400AB56BFDFB6604702812003BAD7CB660FEDD3288B108505F41182E9543 + 2474987E46502B4D3548FB574953E8CF87C16B6226D36575FD0C5D19204B6C70 + 64909377843C877DFA70EB16AA29A692A1A9687EFB3849876492139A3FEB469D + 27129C6AD557F35B392CAA479F5839E98199051AD32EA1C8E46CC6159CFD02AA + 45CC0E30742623D24A92524FA007FDB339AB0319F696B8860B10912C30E2D3FC + 8D897508EB2AE80A2C6026066A62334DD5C79A9DBAB7333A51670C9DB60F3563 + BFE61D74049F5B918A269095CA7902D7FC69859CBA3994607E1939BFACF1446E + 5C00276C393B309792A43B3762B4103A3968CA5DB0356A8C5177CEFD0EEA1042 + 53AA78F7155E40C9224441FF793F0E96412048E02D864EFA1306A09687600576 + A053F042917578D87A3ED0E1525090E1E19BC1FC5C95F3AF01A8C9A724D3A85E + CB85028CA9CDAD7248C6CB66FA635D0F28050B1C6E64C2F0148F85DB97C08775 + 100358A9B6BFF95D1333C558D635BF8BD465C23DDB294A5229AC14D8DF74E73E + 4450C5354C3A54E0D9ED77DBD1D6BE87D619525EBA8D701DDAEC13DAAAFB7C8C + B377852561969226733CD871664A2972C4B004C295F9618C2994C991756058E1 + A1A5B7017386A8D54561D22C600FF78C531ED2957928DFB523CF93CF38ADF6E4 + F758CD9425AB5DB48E0CD42F4909162175A030EB6C18170A1D8A7E2E7B3A4234 + E9B0984A69DEA17301BCAAE013AEB0E8BED8E03ADA93405BE814DBE8145D709F + 82D58466D87B8555F421D8AFA87D9453571427C40E9827B5DD0E925246D48CFD + 4BB48856B764B205BD03710BCFDF84319CADF8B5D862431F83AD9B5F9BDAEB47 + A6C6D27DB675B984904DE48802F2059AC2730467E80856F44667FF7833C9DB58 + 6D8DFB54364649E98960271DB190F4D3C4806DF9FC1C76A7F6D12CB3D859C941 + D5DB55B92E47F8E24372529514EE8F7EB0CE4D29A1CB34AFAA4BD85ED2D9CC60 + 418D1952B4297F083E6E1610041313E50D99DA716D7D4B77AA459EB0AB1F82C0 + 6ACB1AE7675B1631C09203DF688B59D068B1C632796D04B994CBD8DD52AB6DA5 + 946A4408225D9ACFF2391BE449347B7B2C2B1DF29CC167C340C732F6D8535A9E + 33D479186506DA1478785015F7A7CFE5025F79EDC4588AA1CD311868EE5200D0 + 376BD097C099215A34084AC97105CEF30197D1CC926EDC4D941FF35582B83A23 + 9EAB3617AE557622B7C233B3801263EEB0256D4FA28BA3A2FB196C2021F8C5FD + BDED75F031C3C57D4225E5FDA7EF5D02F54B5EFB28F77089996074702806F73E + 04BCD8DD377C950CA0F292D51B34E357C28DEFB17F713F4B0768AF64A38A99B8 + 2AB945AADC61BCC77A15A72874E39ED353B3BE154ACB112480CEEF3728CB9628 + 23BB73E98147797BC75F68E2327A913FA793BA395914958332A868636C931908 + 155F7FFA76E544BCBF2FF220049DEE7D1072096E4B98FE0C5F581C9B3CC5BB5D + EFC7CAE5A6BD6844C2AEA4BDA4BEDB9639343231E26BD98510FCAD39842E1E40 + 9A6C0A54F60599B2D9F84898D9F36C2B4FCD0D7C738FE3412D0A1D4A112391DF + 941514603AC17F56702FA9E587B37E3EC192A8F071E0B9229A62AD0A9CF66C83 + 4D8F71BFC402582EBB93C41C7DBE30EC621D2CDEBF6A0BE20CF426F2BF03C273 + 180346EB3447CBCE0A7BA239E8E794A705B87BBE7DCCDC5F76B80C9F144DDB1A + 149F9B48971F32251D2456A49FE3062229E2CE558CA7DD07BA0F2A4AA69B83F7 + BD243F22074195F4167A6CA24D4C0BB8EB15385107DA71130ECF2F2BC810CE1D + D81326CAB13B53D125E1A1CC988DB84FF1EB6C4089AA76CC60A862E4A1990418 + 3EDF5019ADD5621D08D27AC4BF3B12A31EC96EEA0860D53271189F54D7BA6AA4 + DF3DD97E5EF72B1FD575EFEF8D735B94D8ED4AA99C92195D0C34B5E75C74D9AB + 4A2AC6577BDBA24EAE9D86E4559F3A7E3C9A9A68B72893219DA3DCE0919EAADA + A9F0DCBE8F6DB86586DB77271CF83CD27E468E374BC0FF11342EEF1926CEA721 + AD915C6348D3C5C998CF858F9353EBD5DF51451FA709E6E9C15DA880598D8408 + F770B712D7C102F3DE174B0C5CDBB0E6887688FB32A2FC002EA98B7DA20B5D6E + 14CE163B5CA4811D45DF80D65E5D17AAACF4C3D7104A1C7592BA995A3BC6C1F6 + C5522823E2B36E5860F3CD1032D5246511E15136927632145C506614704F0C14 + 2CAE0D50098FBA29377F185CF00808E1278F27CC3E697F23B05B150F49A15314 + 7DA44E9B9E92FD1CF03E73B636B6809A15B461217166FC1112E9D2A15A7F7169 + E9D885A72F716322755D6E295A9E87BD85A6D91CE9DFE90F88BAC29A2E6B5297 + AE05AFDB1977C4BCF66D7BEA6BE7C4ADED0C5143F71FB0686B84F9A090297B04 + 7336A5486B67A327202CECA25877F8F32CAC41142D15128CCEBFECC07DB652A2 + 7E3DCF6E20AA6718C784EF8F28263A7D770B4AFF9A72666C3058DC24DEE07AD0 + 0CB2C96B1856F64B1F946F9FEE96A4B3FBE88EA5DED1A2B32858CB310EE2BB47 + 0507E445A623C3B13A941C54D2435D22B4E00B478CF9B4922A8E33944B9A64C7 + 74DA2C0925E419E31EEDB8AF4B672A717D3561EA72111E6228AA16280701641D + 43E123542BFD47EE0A34E55BAAFE38CD3E8BE4D8FEF4A8651B2B227D57F071EE + 8D81F322053CAA288CF16B255E8977F030C4BE7CCF6FD84813B852C943768D6D + 56E5A9ACACB98B88B258BB1313E0FE00CF00DD117E32402CC6BB57FBDF8DA670 + BA030A703F7F761E571173BC83A3F8914D515A2F4723F234B819967DFC31D20C + A9C1485688C01221FD9B9911D5D9787C94B7BD2CDED641DE35904B72CD65A88E + D08734B205F17287AF080CD1909D329B2F1F793EE7929CDFB73F6B45B1B766AB + FC57A284465C6588B2B632814378555F76750448872B5CC06F9E678E44D3CB12 + 9F386852B01E6D1D3EE1D585AE330FE13C06881186175C03B2BD7AE526A22446 + F8A0522282190131EC4FCD6DBC83CAE624C8EFD618D9AFB4AC371693553A2372 + D71BA72D6FAA83C75AEEFAF3ED1246371977CDB2341F765DDE1BF6CE455778FD + 0F4AB6B42EA257DCDBC38C935502894BEC8B676A528DE17F84DE7AA5FC4889D9 + 5E2D3F9D1AFE4500D517CB5DB6155F43AC17345CEEA86DD347F25BB6E6A78CEA + 0D772BAE151D1CC789920606D2C7DD1FF5FB3CD9E988706DBCBB2AD6ADF867DF + 269C1CFF3B6D0BC8884CB958EF0A1680748CCC99E923EC344A34B25F09244F09 + C690A24DE190C415C08F25A645DF89939020DE3C9DE0FDE916F0DDC93F32B3BB + EFFCE4A43CCAD14D1D6A40A484727C3230BBA2D7BEC1D3A256EABE150DC1E369 + ABE0E6740A01A59611216B754E373C7962935D9F93A3A6204DD5007BA1AA8585 + 13667CE93B2863D487B86C599D70F53D0930BD4CC5A29C9B5657A92BF7E64381 + 0CB094C42AA86C291A2765F2182D35AD0F1E9278E279AE56076120C75D86CA41 + F4DD457166F821693B5AEFDC7B70FA6DF9B59819185539043870D2485978C4AD + 9BD0E57204EE5606F1D9853223CAAC471CB4A50D753A0957C57AE815DA03F763 + 91C9412AA19B8C49298C464B968F0C2A91E41A2C45736492BA4368B0BF130F9B + 1E51E263BF1369714650F2DF926EA4DEB89EE1AAFEE05820FB06AEA8669F9F60 + AB1B9A5601615F3C954F2B38AC5CD45E9FCC8C419119D85A5C40E91FCFBDD982 + D47DA2DF737981B8EF160AD4BAF6159FC02949E6BCE7E0C2DCE76E959356F944 + 153640CC6148C55C5BB30DDFAD4F6DFA27D32F72038862AA3C091EE83F4C5C6B + B5C93F6454F370A8492A03745AB27F71EEC5FC3D1698D49EA86D8F035D4EBE7B + C31B940ED6E133A884AB759A4A1A5C953CB43D9A4E017E247907EE29E1D1C6BF + D06D7A656133E8CB6C8A4CC5D6DE3ABC1166DF6478E074D4E58B9EE78DC80B32 + FA7B43BD71FC1EDD0C82B524971BAC2AB8DA545CF01A8653D7B88E9419D59444 + 3754BDB56957362E8739D9C42EB11B0EC5A178CAAB64B46438F804D36D9C7D55 + 3ED072F1879A7A390EA9B0EFD7C9AA3BFDA4CF9A33B04B17013287884756235D + B05EA398D277011EAA7643A323BEFB6F5911FF03EA6A234CB1FDC011558A7EE6 + 57361D850285DA796F57D5EB867D65DB5B23E4A88218D17A1C8B609D61D5A9E6 + 370A090A3568683386AB45E48DF7FE4B7C272A907E74C425247EE09BD7E505FB + 5ECD92587893181FE9A72D9976A500143D6ACEF9D7B1CA8582DA80F87B895302 + 4930A79407C6DDAA0D860EA78E7512A1B711140D8E3598A9BC9C80E4923C7AA4 + 608EE869E9A93A8AA55881B68AAFD318D4A785C290C83545BFACCDC2A84BCBF6 + 0D2D8D5DA1EAF386A38BF9B3A7CE6FC1BAD754C67CBB6B7DB7FE0A94FD931C23 + 3BA80993E165F34559CB98C8689B52F0F66F7EEB15B52F718A21210F07D3E3A7 + F1DBBA5AF25D2E1508EBA84784251542FB5BE4B153E6535D211C81640BFBCE56 + 4A23E8BCEE623BFE4AC49D9B2D9320275AC5F4C4C4EB6022B5AE0528C5958C05 + AC77D922317CF44EBA17719149B6FD0D1E77DCE788E2D3463D88107386DE2B5A + 214F4D0575953F527E7BA042FCA9468F716418AE582337CE2A5ED8EF45405F9C + EE9816A4B9DB622022895D200EC9376EDF8B00B67BB29D852709632F1A7B6BCD + 7B37C01E7468FFE92E95A62EA562B1E7BF6F86A29D4F73831F7A521DCC766CF6 + 9C3E30ABF7F0F0E03AA46E9373FEEC6B9C9A72D16651A3A72025F5A63D2A7C2C + 07ACABD0E56597075B3AFDC095E7A6FD2480447E82F180651F572088C358009C + 770BEC2A521CC27EE56969CA672A44A07E42EFD62C8A8F679C6D83F952758070 + BFE4F095757EB839319F0F356C469B53463B463FB0E86B557F898A6328A0BB1F + 2DE6739AFA8F8DBA9D29CD136EA83F68FDF3C06F0D54E38D60593462FE7740AC + 892F28CB2B74D0C72BA0384516D11CFD48D34F899E66A072C0751E524400D386 + CDF959E106A3763BA6D3751A1B7D29A2AA6596A7727E88513266D09F2583B82C + B99EE3E8B2356E5CE5FC45D43CAC6F7D0E6E8C6A16652E153287941249DF0AA7 + 11B6ADD73246327F24DF8C91EA0CEC05EF8806ED22EA189ABB7934507F5B2B4D + ADBC827361E17DF1F371CF4260B812A656F01E0DAF95978B82F327A64369CB83 + E3FFB43FC9058DFC612368BF989867BD56DA4122EEC3D0B30290A1DD624B7E63 + AA0C3424C934B180EB559744015DD0696B7EBB5F26F711450FE27D0ADC2643F4 + F5CC8E1DF508279E9CAEFC2C654133DD39E89B93E41AE3C9895C90B78BEF49DE + 4A5BCC7BC62708AC6609C51B30F97DE3D674B7A65C80BF40E81597E7FED39AEA + 56DD5E8A11C21D39E75A73134A44BD959511762E002558BA3111BF6B96FFCD75 + 7A66B53264587932C49CE80CA51494745390976FC6A7412FA0E1374146EE0B1E + A8E091516C3B7224BF89A82159B49C3D39874D999E1A3FC612E81C5B77920099 + 3B966FD1B9A8E07F157451BA85000ABB8212E66B299BECE5C37A5CFC96D4C1D0 + 36A13306156FD021C6870BD0C9E5EAEDEC818AB7C4B8D2158C41B76D2F41FB58 + D5FDE177D242E387AD0BFC6A89665BB336AA20301432DD52EF894DEB430831B4 + 44FD54D96CD81137E23EF1453778A455FC878EEEB4915501909CFD573403A673 + 440F31E30B699FAE575E06B251E5E3EB0F2575FE782BF8E2A51965DC869BB9BE + 71F59DE9E7BDC4CA5AA08C7921D471EE85B9078F1E1F994E816AA1AA959C5383 + FA8FE805C3C9FD3530ECA8D3DD4C714D30A334C3BF31FFEB7B4909BD9D5298C8 + 4C95FF61357B5D3B36A11EA7146C905E261511FACA9DC3F70C434193B82784F2 + C667029059E9245CF5CA5877B77C657E0E5F1CB3607DF2267E10DA8CC5EB1E2B + 81C80D857271CAFCF114F60F85B36D9C685FF4A853AC3ED66C8139A526BFEC46 + 21E874377207E87E41C20A0EE24A961423A74F1019FD6B04CF43871B9EF60A4D + 16120541B4775E639750E9A1F9551AE6A3AE335362054830CF60809394FB3D36 + 0B9DB2826EC7CE3BF3BD0142F3D866AC7935E2CD71747522B235A846D4942F36 + 4D39E7A3C8E4AC8C6DE3C860C00BD90AC5DED404AB28B303C713FDB018BD0E8C + 1860B0919679DA1B7FD734B1B928CF7E2EE21FF4CC580DBB0EC1C91E11762716 + 745A5CFFF1DFA578285E0C5454E3FBB614AD4EE942655E70C8103E3337B99AC4 + C2D7669D1062C084F264BEE4C89158C8A7C74AD80CF603D3A58774ED4C668624 + 5E9C8D0D4E58F3AC067CF1F359EF271BEA1ECD02C9E2CC48E5E7D48B717AAAB0 + 5AD6DD68EFEFFEA943B58D82874775F6E05A5A1190FA563DF7442F9DEEA0832F + 2B2E0041832BF77C864EA2D5E381CA137FA181D07C18EA225B70E37257FDE3F6 + 1B56ABD3C800DA100B1E7BBA539B2EA9D0020801AEAB192EDC5193A87AB9A5F2 + 4542DC962118FED1F1D7CB10811E103253C3D3040F3A6E6DB23F3213D6471F9F + CBA7112DD7E0523AB6CCDBD060A26AEC0FED08FC746C1732C8E83C4DDA850A1A + E33FA2783427915916B59597AEB94ED20759F7A8CE537E94F737156C9B86ADAF + C87BEEE1F60C49B45CF652C1E1C47EB375AF49F338709014BB1B7A940C1A111A + 7D20CE38ABE1B4B2D7FC8C53424AADF85228DBB7F06955EBB5FEEC1BADDAE078 + 740CBBB6206198B20C66258A35521FD66CB5BAB7630A29161DCC68F521933E7F + 1DD1D381A0348BF9F37F1F79A732DF29751D73748E0B383A62A1347FC3327B6D + 13C3D9E841453C68C0ACE24A7D3A389267C7663C27613D5B75B147F9B8DF695E + D0EDD67F5ABB0CBE4A76BAA159EDB548D56763C0DBE62E66FBC7C1A92D0F9D6B + 5D0FC373320116E20AA04CA2A3F5DA6D009C5937AEE76AD1BB268323BC6D4E56 + 6E7B9C79BFCF51E6118FF4EAA7B36B2E44ED57A26ACD3879CD78B87991AA0EEC + 2DB34A74DC7EECEEED3752092ED085EA9C866C42E33A4A661002F9F69EEBC40B + 77C71B098ADAC8B2FDBCF68D17BF7EC91C380B531F011FFF4F7C5DB389EFB576 + 512D2A01D0BEBE6B887FD15730C17DB41A3735E4A43E2E8E4AFA2C68EC19B90C + 5327321616504A526B92FE70A71D6EBB9067164C8939378F4E6C9C0000438DD7 + 78FBAE9FE91D50C2AC0CABABE31A710C4C3C47A0EDDECB0A49F222D1DDC9D714 + 5BE958D6A2B4AB50135181356E66B005E9DF58BD1448248BFD059D0968ACB665 + 58A83A23270901BE5E7D86D2F8CE8E257DDF7729572AAAB13A6ADAB192708E29 + FDD269F04F9FA8F8B65E53BC45D5F247829010E02356B8D294662C6B890590EF + 90DA352BD236A48199F145F0A8DB1D2A3B81B668671B3AEF46D3811663FA4E44 + AC55F7450102EB2730C6230D49F94FAD03C4D5D3075D4BB4B0A3BBB462E82F25 + 1B66EDF0947CCFDBD812139AF4F467B93CBBB5CF2307FA6BFF90475DE1935187 + 3AB132A03003F2046D046BF7BA7959552F0F87B21B6924563B47BD277E0D4866 + 780A2B04CC670481A3F739003B30715E4F1D4EDB30EF45755FF72F561877C93F + 140A2C7906E4BE04964D9B24DE50348A48C962E7550D81D21216AD0966171E3F + 5DD9934C520EFD6543C4E08358AA6C8EF788B27E2A5D0FE82A83EA9C3BA1BB8A + 0CA2CD3A9926380F1618B518D27B35843778113DD8A8DE300BA13A07DE6CC182 + 14E21C20149CEC35880BD187BB49310536C9C739B44068D14FB00ECFADD64404 + 783D12DC97F277A83C39E40ABABAB764D7CA7116E498BCBF26FB00A5BE6393A9 + 738A2A982AF7951D83577BDE4FD5980D4B0448A3E9F43CF9DB6A104AA95F47C4 + 2B808DD09B4A828303F8B5F5556E33F7201A251E0FE1F21C70D677FDBBB2D618 + 3A5EEDB3D911B4F8F52BAD6D04CF672A96E5DBCA7C9FCF33117EC87E27E88684 + 9CB41B7547932E6C424CB88D7FBBAC80C99AA0AF97973839135D1989903045BF + F4EE0469161D082D05BF6FE4BBFB15B5CA663E448E8587A15F46F1A05770B91A + AE051C55DE5481C77683BBD9D0AF42AB9F2B253805F2E4C0742BE59B5275DA68 + CC0EDF7756419EE49CC64A9D8004A4E3A4AB446A05E3DA4070F6E1A2A362C2B2 + 84A8AFCAA94CDAA89B200D5F5A8742C7E4472F60EB7677338C47B098BA7400C2 + EEC67F4EA0D9113EE8F873223A3689751F9CF94FCB48EC56DF930D2548F43185 + AA9762424B9B06F48072F22982A7BF85BDDF5E86722782AF3242515236987901 + 090B27868C689E729CF57F6CA51108C6A213E1E51F42A9F4857017F533EF0CE8 + 416DD8A931AAD2EEEFCF29C6B787B420C243C5CED15977A8D579332C0E374939 + 752FE0DF94B8BF6E8F0658C39188CABF4B045C3BFDB76F9C014975B48B8B04F2 + 425DD0B1A8167E5B0E7A3AFB2C2A968902AA7C2FC7141FF5B44B013F8697FCB7 + AECF46F890D2FC570D9573527B56F7DCF6E4F7CF25C7DB58AFA03D7C1976A6BE + 40B5F8590F5DFA01412B44BCD2083B602D9F3F15BB129B4A468CB98F49A38764 + A84A474665F97CDA6E65212311E17DE46BF6F94888F51E070DE4D4D8B7EC63A8 + 21B00C7762D72726E1D7895C5E44C06719550039CACC6EB52B06D90BB1555BE3 + 2336698B29B13F9A8E828ADD3715730AF7B43386624CD2DD3AAAD33CFF62D7EF + 3A24BA667B465647F9C0A3020CE8AE17130C14BB442550A3316794AD7A2B6577 + B595693C8DFD7E4F1999B90ED66E22AF8AE703A13E109BBF6D08C34BB5D070CD + 91D3A3C31DCF953578A28D8DDD60A716CEA426C2179F8B9252DB53E8C9161FE0 + 1435E57F08659AA57DBEA0AF4F4575966558D555AD50299981923F9EA1154576 + AB7E728A359381BF4EC2E89925DD33C5317285915B383D0DD0F88C79A88473FB + C64FED84888B0740EA26708FEB701CE653E8F7D2A578D6C59095A2C14C444A22 + 977FA456265ECB52DA95F0F6184EC54B27E3F052DEA893F650E933FD9844A6A9 + 8E9E9485478553F1277612DCD69262D6A7AB8B173FC71D2FF866878AB83358E0 + 9E0F39638EF2ABF69CBB539F722F3B4333B7D71608DE86CA012F3A769E563649 + 2541AB3DC4981F0186B3E5A4F88FC1F2AEF828E35663123B5EAFB73ED570C7FE + E2AD43D7753354165183A913624A5FF20E4635565E00D574E03889C763F5F293 + 15BE12EF87338CD0C18AAED69182BBF956FFDCC2095BCEF823A6F79DCAA72B8F + D8E1CDA3D935FF0B22597D44192E7EC6C6EBEA032B3E924084B74C8A7B591DD5 + 7C0376069DD1B57CDA9E2289FF6084A62D43331CFB24621667D38C6517CA748E + 55DEF0E9A32D8842757FB18A7B79D9CC01B143D3351C90E2BCEDE679193D1C19 + 113E74B1FE2343463E99FCC9A2F308B32A00C7E6044AADA0726AF1CC465AF5A9 + 69551338007759D9982FA9ADC62DE74B390933151697D885B4CD39C86950E357 + F2D52A1279248BC23AF971EE9F6B3F1FDBDDE92BBF917BB06D558CF510E6479D + 1D3D09E069596C893ADE24EEBB7A0B44BD7664BC84ABD33012CC04B7D7349FA7 + 285380DDA32A3E0589E315E6ECC4444DCB01F483D05AE80B3DCC6F1422232FDF + 0009E4EE7D7829D4D4E4BFFE71BB55FA39C7D56D6052B01B0808848B76E1DBBB + 84783AD290A1C54270F25C3F07E4B209EDDC24E7B49E314432879F0D21554531 + 834E23259488E1DFE990B11E41C2C44106525197237C0D6FC2E7EFACB6977C6A + 7FBF398644A2D44493D85EB6FC55F8968FDE0B0497897B52D960A1C84E4BCE61 + 6CB6A0FAD8120478C96F3A52B4A661470ACB397D6D38F78F6B2A520C1AFF0359 + 1CBF8A97F5E7EF838F4DBB70FFA5301566B38D32DCB16F4AF17B410D971A1C02 + 151C724E2F677170A27ADBAC1C3DB805E44B38933021C130A4563C9FB5702447 + D1FD6CACBD26FB9D4A8E9896BA7C629811BF82F24052BB6310BDC8FCB05C7155 + C23756D169A683DFCF36C7DB3EF51647382F484DB28C89A5565C01FB7276876D + 53A97F5450BA746411F3037D8DC2DAE4AF19702512AC6F57EF4EF9D1B096BB6E + 6E0465E3555799D5178EE6DFB9D46967F74968D98D94079AC18F056A086E117A + 740C974313D764B63F758289D81A4F5466280AB8E949E9EBF9469B87856D3B3D + 79818057BA4A65D262725A09219CD208E5AB140A052194F0EC238DAB72ADF2D6 + A692A84BC03580B6478D80303E0A0FC06E8FB0B9960568A5BD31C0C7972D25B2 + A63D631DC65813C0032CDE6B861DADA54004D2ABE4812BF88777C32A173B9CBB + 9056E27128B6CF9857DDA4BF20AAC4BA1E250844371939CB200573B717996C06 + 553728CA7809D1CA11201A99200C44679E5F11BAD324E955FBD99076BF39708F + AC2163A00BF87BBCA3695B5E7234FDF04B53E80CAC1B9F385A28B518508199F7 + 72135AD49BBEBA96B412C5E52040C4044E4E339B046C311B843050B05AA59138 + C94BAFDDEAB1A246CA9730D1FE7A226607F6D3A8D5BA140FC21FD382F3B2A072 + A65FD8BD522B7174404F44F00AA0958E6247A6B3022E3DFEF73B7D8928D662A7 + AFAEF84E8C22AC0B2B178EED68E2F9587D83FA5F06AA3FBBB137FA4D0624E9B9 + 5A551077EA6E5876C409B6633A812E0C78A6F2F9E3B6EB2E41E55EE92C76CD24 + 4661F957B960BFD57A25A62CBE484305505663407957066F66E750574A601D96 + C83DB0B814A336F8EDA7BB931F56FBEB604B4C828D7F82741D6AC3BF553247D2 + D19E8F70007EFB8F7A4865199C0E2D48E620D3695A266111607B4EB305F42446 + A7D24E0E61D491317829A76B548D0C3770BBB09BAD4E158B8EC825BAD8CD7267 + 4DB55195C37C70B219F03106BCD111A0E4ED47319B48E2FDE42BF9558EEE5E37 + C41DD7C162F5C131A507432E30DB4BEA61FB975819E54A01C95284A9034AA50B + DE234000EBBB4AF6EE57B02415F7CE0C5C0917670ACB84AF226977D83F67329D + 7D22EDE0410BC9CCFBBF26E1C1E30998074F564FA819D2030D44EE037051E1FA + 9DDB7108060E3D405136CE122001EAA0F8D67D539200F694BB89DF3194DAAE2A + 6D5A958200A0DE6DD131960116A2C5FDABCFA373FFC914053FEE320865276139 + 9A4E64E923E2EB305EB48633E007A94F8C0D489CD5FBF3100D5B42621A2FFB0B + 30DDDDCCFF30D94BADCB4ED8C41EC96C7872558FF54E1F966A805424DEE1D6CF + EFB873976D177539F77C118D49E498BA96C53A5D365CC745B2197148ACF13236 + D4B11E426E84CFFF217B3A4315F92AB9A80B64A4ED4436CC8BB384C2CCEB77ED + 4E03C669B3D53A7C35725E3BA36746FCE1A82B1DB5BF0F856A2B605DA59058A2 + F6A7915E269E7F73F245022B28EE6362FEAE33A8E5E39409FDBE61A8D673E4F8 + 863D89A91BCD5044FDE25DD67521C9810AB24F6A147905BE71FBB071FB7A6665 + DE362A1998194DAE3BB79CAD7A0783E4C7C0EFBA47965FDE35219F3A912E871C + 5228D22B5AF94C7CA529CE73D6335D219C5A10404DB4C73D4201432D61447BFC + 5C5361E830C874B65347D4AE040A728D22DB4DD11BC21372668C22DCF3193694 + A41726B2DE9C2107A667E1C8BE76C4056DDB03C3EC874A3245C019F4C813C101 + 13063302733FD8FBC7808AEA5D8C1FBD9E6216F64F89785368B94DE0A2D54910 + 4367C65174C2227F74C73567A155F7755E8C02C54E6E4E7EB5B3258840567D0A + 3322FBA614BEE8E9455B7D7F079D3FBFE0CEFE4502D6F08FFC895BF902598B81 + 2BBDA1101BBD477530325D3EE2084D71A2AED4724B4E510AB5E7B93906A17B5E + E334DF4D7648DFC87663A46BFDAA94BDE71328D4F45DE8C9CC0602711BA58B21 + B10D52D4787FCB203FDA4E1A55018BA9FF8721AE051BA78B1B6DC4E96DE7A188 + 6D5E3878EFECC76F1387E683F39EAC0AEBA8C46F2DBE7A498AA70562F760E12A + E4600D563E0204265DFAAD25954BFF204FD272992BD86FD3287D1E66FDE87066 + 0B459E41A4E06A418BA3433F5275FBBDDFFFFA1828C6F9412F9365D61101DC3B + C83B30CF6E9D17F30ACCC4BE6D9EC68A69DB5BF8E62886F57613E8225050939A + 45632DAC8226DF50EC7D61FA84A36B8A67C5BD8A8CB0D12D48672C9124D10DF5 + 498927C419A2EA233E93E9142724A0657174639D4ECEC255221FAB24E662469B + EA102DA9C79273D1A5869244B19C4C538136ED6CE6BA037923F9CC0514A4B013 + 886315B3872FA201C4E36ECE982DC37C6C2F90329DC2F1915D7C93BE909C2AC2 + 7B3F9F0E6E4AE103493C47AF953D9260147D775DBE79D62415D832FCD83569C0 + DF612B60941E0626835FE9446954422A42FF5E362A018D5DF5424B33A6B8DA76 + 78443447FB868F4CD6B3DD6970C5E1C6B56F600653056F53F7606D924173B974 + 712C5FBC88CEF9D38B2B74B42D2E18E7DCDDEB3D5D6597705068F05DDC5176EC + AEC5C21BAA454FBFF45CBB8FBA8FBFB1070499C7A8313467E4522A37EBF80359 + CC082CF3338E86CAAA91CD3DBDBC398EB08A4137D293DC5E627D490F2946C5D5 + 1A689858AD6F9861322D0FD7E61981C72FE4762AA718CC9BF6C2E2A0E9E2246E + EB1A700ACAFC8B8D586B0AFCC5D3BC5B1C739BBD692D0E59C8731C4410560DC6 + A9C53BE288EE957D2D38D69DE539E47512F323E51ABE643A3325A38A82F3EF4D + 2E505469D972F47991720F55A477F0E3C0D86040A506004F345EAFF8A1E12F21 + E4A68C4E65E67AFB49E67813D0BC51932D91728E5A87D30E709BBD59B10E8003 + CDF991D09E873F0B4018EF421038D0374F6AED74077FA940058648FCF14C9993 + 4809EBE792ED3B2773ABFCA16D833BE13C49619185351AEB94791E86CF2BF460 + A3A771078D0E7A764755A3E2EE9CD9DC1BB4F7D70C22568949B5B2BFFE2F2816 + C3D4E4FC2815C6905DE66A9C03C824B1C36A31A690C69210FD0C53DBA7509284 + 30E47C16EC5DFBCA692AD939D6D4471F8C16E73669A3EF04524B295AE631408F + 5FC7AFBADA4289DE10E36825CD56E275B1D0EFF85FDCBC7E0CB48C91EB9C077C + 04DDF53243D054BE2971A09930B8CDC1873BE14E392160E06473A291F2813A25 + ED33833D67CCE32E6964CF02697E3FCD4A106B3B02F99CEB47381E4F7F1BF693 + 40AEDB67FEB8CF57C8131F65DE4F5A8A03540465DBAD274B473007D1F3777752 + 7F138AD23B4D58EC02AE6BD07242B3196145F1D2C862417985C1B371D5A0DE86 + 43DBD50061F9BD8D86AFD0EF9B2FE4AC281CABD3F94D2F221D21A34C9FB762E6 + 94F5916113EFFCD257C61686E3985C38E994C5E7B9145D747084DC731A995FF0 + 88D8B2408FE07B16CBCE63C4ADB3F90D1E103DD84A6737DD796F38A000A6BEA6 + 8B1CA799073C35B6DE6E961DAD9A1A82E31F04BD6A8D3877F22F58ED9C92C108 + 92AB1F44149408F4310986B8EF215778A83A45B8B1C0E1A052A713E13ABCBAB8 + 06BCCCB128F52E0F2AB8A190CEA353DD10B67E92376249279D0DDC284D8BB286 + A5EA17DE30B2D02DD6A02A42AFAE20AC3882B455E8C284C0BA3D2A8B3F2F884B + 1E30A06FEBCFC1BB13772F90FF0737128D7B7A091E32CBF0DA2C3CE2ED504291 + B9F20A06BDEF7164C1C014173B6BE40AEA86BE9868D20D75C82CBC8AE7EC4688 + 722D02E883CF1B22B93DC27D791759096C6512B7CC62354FE06E96BC5B6B6456 + 54E07E63A4ED468E071FA4C73BC2674F2CE350A15A4664D20646857DCEA83807 + B787373C2C94FF75795E87251F82F9B0A95040C7413D27F066008542C79EBC2E + 67A97674EB4510191739D8DD8864624B0FB7D2F12793AD4B805A4CE6D8095B2C + E68453714B06D76CB52CBD5BE958D5403F27374209E043F04FEBCA3D59124ADC + C7F8455F315BB2DF884818FFAEE103F9F8A5F477226FADED46401B3FFE4F64C0 + 5978565B4999117323A1B2C6F7316473A6BBC05F7E6160A4B56DD52B0134163F + 9DB1B5F00206B7777096F113225FA49DDD288428BD3E14FF1F39F36F510AA46B + E093A2DF7B3BCF9CA6FAEA43B676E637A1F7F213346CD78D1DAB6999A419BC91 + DD40A0D6099A33BD61ED21DB942D541B2D36C8507AD047D1C7E8AD6E6B8EA375 + EE39593A051CDAFFC987B034F93B3D06EB88F7177FC24B7CB81E3B13CEA4A6E4 + FBCBCA14D9CE37A515FB9EA448DDB30BECD3558728F5807FC208E1F565E7DB5A + EFF0CDD37001B1249DAA5716B129B093644599D22032C259353FB12F3701CC2B + DD8F5B6B4932336B6C1E9BBD4FE3730476F1DC0F1F7D9A228F0A9AC34569B522 + 39E4B425F50C9D16BF3B16A11D322755D5654DA807A197E9B6F666B94D946908 + 597B0E0F6902224F84A93BE8F24CF3A875017F2CBA0DD647988FBF671A40AD84 + F2B2181AAA0A97CBD350BD28CFD6DD824EF01B16E1B154F2D6237AA26FAFD521 + 8A8E940644F4671E222579883BAC20AE8B2CD0DD77AF2F7159016A4CA2F1F408 + FE5B22E205C0CB5BEF9C4E2926FC15508B6484013E3A5DA536558F90FAA5C07D + BE03E8726599DA2F20A87CD42AEC04BA15207AB4BE2296B71B771080F5687E93 + 3C8D3D25F3DD690D8162CB75A23E1E937CC579C0B6C1242A967EDEC61355F5E0 + 76AF55701425A0670E437CB93B08EA36F1226F02E364FC08A47BD7FC948A6F37 + 4B411FA1E9940147F49088B7B5CB408C5469106FF2A39756A3ACB6FED7640546 + B9452D92A42446B9C85477D1C1F5AA5C62304C8E23ADBBD943C5B0AD1393481F + 8C2D1E114AA7B7C75E32381FF37896827A011BBB24BC467CA6F3F44A6FA9A6A9 + 251424BBB9CF57113ADABABF5EB9AADAF3FD6D631DC531D0215E8D9B87524E70 + D8621321607303133EB7E07DE18C3EBCD1B70F7089FE56DFBC6E51948E124808 + DD7DCC22C8C1CABEC0547DD246853DD4B93F54EE95BB5CDAE238CB568BF015D6 + 7787E9DD902F8D1B3FF2FB77F58845ABBC9015BC3663E70D12211560911BEDC6 + FEF63F8D08125E1FC8CADD04897C0229CD2CCE36EB99245B9749EF9C534652A6 + 3C6FB1458343B351405A8CDD025823647BEA830DE6BA2F41CB54FA2013753D54 + CCDF707996D6F18E373272D2FE1FCD40F636C17030C1D3D8326287121CA585CD + 50FDF871047C128FC7FE8DEFAEB8EF2BDB2C512C1E147F36AEA8256E1D7527DD + C807EBD3A70C5890DDAAABCF0350347AD12A959A4D40BC26DD2D0EC88873D546 + B8A56B2498133C954DFFDBF2E3A6ED3113D3665D5A6306799E1098662BDD6EF3 + 918C9D48AFC82D740A3B945084C40E7F32F3E9BDAFAAF8B46A1EE61063F45455 + DEDEC9EAB8C9816CAEED22A54726870BCB2D4E0ACA3430861DE3CC3B45A771E5 + FEB043E47B0BD8BB7D97F2E9234EDBA18F042171C617DD14600724BD4F64AF63 + D962D72DA96B6F0F8C890662DB7F2DF5627CD633F68658401205328DE0A2D642 + B7324C4E9479290DD990E526A79CF483D445B54D7E55647F6EB96ABBFE1FBC09 + C031C89334533AE30043E353BEE464D5C67BE7B8F2A4C91FA1BEC00E7E747312 + 12A26C47E3A8F53D49F83364C544F2D5AC4BE10A1D03917865A63AE5DC7EF9E0 + FD7566E261DCE00A5FE231EF9A84DD64C7F7CF8BA49D8507F7B6CC06BDFA6B1D + CC526D2C56E067C620AF59B56A4B4A3E3A4D5AACC30057D1E5315B4F1BD64AB0 + D82D3A73195096D32C9173E982C3F1CEFA82DE99CCDC0936408D7D14AB9A3B56 + CDEA6E6A8CB68FF98C78253E20EE9159273E9CCFA7175CE23B807B6D7FF4CBFA + 76212CB037DFB9ED7DB99E0BF716CEFC2F3E0E92DEB2FA11319FB456CFB62439 + 908DBBF02BB67D9B37645E50F6DD48F0FC838096DBC09CC46224655E304FDA61 + 17C22221E9655976896AE10D7B1D07B49B0D143639F4CD7BECDCAEF25E976286 + 9875FE91D7E9B30BB6CE8780AE17F88DBFD97962FB80D8AA53B43C436549F573 + 8A8F95130A4487C58F0BCDCDC5D555361341600D253CB0EA28787BC63F29742A + 115A6A328B503E818A698A3EA9866C66BBF4B141F028171F30276DB00A1DEC97 + C97BD6248FB8974F4DF3F6274BCC32047F005F38D1581D7028AD9C02DF424E1B + A1F04561ECC7197E5F042F34463F29E76B0C9C8CF9357275424A8020229F7BCE + 8AB02F57BFC01511E238D3C117C1B0AC6157E98654761764C0E9DE94484D5EE7 + 7F8543957607176276AB56B25217535665ADE06A9047AD5EB51947F3A8954EAF + 1916418158C1A277816A98F957C5EB7704D0BB1A77114027F5CA3942DD0EC97A + 5A4975D17DE1866359B6B2DB1D2AD05845245071F975CAF4B8B27BDBC6F13037 + 2B441965E3042C31514C2A1490A2250C8F91585B168E6C3258239FA070E5A426 + 81AF9FD78883D06300B24C93F9F89E84F2F618C19DA1A119C1685C37A85A7321 + 841D8A77EC415492B9F74DBC4E26E128FADC7D241E661195F59A352CE4567651 + FAB89E644E237A1940F0F505E4E8B8ED0AED25A3AA80005B689FA046B7F9558A + A69E18C828B7261473E09B57D57B40424B38FE1CFDB70296637F592A8D8E97A3 + 706FC37B82591042563309A95FBAEED6E04C1CEB49E5AFB73DDD21796863F594 + 19D1113B4BEE36E293319BA90A680E161A94AF3BBBFBC1BA06AD40F1BAD85AF6 + 7A194152A7B2848221B044AE6AD64A9C057A74754140A52A1763D6BF8BCFCD9B + B6655B1033965F1BB20C9C28A39A7D3C093C63ED9BEF530FA85BCFF4CE101851 + 53E28546C13BF879ABDBB6B730C7915A1F45BB0F41158131879436949B470B44 + 9C1DF9CB529F954533E7E71851AF4250D3C7C2DEB73DAE1D56527B8D693EAB9B + 5778DDE13443487851ECFB2142FC9D5BAA5A6E158F7B81D03F4015ECD27D8B9A + 57FCCD11E0EA94B0DA252B4B8570DC727079EBD83AF424C62FB90908FA0E8902 + 78EDAA426C7D178BE3F6492CAAD497EFB110C78799B3248F6C15E87E279114C3 + 2896897A9524E0E87495E82FA0A9E90785947AF67B0C48DE30F2B05433C112AF + A9E72FB2D16FF5CA8B977B3EABC57C77B97130FC9822907A2B6884339875AA97 + 3C6E168B7BAC101438017730BF80993367254C97144C3BF1349B7FD6E3B1615F + 1366904F942F4BB8288C631F5DA2A806A706F61A7C2A709684EA687DB1D1863D + FB4F57A366C08931A86B0BAE890D84D8921D4982F5A73C4CB0B6BE54F7BCB337 + D4B0E85A5900D546C9868867C337C96A6662DD5A066B73 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTT12 + %!PS-AdobeFont-1.1: CMTT12 1.0 + %%CreationDate: 1991 Aug 20 16:45:46 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTT12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch true def + end readonly def + /FontName /CMTT12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 44 /comma put + dup 46 /period put + dup 50 /two put + dup 64 /at put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + readonly def + /FontBBox{-1 -234 524 695}readonly def + /UniqueID 5000833 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F0364CD5660FE13FF01BC20148F9C480BCD0E + C81D5BFC66F04993DD73F0BE0AB13F53B1BA79FE5F618A4F672B16C06BE3251E + 3BCB599BFA0E6041FBD558475370D693A959259A2699BA6E97CF40435B8E8A4B + 426343E145DF14E59028D4E0941AB537E34024E6CDE0EA9AF8038A3260A0358D + D5B1DB53582F0DAB7ADE29CF8DBA0992D5A94672DFF91573F38D9BFD1A57E161 + E52DA1B41433C82261E47F79997DF603935D2A187A95F7A25D148FB3C2B6AA32 + 6B982C32C6B25867871ED7B38E150031A3DE568C8D3731A779EAAF09AC5CE6C5 + A129C4147E56882B8068DF37C97C761694F1316AF93E33FF7E0B2F1F252735CE + 0D9F7BCE136B06EE967ABE0C8DF24DCBBF99874702ED252B677F407CB39678CC + 85DDFC2F45C552BA967E4158165ED16FECC4E32AC4D3B3EB8046DCDD37C92FDF + F1F3710BB8EF5CA358ABACA33C7E5ACAD6BF5DC58BDFC3CF09BA2A38291D45A4 + C15FF1916FE2EC47FDC80911EB9C61F5D355BEDFC9DB17588547763AC5F0B1CC + 12D2FFB32E0803D37E3281DA9CE36C5433655526ACFB3A301C56FAB09DF07B5D + 048B47687348DEB96F3F9C53CE56DDD312B93D3918CD92AF53FB9461864D11B8 + 0138918D0B1270C54873C4012CDE6F886DB11BCEA04B023EBB43E0D0A06BE725 + 741D08B9DB688731A6C9886C15A83C28DADCC81385EA239E045E8F3670CE03DB + 9EE77ED067036595C9F3B1854343BE3A12E486B6E5A2F8AC44FA5378D28DCCEE + 306B0E283AA444423F9A4FF38E2B56DCF67A39CEB2C643DAE86865517D5D0371 + CB8797208ADEC637330A3A57902C9A88EDB75A7C16FA9850075D9F19578EC666 + 1353CC1FC512D59DFF847ACCD04CF9DFD4A2852A700FD18961F9C616F7F372F0 + EDA23988D13482F5387F0F33B46EEDCAFA07F581C1D2356C32F868AD7FCCA7E4 + 97DC25A98C7D1D03155E48324DF308A9356A78CD87F275C4752985DBDDA3A6E1 + 1C220122D2FCB767188698B54E352995A94A2355D55194ECF6924C49A91A101A + 153E393C8C093689D1D79F5F7CF3FB29A5732DC79CD36EE9927D8DF1E1E6A201 + 7EA03B0B0B947129143BA2EC176F4A769767B085FA1B5D2CA4CB9B7E0DB1372B + 550433888E72120B2EB45FE740C6B9A4B59B525935C2218CDE994C301FB8408E + B3D1EE5869EC4DF8A62DA9CC6E0E2691CD9999582C70A83604341BACFFA5910F + 3FC7D27DED00533982E63E6B2F6B99124DB5104AA47EEF33DBA7E948D237712D + E304059110B89CE2903E73E4680CDFC44D4ADC403822AAE0B7D4AF5FA70A76FE + 076BFF426050D16B55A3011A39A7A1D39A94D80D8DD61F36569AD7B918469444 + 2ADF078C4B8384DE16911D5ACA0D8C2FD365876F4A8DB008533C596EB89693BB + 81E7561B26C4BDE94DA565DC5ECF4170BDC4D6AFC8BBECF40D9A4C43A8390BC8 + D68BF3EA95E47CC931D9DBA88C15FA817ECABEDEB45A7612BA44BFD4E7473C60 + F9A673567DFFEB7386D8A3230264F626C126FADD81D9AE3F5CCC818FC0183C70 + F2B2B14F52CAF0745DA68D328A90984BDFCD43DEB4E6ABC6EA92A2B2DEA5B15C + 238396E45A81EEAB96F7F8BB5A6CD572C77B3FDB878C74A16BA94C5C303EF459 + 3565B63E4673A40E11F8D5CC06521EF079BA06766564FF78F9751D387FE4F524 + EDD1626DB318C360208A469035E82887A6A56D5E5A5152CD9CA22534C58B84CE + 8D369ACCE07D38DA51B418CE358B2E8A59F00B75B25C661CE327EBA20620AA7B + 6C689062983A93B60493036A1A7B97DED2DB5E7FEA03EABC66E816957C84FB67 + C93B2B6EB16F56B7CB913649920D7C2B327EBA78D4F17064A10DAF177FFEEB06 + 1B557718160A09E4DAEE992CB61A90B4D823B8E5FECFFA5A5CDE49F2B387AF16 + DF07510DB406843F37475BD04C1870C200A65B8DF721F018A162D0757429C0B5 + 9215D04E28E09F1D58A06AE2345ECC3BD6144BA7444E015A5F1A138646D883B6 + A753C816CCE8B76D5F2CAC93BEA7150282382BB3AD5DB9D4A3093C5AA87E12F1 + F8EA665F0F88021A213A613CD0D7F66A9DF2B16D97745A34B25E32DDB2059059 + 8CBFA9126A31B3C24F86DC0E97657FDF4DD5069DD44C2D36CA28039D8B18746C + E75304DF657C70C246BA92096182ED898B5DF3D3D3AAE19025C2C58AA676C566 + CA24F9641FF6250D9124CEBAE8A86CDC9752010B189B089C30A50D6CFCA33FFF + AF43CE5BD6EFA19CAC1B405E754BA686408FB6E92B416210B005BC4F8144C963 + 5A89164EE76F063F0947BE78FAF6E2079BC4DA21A985F9AE5DD8BD3ED0CE2227 + 25D647BC79EEB022A8FE1E720B0C24A21EE659B8B4B99F5FDD8D2A3DA3A66E07 + B3460EBDFACDC21D18DA97EDE623AA20E10CD1C054833350B0C8E17E8C1C3091 + 6633BB01E46006BA0CBCB22A7C96D8554084C4431384F3D80F8D23B7C8A4D007 + 43743A4AF692C02B99B276FA786ED31F09D0C2E6D02450469FB08FD8E40FB128 + AD44CA6A1AFC171941AE266E99B1A34F8DDE81D8F3FE055D6D47F08BB6FFFD83 + 9D2006346A35C30B67CF06521ED8DD428E60D816B5EFE29C54F8A3015BDB465F + 99F95B8185547C71A55CBA3CE19C6F95A13674C62BC233978D978777237FF367 + 5D1C5C2976481CFC043290E514A0D1B71B6F73B58775B055BD2E72A64AB547FF + 02CC0F1E41CFA5FB6606470C680A511FBAE42A898DBDD8B845932A34D471661A + 1E7E6CB276840240BAB6D30BE953FC06EEEC6CB1C11F52602FC8FF77810D716F + BF3D30EFC07DEF0AFAA923A102537FFCE1FE32E07B5068086B618D22CC4001A8 + 2493DD8ED0CD9CDF365290D08FFAAC4042796A864C6FA4AD91D0E5A62409ABBD + 11A9662D8626941F8CCD7E67D0CB9EB63B445E4118E5959BA74676F18B1623C8 + 4A1C779DCAD4AD767EDEF7175A94004342FC4C7E746F2D2D117E70BF5D7C0B15 + A73AE2272BF807EB6D24BEE43BE83439813B1E01BB82EC9D802DD54113D9D656 + D4F342023DF7536C934E1EAB6E0BC3365DCD1C4E0E7A6DE666B858C0CB3F45F0 + 55C3EDE3E96982BF443031E94856951C98BB92DC667F19699E591882D51316B6 + A9BCF0D13A3696CEEDA8F08FA9DE5667E8C336E522E873ACB611597D36678FBC + 93861ECF17DB3A55C5EBE29DFAA12D89E009B342916CBD59C9ADF3CA4F369992 + 742ADD66DE41C397AA1029DB550A044A48F9B81454D6D30315E5E8A25E7871E8 + E66088D6FA96E74D5967A2575EA73E09226AE906A5FB1C40BAAFF5B4F8F8D5CC + 1D73AC4E6EBC143165D5890E199627E8B6BA6EE232315277A8C7383BCD6DC89B + D89B882CA01135FFEF3961AFBE03BE19868838BA698B1FEDFFA3365FB542BEC9 + 3E6E779F578DD16B830E29777464B89E54C7B585B45F29D2B737776A0352AAFD + DD4C7FECE048CFBD1B9798302437179F16C103E5BD5F7018C1D811738C56CFE7 + FF24CD0B33D16A6A8FE79C35910C126A89139F222BB8F18601FE2ED85160AE6F + 21ED9CEA710FB7C2B36119FB9E0D25F7BFB74FC26E0C131D27CFC69E36F0BF35 + C9D5D8641CAADC654F3A5B57B7DDD87D206354BCBC1CC5514D10020A4616BCB7 + B268E019072930277DB06CD269004649B88FC550F09A6E02E9218A4DB30A3AD6 + EA99932DB7B7A64386C5F99D90FE468A49DED966B605FF8E67FE41024AFB2D6F + 061F163C27EE3D9B85AB016983BF64E41E56DF65377170A849B1F4B79B367D72 + 0202D755A5B075DC94F94184E8B42D2F245866ACAAB92B39EC31E3B0141DEF6F + 51DEE7CE3012054DC7F890940E0985C9D84391E11D8F43F0E27D649FA8D818DB + 9D9423E1411481DD5C14996594C73DD4A5F19ABC2A2B02A7F217497868D97F34 + 37887808DB032AEADF49E4C27530532095BEDEA905A3D5FFC71A7A1B0AFA088D + 097F92B0776DD30726D10254E832BA9E538921474FCB4621CB613CA41FB0B853 + DEB954AF15F7F77367D27CFD2A9E680F3744B83DB97E2C140ABF78C78C336949 + 4106355ABFE75E840F1231E91FC6A95BACEB5E65A802E57848974F2675E26C94 + FD346D6A5509FF90897B6C0460E958B78438B07C0A29565B612CA960CE4F2FB9 + 800C428660794F50D97B2B8F3B5CB2CD28DCA37C94B504ACA6112278A942BF25 + D9F74E31EE38BB5D77665116C02BCECAAB86A8F6A0466A2DD00E50E6A5237392 + 91D6A24B3295044A1FADF65C539E99528E7E093E7EF8C5ABD62C082C71A7C923 + 09C3B0FA75501DDB7812EFF0CD9F4DA6B5BFF2A381AEFA8C9C8870C734B33413 + A4506C8E4686FB61F81DDC79DD6C7E1B8A7520ABECBD9F3DE378ED00C82DFC99 + 6069FD07DCF31576430A568E6367202091988C492F480A7A21D2158A16DC6239 + 4DED495E264E08FA4E33F9D02946A87069F1209D57915BC27C1FF824EDDBCEE8 + FF29E68AF3CC3CAD7D5426854B724B0A3A33D9498F312B6B6079F393137D3F8E + 6051BF90F891A9499014944256DAE843B0425ACD6FE716C73F056BDF19CC1007 + 8B00E1DA39FC4ED9075439786B2F60447E3B547BF25E314411AA8CBE828A7632 + FA2B544AA1399125E75C4175BF8886D96731A976248CE642CAF55F4E8E85A5E7 + 035CE00B8B3604E50493973B85F89EC1D4586FAEB17DAFEEF3AF53F0617D9D17 + 6B74A082FB4612042C018D5D7CD18C83B421BBF7AB0CDB14169A66600AD05822 + 5B4086872A6CC4FAA2E3579B6A30ED4BAC5AC81B91DD9EC469E814E75660DCBD + 21343C59C714D5EDC4B9AC11BAB7EE5B3CF522E5B3EBFB2E0919A68CE8D88384 + EFFCB3DD5EBD526F9F6D3A6755298821CF76610498528B4DF43F4263FDA6BBA6 + F179C51FE729528363338E3E6CE7EDAD20DB289820D1D7A353015403226FC56C + 476F9BBC7D5F3B5CC3FB28016A5E92FA7E9DC8BA73C9E6F34659607E27EA3586 + 6649E766BD2B208D12763C526D199BBADB93664696783770603A955C7681F9DA + E7D86843AFA4ADBF73A676BD8CDA95CF2C6811FE8F4A14CD334E09687180CEE9 + F4037458904C2C93DF2CEF3CBACFF6055325C7179C62B6E0FCFE31DBCE1B735B + 03832BEBE267BEE502F20A3D04F34FB08B54005D58888DAB9F08F4F936005607 + 10A04C00B66D374F09E3088CC8207C8CB7F3645FFDD036112101FBC6C745A6EF + E2DA0DB5E6EFAD90C8C34DEE078F7BAF6DD7821712D06DE543681AFEC14FB0C0 + F8AF70C308111E7142F1505928E22CE9605D852CF031A7754208CB4EF57D1B53 + C5B6F108944C91F7B5521800282BEB4F0E32C91BD240A9F0A3AC63E75802ADD5 + 4A4EEBBA4382C4D34286F16A3615FCBFF51AD248AA90D51A2C7C868844EE5421 + 197CD9D2EAD1C94DDFC4BA70F6E16C1A245CA4F10AB6198DA06584BE179FF8EB + C10B9F4A39DED4AFB07B28805DBCC129E3500254B8709E3E700268668E7708F1 + E742337AA71A7494A3BC9ACDF2EBA48E2EC0A98684078B7CD1F2CE8BD4D462CD + D4A0E2F423CA825544AA74283B6ECEF6B50E77AF2B7C2B69A92FF6CC27221BAF + 81D3CB29A7C53E59ED661C100FEA80DB71DFC653D8C4C76040482AACADEA52B0 + C480C594726F86A5201DBC2C121EE5E770BADBAD38A1BC8F52FF3B768B247DEE + 9E1CC2A210DF37ADB3C353D026D64FB2BA7AC5F62C044A5A5E072DD882DB0676 + 073507AC931FA6351159F3211580CF4BE434BA35D23ADFFFCDBFB11F3000E5BD + FB002D4F7A766A3CBB8998F06CF7769D000F6CAC211C84 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTI12 + %!PS-AdobeFont-1.1: CMTI12 1.0 + %%CreationDate: 1991 Aug 18 21:06:53 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTI12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMTI12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 35 /numbersign put + dup 45 /hyphen put + dup 48 /zero put + dup 50 /two put + dup 53 /five put + dup 54 /six put + dup 56 /eight put + dup 67 /C put + dup 68 /D put + dup 73 /I put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 97 /a put + dup 99 /c put + dup 101 /e put + dup 104 /h put + dup 105 /i put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 116 /t put + dup 117 /u put + readonly def + /FontBBox{-36 -251 1103 750}readonly def + /UniqueID 5000829 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 + 525003F3DBE5BF07B2E83E66B7F97DDD7CE0EEB75A78BD9227BF359D002B6ADB + 8AC57A33FED4EF021A7085B1E2B933DE602F0FF71467ECD501744AE338AF29A0 + 26F7D368AC6F25CCB882DB7B7343566192BD687E1349225982823027D3B66703 + 3B0DB7A7E680A682B98023D39C7FAE81A5D5B867A0A66C8AA0DBC83B1596A84F + 0436AC6A7900B767BDCCE0060A4811003C79FDCC71D73F7F2D0A6675E93AD21A + 56B4CD8EF75EED3DE8C0A18BEBF7B9D1BE72504872D56EDB272F1E97FC726CB6 + 68C85C713059DA19F6C2E0F3E12710A59B6FC4699AE883DE8C8615B7292AC25C + D5714B6CFB14EF0EF11EB13009BEBA4F345A5D3D6D9926ABC2BAD7DB1328651E + 437BFB3C46DA7B62219660FC368CF3D3704DAD3AB461C28F711665BF484BF61C + 052093D231CA65618EA463D63E406ECE858D180A6C0589B2FEDC321371C28E77 + DE974D655DF5FF7D41ED01FE717D928A885F6FA6CFE4D2C0807F8E7F937916E0 + 96EDD1A3BA67802B1F4A49100E75613BA0356D9DCBBAD4DAB3C59E70A47058F5 + 2163D1730F0EE4D1F87C3A4AE723A23CFD7986FC4FBD399347E9F5946354E013 + D860FC446AFF0B0744F5DA27CC777C96ADB388D1E835DDCBE123FB517679B9B7 + EE5A3DDDCD392415AF58CE22EA55B7F47031138C6F27798B40F7E18FDD315912 + BE99F33ADE0FDD538A8A3E5DE58AF68A54732AE69F188F3F7E0458D848205648 + CBE820C287ADC2394520F03BBB97DB893F6A12154B1B7F8626D35CE6B70F8524 + CB128DE87821A0E32F1E825F6C50AE8B4BE37FAA3183BA4D678E896CC7E61CC9 + D0226FC38B9CAE0939D19149D987979B96A86EB69A105807AB426639292FF5FB + EFF0817FCFD5E511DB918155ABB0EEDF64BF194578912F04C1E6481ACC945E65 + 9228F999FFE7B2EDBF0DD2187EF47CBFC6999635595BCE24DB9A83A91635EAC6 + 7604133474E3ECAF5EE13EC8A7E39292582797266C1719A07F9CE673DB36B9AB + ADE41610E08954053510CD1968B38174EAB3981BFED78FA5CEE0FED4FC70A3A2 + 990EC6CD152614F29774A711EBE0781FB9E303894DFFDDAC80E43F346793F440 + 6F8F775C7F56397CC2626C162B0788B567B53C0116E97094F622954E5272CFDE + 92C5191A9EB6EA54B70A8540B6AC97F3D05CE45EF71741F1A1123CBA1AE9BC4B + 627F1B67923DFE264280F28C3E9885EC0D1F47953FF033AF2CC8AF89BD0C7FA4 + DC741AB48E0DCC231838787C42E078CA06096D705DB765D238937BEEC239291D + 5EBD007757992F812A2385DC5DEAF65C82F0A93E2E28BC5E29E8D0B52558860B + 6DE323742660F367AA9E105096605DE619646CC6EC1B2CAFCAB0757AE41F8844 + 6AF68A720626C3376664E6CB6F5C353AA653435A20D36832DB1F173FD9B043D9 + 57335706A371EB7F89CB7D85624D722679D1C582F51153F903A5BB3AE6171161 + E86591D7ECB2A9BF41837A965BD2D6A113CAFD127E3C2541457EDD4EC248CD02 + 6324DA6E84E72548F6BF80A5D8E8304C54100CA636ABFD42A34D590B76E9D58F + 0CB932FE39ED3EA3DDF4B0B2B6C0D30D62CECD86E65ED4BAA326C15C234A7914 + 726B68C1099C2AE4FD14E8B28449405CF9B4B4F18923FD3B64AADB409B6FD459 + 5FE3CB5F7CC5FDDDE946BBFF70A7A7562A35B847FDF681F5701551004C3EA502 + 506D444249960EDFFDE1A68BAC1C79057685BAA30726E584033EE711041AB22B + A24C64DA4FA6D8E05AEC8F80E142A0F8EC4C659A3D7CB35F9640C86E87C26EFA + CC3D58CC0D3918387EDFD8BAF5ED5DF2C0B995E58833411F505390B10FEF0C91 + 2E15DACFC59BE08DF76DB44885F5C199CC1AC0D86D7D43599E38CB329E934850 + ED40F67A5093B3180D3485706E6B8D9084C2F6B6BBF2EFBED0D6088DDEEFB113 + D100E76FE7A6285599C5AE76F87B859B7FF448A988CD7083F7A23284B4AB0D6D + 5DFB52D73BFDADF3D56DB7E53C28B5FFAB7B5D8FBCF87EEB4572CE4917798034 + 21916D9C042E8F4A0ABD02CC4683BC926B549CB47256F96996BD3A524B61DCCA + 181D2D1DE74E917FF178CD1E5531C52EC0B25116BCBB4F3737230995BEE5EA90 + 7423BA89C81A97E42868845A8E1153AD3AD074BD7FB9F94A17612FAFE62218A3 + 2FF4A0A24F559678F0E5D9D49604A2E96D0465B20DE99095C922D0D962FCB7A7 + 99DE337EAFE5566D91B0564387C3014229328BA2D3590B73B932263AB0A0599E + FFD4301B315E8FFDD45835A542C8507F2AF4CB9691841855BC670198D12DDE99 + E169A726977F82787D611E941C3CFB2249520752A70D91176FA31CDCA2586F62 + 4BDD1EB37F192342C09B2EE8FD195C68DDFAA8BD142D1AED701ACEE0D9DFE83A + 0AFBFEF9CA8DF9194AC6C1A0FC71786240A29C5F96629B70A49527876BCF0B35 + 8466E6FDC3632EEE16C98E184CC3FCC3016C96BBE4150BFD6FB5CDA2840EF627 + 8231211E54D996A7420C807300C14C2845DCFE69AC62A2FF2EFF98BA27F0C90C + 9D21A398ECE09A3AE2EE703A513CB45325F547A5DA88CFFB8B8AA2A1CC3A5E69 + A24CB7E76C3FCD83CB91EF2EB842252FA9ED114550556C4EA7E32FEE80E14EA5 + C16977819F9401D668E50778F72FCAE6A3F5BC5CD91FB071669A6842519E2C8B + 5D208BE50C8CF59D4C130424E1F39F7AF67D22BC36CBC81540F58A423C955552 + ED7AE6892421CDBCA7ABA4124324FED5C92FC5C91A6490FEBD1533096ABD2F6E + 1C9628BB4271E58331558257399FFA127C322D85B6A68D10159DC2421B638BFA + A5C7F8D9DC44253E6EC6A1863D50F47671D21B00F1D1019B461E0D02C87C4627 + 30AF40A96EFC1BFAF77018F9B281534EBC22953C9DF54059D9E2D15F277F7A3D + 8C86274C1F2F540EC41DD091D1DDE2FBBFD193F6502C91424E31AB1CD7B31593 + A081DFA4F1BEDF7CEC739F85B48A8612841CC4EC3E64EE55AE2EE9C79EC45F4B + 20DC37B2C678E057F16A6DD8B0437E4F8429EC9065870299B5439909916D87D7 + C6BD0085388289EE9C5F29119CE25A11A7A5E4824E6CABA8AFE53D7EBB58E114 + B9226F2578ECD4F39FAE9B3E7D8374B867F3D68344F2A39D6EDAC449A064722C + 50EB4BCD98D554F4B55F725E658D0F066A120521B025AB14233EE0B9C23B290D + A580343DAA4C4A1FFC797B092255F335ACEEDC37375BA12E6B279250A47562E9 + 8336331BF59F7E964CA399AB606811A22B034D5AEE0149B26259FD235A2DD82C + 066E3578318785F0D51AA619832D240795A47930E5A106AD8EAB7C31714C380A + 5DABAF13F09FA8318CAD9A5EC28E008CB8337E5930AA7002AEE13D826C733582 + 68EF1F1147A2B10D9E2293E77A3CE28A914C752F8C47678E1DBC1DF43C047B84 + 98A56826B238AC542F508D32ECF1CA14475C3A1230D3C642135F6A9DCC8B6478 + 64640D3E7B7FE34C17880D9E16A3928E8CDF8CFBF662D9A502E90760A03AE58A + F005D9C86045B97BED0149715B634571415CEB9C32BB38AAC03B2E1C640C438F + 85D5099A3FB43B5D86E32C5354284BBCD019D97317AAC986E6511745A08A3E99 + 51CE136AC4066F9265BFCF31A564B139E0FB03C6D8F6B3BC07E9C4CFA5B4D2AE + 98538A6753C356D06E2A78D00F6D1CE8E61C7519B560DF56080B07158B2EB2A3 + 9FD6CCADEA4BF52B93DEBEB71D97F8B3AAF99C5BD0806D797D80BB59643A356A + 6D13B8E4823B2C1B9641F4B9BA473CBD4FE351C18956A48E40D185132F0E7A24 + 0FC9F3E656477A95884CB8A46B719AB0CF0F9B302E91DD6563824729CDAE283A + 3B9CEEACDC5EC8221FCE9BDDCCC5B8503B9112216D1A748AA2BAF462BA4C0F31 + 7C529AABB8E979159DB0F7229FE24B8028B40882E824BCFE7048FD11B11591A0 + 3DB170097C185C6385E4A1CDF8C340CC998295BE2469D5E8FEFBDA6C803746D6 + AC45CA6EBD26DEADE9AC96110EA5C8922CED83D84C14DB1B3857007C5E6EFCB6 + 7909DE79E13FA2F5C68D0014727D7D3CDBFE034B9563512F3F4867DEAFFC6643 + 877D0A0700985F4F7E3CC0FA8E2C02B95E34ABFB78369A7FAF2F359B9F9725F6 + 7942F0557AA17C3C123E2FB00C4FC273323B83AF08C28AAF206D8F4F91218A63 + E116B468B427D0BCC71C105EF535C9D748FB5BCE02390E6B0869D362DC46FD6C + 8E1E528082668E9338F23C721D293BF8A58385D53AB410F5E7E82AC797E24066 + 0ACAFD99CE969832EF0B595439F7277A9EF60531F656EABA5112A79798E4C481 + 03062BB8309B6393007BE51037C26D44FF97C0C0FE581DE9CCC76ED3636D02BF + 87E128FA9E91633D417CF959726746FAB09617353C822027553591EC9C50F9AA + DED7B90B5C9129B6E574AF8DBFCC71E424C44FB4851B884F797B843E3A73EDE3 + A28FAD790A360810187D5DDD45F479E8D71FF32F2730640877550B44DA3B0481 + D2411D798DE05F48972F8A48E11A52065F7DB5CF15FB12C00C0739169AF8D48B + DBD3D640787230FDFF5F9C402ACD71E401A3553A550710AAEF152969CBD08669 + 8793EF2F62466D05DF5E71376065DEF7D3BF4865921CFF62246D516244221712 + 2D2FA82F274D8EC34FD04692B994886D5A16DC6D5D97C7CCF6235ABEE39BB606 + 5583F1C41593EBF8EF4C0C0F5E2F8098C99279A34A5498F1D5C50D37019CCBDB + 8BDB000496E5E6E9078E9419D07267D0E2B96393245F98D77936B1B3AA9A1E0D + 296FE328EC13B8EDAAAEA8900C33D0E41EE527B3C5CE2134D41EA5E278C00DB1 + 689A586685AB318CC54B7C53282FEC1638A03BC9102C43E81F4AD5D0447A8757 + F2BC4F74B9093149083D67507BD7D53B0D51963325957F18F5F95AE7C3E7B071 + 8F130A31B20305B0C0EC2CFCFFF1D44545F3EC772011A6F2C1BDA51D0CB26E56 + F68959D09849C8DC5DFC85E62D40391EDAA923E20AE9738AAB399D3B946BDA3C + 372305A6239E1EB998250789C94705738198B0EC1A71DC5FC3A1E6E6A3BB6BD4 + 86D3CDB8EB7C6A471E911413C47BCE350BB275966C0B42C195905AC0A5C31CA1 + 3BEA18A92440F1E249D4C9C8F4945DFD7CA6FFB226581D0667032433FDD2165A + 0908E1990C221CF8705DB2D93FE6C26C341A11CB0F2CAF0AFCA1F7886BD267BD + B150615DD5480BC4CA5DE20DCE6BD6EF2B26482E6501B49DD5A8A7E8CFD3A222 + CCA685FFA66CBB8BBDB78E67AA8780BD8295E95234CC72B1F70A4CFF63478FBE + 1AE9818597139CDAC19D12698F7E831C9CB74B0D0AB28BC8357E6ADFD8FE7044 + 5FE68106A29B7A0BCEF5FBFBF4F5A8E398570C5CC013C089D308AC5F5CD08602 + 5C639513474F437B63994C36072442DC743E2686A23B3F309FCE1C887E8FE6A1 + 4A23F600F08184C88C16E40F182F03AC3E3656414B231C524D0E56B732E4ED1A + FD8B5156C4DE57CAD87708B27EC124F30F40CFF62F84D6F4CC2440E592041806 + 1F8BE1C4B94ADEE228E7A62D4B4A2046ED7C6216DDB741C30B69DF939DEDAE67 + 8F35EE93CB8D54E3FCACE7B9A5AE82D20124899C5D221432CB3958DA9012523B + 4518C9A4D9859D3998928604ED559BAEFC5B773C32AAAB16C03AB1DF40EB3FF5 + C06CC0914061C3944760C646B33FDDD6367D24ABC69B9569E1C3BCD2E80B753B + A578A49FFD6CA770EF52CACFA5E711A0498C0104C38E2F740D2E7608AA4C6A88 + 4858C946FC5134FA376A80575B3D6320A73B7FF6E38849DDFBE44774E8CF7E2B + FD0F3C6E1706FB748F5B1D93F6CFC7543F18150576B996792C6E83A33EB3B433 + 953B2346AF6F6D402863CAD4380BB5D35073967A56CE98978D07EECF91269207 + 7F27A0C0406535402571E61E3CA9949806F3AE939C60A93F07A7BF9F7B89E55F + 966D55722B858EB1711CEB3949E9611CE69112521522315F2D3F28F72885C0B1 + 058CABAA19B87799BE8ECBB602461C6A20042961A39FC5D046FE26133EE291EF + 2B10155275D19990924C5675A1ACD8859D25E69058D244FEFB880F792235486E + 2A35B85B96646A3388395230F1986D102E68C1CA160F50CA9BAB5ADD19444A12 + 1373D7237AED18B9C4910D00B884CBF64D66C6678C24A15C69D536FE14DA5513 + 7C0D5D213B7A3CDBAC554378B74833209463FA3BE8A216D9A27DDBD6EF486E02 + 7258AFA414E913E9AC01CA45F954DAE5304CF034D9FBBD068612A5863D05D5C0 + F23E35C49BAF23D509B658B971EB89D1950015F28F03FAA2EFC58E6A0C1A28FA + 354E42508B0F44100851CBB6B91AA2260BF402080E64670D22A407B9AE64679D + 6B4B8938DB140A3E84991CBB3F7E3185955C0DCB103135BFAF36DDC756FC0579 + 0198422B7A2AA610AB50A53FFF3E238713A40D8D9484A205A4FBF71BE7910FDE + B606DDAA820175A476CD34F8B9C84FEB458A37F1C42C9019ADEAA71FBECBE189 + 17AC9DFBF045F74D13E23C5DFFC8E385173088F097B9FA818387A60B85388763 + 760FA4B72DD8D938EE2FDA26E912431F6A7FC6E15F983C57576CDE769EBC990B + 34F2AF9AC5D84EACA0D554F68E3CDFF7E5E574C7C30C9C73D2661A24803B2D10 + 5766A0D3DBB10B8CC98F34F0B44E2D8593D5764497AC4E39583D42185CB000EC + 0C0C0AFC03E7B29E15549E0A3B01E9CE7AFBC165EC28F0D322CABC080983B122 + CBF2CABCE6B4B086B8BDEF74247C319C9FDECC4C47163E16A8F93B0CF4EE4CF6 + 1294174CB57BCFBBA1A22347EF30CEFE2507F5A1FA013883A40E71B2A0D242EE + 54428E6BBF5436F0231D021D641681DFEB2014D7E6BEF151ADDEA8D74AF7C40F + 4C81C65BC0D8B71B094FA077276D4F9C367CB770C88C435CCE0B34CB338168A6 + 60AFB337907562AD10A5DB7B954160DD243AB2E3F734E450FC0EDA95999E8069 + 09B09121A3412517A02DB98DEF6593186A684FC2E24FC869729A2271640B2DB0 + 3264CD46DF759A3D93CF34947B12FB189646F7B26B276C8E5668642821C81F21 + CE30EC33B64D16832A3C19920BA03BA97C666BA433DAC6EE360A14BBBAB0611F + 644D5ADEB8B281C70A9F3BC92AB6094CD4C9C6491BA71F1482572584EF9D68B9 + 2118A98E77E2EA64398FCCDA04563B5900D084FF06890BB62C5BCEEB1DB4CED5 + A1F048D465CBD15D44902514E9D280F77D59296B6C07C9060F3BB99623FD6247 + 7003F94F102C6524E46B8A2AF9585371547EB026787203A62A0A45A2402D4EE3 + F675DA86579BC28B64090B6D97A26A966DE6C0680FF1CE3696A85EA525C66E4B + 7F2DDC93095FC8AD8746EF7C6507553A001E714E24073F76774A9D77A46F8DB5 + CECE1C0E1E36C509498A5EB624E333FFC0EE1C355E3BEA79BB0FFCB5BAA26A5D + 268629341FDCE575F41980AA499320F309E7A0B9326495A2C3FC48BDAA3B3224 + D23F3ED17C06D4EF2E45DF733781419427767B9D5267191610A69391A542D38F + 12C669AD746813A462D6F75DD9DF8A2DFB8F8692D59AF71A36510E4E00D7F987 + 2FB56083103E50BD267610DC6EF0F94F150BDC632D2746C71EF351DADD35B594 + A9FD29660ED5A61E83C7A41BFF2715F2185036D0A7DEA0AFFC51B8484EDB97AC + AC7ADD5671D2E73F004299AD6EED2199C8ED5995FAFD45C77FCCEA936C36CBF9 + 696CB3F1794DCCDE9E9A6E7868F4402A9E3EF60589D303F5A73797757D9ABEDA + 06DECE45BC434E56285804C6CF52374923261121BF39038720CC0C700E1EF8D8 + 1D99C9692084F005D993DA49F5CE5F7BB4C8AA6132EC3C931DBD55694BD4C76F + A7BCF00E690517D08330FA9076FBCB4B8ECA995C1DBDD80EE8BC12474FBADBCF + D56F727C34064C11BFC55C2F21FB75DF3149A81A241C23EF97F0B55E7D0ACB73 + 06FE862BF8A9024EBE209C5419DCCDDF426430E431F96A0B14B2A8CAFBDFE817 + B29B5BDFDCF1615AF5E1D84E575BF9C43A70178266DF9EC1A481F251C289E8DF + F589BDAB9B2A922359AC80DC327D2A46DCE18A11110B1B43AC2836139FC71E2B + 1A233447872128097BE6953A8A34DA7BBA2A525AF3AC1B1331D7D2FB3635940D + DED9FB7CC1A43B7611347CFDE08C532B460B2E85749E0B0F6B0190BFEC37D8A8 + C6C3CD0A1B090277864DA2A0CB268651D284CA1EFC790250AC5EA5CA7AC8411D + 01797B28FEF065C4D7B7DC333F34ADEAD79F0DA5CD249E544D15A0BDA9E19033 + CA0C01F7451DEA89ACEFCAC2B59118392AD87545F14B8083254DC6C966CA634B + EB3FC65B187746CD97C6154C6BD96CEEB14DBD25A5D10FED0700BDEB8A8202A3 + 77AD8BDC4008DA96C5BF3BA9FA617D418F8A376F510544EFAA85413C8A657F84 + 038E090C728D1C4506CE9306C1DB6032D747C8 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR12 + %!PS-AdobeFont-1.1: CMR12 1.0 + %%CreationDate: 1991 Aug 20 16:38:05 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 44 /comma put + dup 45 /hyphen put + dup 48 /zero put + dup 50 /two put + dup 53 /five put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 73 /I put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 80 /P put + dup 83 /S put + dup 85 /U put + dup 86 /V put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 121 /y put + readonly def + /FontBBox{-34 -251 988 750}readonly def + /UniqueID 5000794 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C + 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 + 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E + 59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28 + 51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23 + DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A + AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F + 45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31 + 821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE + 96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D + 9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379 + 26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4 + 140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213 + 1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498 + 1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB + 377D3061A20B1EB98796B8607EECBC699445EAA866C38E02DF59F5EDD378303A + 0733B90E7835C0AAF32BA04F1566D8161EA89CD4D14DDB953F8B910BFC8A7F03 + 5020F55EF8FC2640ADADA156F6CF8F2EB6610F7EE8874A26CBE7CD154469B9F4 + ED76886B3FB679FFDEB59BB6C55AF7087BA48B75EE2FB374B19BCC421A963E15 + FE05ECAAF9EECDF4B2715010A320102E6F8CCAA342FA11532671CB2E1402F6EF + 1C86C12DD93EC6E9E94978D581AE14B1FF467F6E36908DC4D0BEE166931BA22A + 0188D6D236E2BADA81390C318DD7E88C1EBD4B6B9FFA5FFE466F7389C89D7C0A + 25A3BC4B9425D4AB16830BFAE68574A1EE917DC64353DF4974BEC64E9B47501E + 72D049D9051FEBED3F0DEC6BBCEAD42D3FDB18C008FC8E163542C13AE5BE4F9C + CF4092860E9BB7D161078925A98BECDDE080B5E65109D524A1B8F6D3E4C5CC5C + 0027F65449EC212F0DDEFDE7CFBBABC412F0E67688BA826D08EA7BD7DA183ED6 + 224A2B30E0A398C7F1F0EA3E5B5F9988642C6EA645A6F14D177C96D2545A98CF + 04FE9D9EE17CD7BD7BAB2C81DE66CFB6D1E11C014F8730C3A32AB0CB9AA97972 + 5BD09DB4BA6784BBC0786E0582EDEFB5F2EA0BA50C7E72F03858E87DA4E2E201 + 61AACE53E0E4C6490AE794348EDA047B943614419C3ED5DBCF4CA77552F77FCD + AD27BD2CFF1360F89F900CCCB3B986314A9F7F8F02F2B4AC3CAE8276672577E6 + EE39B28407C7E85FED4CDBEEEB6AEA0CDC3099CCE714516176115F600EC35917 + 1B4B2F489D2DB7A502344AABF3C93A4C520D6100CB95AC69C1EE3308D429C73C + 8BBB30BB520EA814144D8796CE89681F03AFF85B40CDB1B6E8C7F30CCE3F3027 + 498224E22BF1356D3E5EDE1D8C10C89D5E29349EA99A977682A1A8EEB02A3C3F + A0FD42244CFFF34695E3339E463A178AE333A92B9BD1844CD3C7E4EA5B28AD0C + 98DDF0B09625AE7D51114AA27BD31548A89D8D5D3442430067DDB2A0043B48BB + 8FE583010160CD498AE3D4658AEB6365A76CD66804C46A5F3AEF86ECB5EB07A9 + 597AAA4531F453CCE5225C4728E5526C76E3C542E83F3954A3075AFF55CB070C + F8A1D31C4900F461DA678938773014EBD528E2CD09ECDB62A9C8A1DF9B9CCC0D + 394A363801CBF61093D7D869F0DE45BEAA6EE6F7E93AE71F2ECE2219A10C9AA9 + 10A041909EB86B985AD05059F6B56F5C099BDE19F5AAD5F2600119DB3C29957E + A1D2B503B2C7B5E6B46797BE4230212F1B0CC8F2B205854FF8AC764CD044C221 + F4954477947D8261180CED360777A6727888CF64B8EAB6A1C4D88471949D2A31 + 17C5924A4B50D9017F42537F41AA3FB3803DF09A09400C68D8BC3BEE8CCB826A + ED0AF92BCBBC4DAF4BAAD270764AF494C4998EEB4AA97091381DBFFBFDC47274 + 6347F55FD2F6CD16FD6C5224C9B2321B2118A6422B62383EA271599469B97254 + F827B8DA58C7E97409982D3BDD3EBD6F80023E4D901A7ECF810825F6AF338DEB + A6CA98C4722C15E2AB0C95B365DB6BDE1DE6692E76BA9ED7A0712652D125EFF4 + 7EB67529D0109DA8D80F3FB5268DDD2ADD5134B18D2A86DFF7EC7FDFED6566BB + 1CA65616117E08A8D7DAB9AB40A521EF6C614495CEAEE23C907D1CD076DD7B24 + CCC92D4362962096886593D40564B4E51BF12CFFB07541299934354DF51CADC9 + AAFFCFF05F6F2C990E7A7A9212EADB3E33F37D69901393DB28F7A5822EEA21D5 + A0968E1626616D4F4220EF5A9178677C9012AB51967DF7ED5C87869AA6F613DA + 15B867F28893E9383A6613513609518A1768E5122F8FCC784FDBB98DA02A6083 + 2E23CC4E6ECBC95C8EE67986B7925ED9B23883C128AB3522125ACFB5305AC05E + FA4B4FCD0E079C3B7C9BCB2726448F52267262E451F7C0B0FA4B61C28A905469 + F798E6169673A47501E53494CE686558092BD2769DE3765D418E3EAD35099638 + 11A20903F15234CAF9E8E4C0D9534485C6D8FB6FBF448B8929319136DCA709F9 + 84710E5D36C5CD580E2191602ED3F97F37A17305B4A4E208C952592BB4E3DF2E + 89D5B2E441613EDFF8E0B34781A34D938D56954574140C11422DD14A0B499CB3 + D269D359D49DA5ACDBF02B2E33BBF9E91A940979DFF66BE6F0153549433D0C22 + F42C2E444B609E0B36DCE517E5998B20993D01EAC6FE6948B7AFCA4ADCBFE42E + 4D114AD9432FDBBB8167109C771EF53EFF640AB8EFF2F309FE761D9E681E76EF + 7E80264BF3F8676CF423C116B87F75C7886ED164285960FDB17AF8B13655D809 + BBAB1066420E14ED4C315B92F800447E96899C0358B54DE947FD4C7F2CCC14C3 + D2B95101BEB6CAA183A7B571302AFDBA1EF54AA1CAC1DA7F3DEB295CF128F0F4 + 0605444816BA3799C85009B7086E04C87EB5E47C231C2E585197FBCA0329EB56 + 23F988DC22EC981FE9A1718A15AD275AA41D4F4B5014580D0808C0EAC01F66A7 + F852B1B1F2B52A686012532902BD4DA63A5E4540961F2930EA2979B6CD0E194D + F3111D6E116366314C3D669C2C877989704F3E2A422D2E940DA8A19E09AEC667 + 2819F78B3943D34DE02E2CCD26BF39FEA56430EB0A34B96B9D2EA138CE232857 + 76E583C98B086C8340EB51BBD8364CE547637D669CB4B36433D3F00EC5CB10BF + 3EEADC6E77C9F3E452187D79450F5B43CBEBA892F1DB4AA455981454B9DFD865 + 9BBBC43B971508FCFBF10C5FEBF675228F2E41870698A1FB8AE8DF2B0BE64CEA + 6EB58792566FD1BFAF00819925746E321093BE40A7125F3642117F9385BFC0AE + 8B51A6C6908CB281261F51BC9B49FCE1A96A64C3834062AAA4E27057F4631E3D + 4E4F263B5BB2B28E805E33F7B2AC9BFEDAC38AB803B11E985587E4D668B893C5 + C11A0F030D4037FADE85067309D696E999A2F353C15095CA78AE53CFC2F907E7 + 47E4BB92BB426132695F13ABE9918EDCD7F96FCE715394449D136D0CB01C6279 + C86A8DAE9D8392F13CAA02AAC8F898FB18DB882EAE67F442408A3EFC3165F7C2 + 0D93467A3F94F03DFD5E311A9188B84BFE46930A174A2B326AF269C010A9857C + E1401CE05D2D11F7010AC6F81D6B794C7FD676510677A9A27BE6D0F4D9A62BC7 + 1D7A8FFFB3D80ADAEC9A5B1E27067B284D38474177A913F95B2EF119B54936A0 + F3B27FCCEBF073357E21DA0BA7618359DC6F695D49D21E73353E89E0386E1763 + 47B117B7D6272C2C8B61AE25FBC7DE68898C2CC5972D888CBCFF7564E2C9815B + 26CCFE00A3D8B8711C54265C9280DA64188965C791E21760F99958B6E6ADFC99 + AE70EA5CC6EDDB3A8F410062F8A21B265C3B2EF9DE8793B1543351590E452239 + 1FCEC953BF8655EDDC7878D61BD269B0590FFDB566FE94AD5AD7529D4921F90B + 5D20A45E5AC223141A171B785D98B89EC58A1307BD5CEAD33C92DCF1A526A53E + D66C69069872672860BF17EBC5EAB7FB3CCBC8B569BD61051CF404A60EC10026 + A4C0E94DC3330A1C061F49059C057D8899500DFCDBFF5B7186B7ACEC7E58244F + 430A0B91B5161D2E82B5E96B7EBF675EFA09957E3D55A70F2A04B734706C6329 + CF67B4735BCF348881A194F7CB77D1138CFA207579235B6DDDCD30AEA23483A7 + 348B63EEE817ECD2431A6C421F1A17911FCA52C775170F7ADE54293869DD9C3D + D75563D1F4B12C8FB5BD8853FB0C40FBB5A51A35276AB22080E4996A5D6CD2C6 + ECA304326CABB017DE9885324F98653104FFF0605DEA92B9BDF1DE9118E3B7F4 + B0298B2B2204EDB8E58F742F9F75AFB7F38B3A297DEAB70BF02F14DFF5772AD3 + 315221008D8545DA6813B1F1E60045A6587E1D027375CDC0B6D5AD1B457F8F9A + D9DD14E55B4ABB30ED4D2ABF2D5CFEB8AACD5B98E84A75F5A3E8913B75B9FE0B + AF735543C0DE0EBF515D7EC1435EC9CB3F09D28D65B19A502BCBA789B2BE40F5 + 289A70BBD8C3DA58026F5F05FD75979C383C33E975506487995558EA4805BE46 + BB2EA3736C81B4BB5558DAAECBCE09031A34C5150B0BFF99C93D1E7A75C44017 + A6245C34A1F5E2C32109EA75FA835916503A3A4C645550C2897A08A8BD703133 + 7932B703FC95AE8D3EDA9AEE005EDAE7C4FE2462E628C2708946BF9D09B1082D + 6A00D6B284CA91A30407259DAEB4A3AD19EAE7CD3A779D6694063336419951E7 + C4F1585D87805175EA0C0A11003DE5434EC3938896EF66B525B4A1BCF38CC481 + 1CC468505D61BA5B940162EC8A9A6AE9ADF9C8388C300C940AB240C0E21B7F6A + C7425F7B266E65E6DAC0FB2AC9DACFB67A317BD369EC524B5FB6A8FF4E29BF07 + FAA26C20C002C53EFCC103D679A99B2058E8F5181D4946C93C78A6DE2642D0A2 + 160D3683238F5B182F4093C2CCB04E44A41DE88A5486A4DDDA0FD9CA77FA778B + 4AA264B112E5F3A953858881453E1829C845BA6CE960E8271178E4B2CD50A9B5 + ADA494F6E6775E0908BE9538A47ABF92ED718EB9F31BE89C805847D619859622 + 8FBD7AC9A1BE287B1306CBA76EC24D22A38F5E533987CB649343F3E31CB1954C + D7A3CEA631498ED15B7458ED251596887E4A92C302B463274A275ADEA4F01C8E + 4253B34D01D6FAFAC43B97AA974323D1A8DBD321B7CD3C4905C149A7F071E23E + DB39F894E4B322C1B32B6918F9F4EB1E0F1B3B921B6CDAB5CF77721E6E688D1B + 08B5E2AD3359631FBC16B088B102031ADFAFF8ED683101848AF5D34C1C8C649E + 67C43BF4AA1A0A4929570ADCE927B33A47882885F89CA7FC061444CC38D1E2E8 + 809E35BFA8AF7D45B601E06F72D53E2A6FFB57C9BBCB717E24D6DFAC3882B45F + F8D53C383602323532E94D4E2765DC6DA46BD210232C0921882B3F2082EC9F1E + CACCD5EBCB76D3B1F2CC759340FE663FBEE7DAF23AC902A2CA9B9A1F16C45B2A + 6C9762FD3A66D00DB98F1076031079B5C759A3A440F03EFE35DB16FC94FB2D3A + 4431C412FDF70596CE92CA2FC397CEB0A6C05B26324F5312E3422AA8CA076EC8 + 30EDC6644BD8C7983111364A7E31FF0D0A50D35A0A80F2197A35A62F2F489706 + 898A5ADFDEC52A5CAA368F342F5BE5D52EA8BF5CB5D29B540B737E39CA9884C3 + 7747B54B08DB9C7EC9C0203D11C02B9DD71C2DD30F6B855AC9EF56A2AB737B19 + 9E07928C5EA34E9B186D7EA46F54CEA0161ECBB2A1CD4865181BC905C47F6171 + 056A4BE84E5FDC76865137DA765E29E30840268F3CD0941551465D961F050583 + C2E7C2F8F93CAD819E8C078D6F5AC49B770B982EEF000A7A1DA187CECB8DFAD7 + B5D4A070639B613DA5FA51B2DFDD640CE9D57F1EB0E499C593D54A9AC975E02B + 1F43029CF6D8426371C7B48B1DBD2109F57DF9A7C23790E7F7DD88FFB0DBEA6D + 952278B318399BA0A2C3DE06F829DE9F9035BD2C447D7515CE7B82284DDF7019 + EB21AA0BB5EB0BEBF291EE3A5ED77AB58F306A696A120E4B3BECDE4283E55B50 + 3CA468B26A7E10F5AC83B9B664E781CA927C695CD484E6A12D39C02E829B77DB + 6F86E7AAED789AFEEC69FE87A46B4C8AC4B22E0518E667FB1E1BAA502D33A8F6 + 63D683D5163EEE3150B6E731224F8DDB955B26872DD78278A9D5E238BAC6419F + 9735E3CFDEED9FB3C43822076C8DEE246DC5F786775FEC6B8BA305C1E8F0C5E6 + CDCA72F051FBD4F2DC468FF1CD079243F15D8A24345F5C645A4D133F7EE4F872 + 9F960F7543D9E729D5FF85260CD821F6B516A8BBEC036532EEBD08F62FAC1BFA + CED9A54CF4E72640431D1129073F1D651A9D23DEA8849FDB1F1EF0FC006CBC64 + 5EC956952FA928284F089C0087F0856318D3AD96AF5C8D2ED009287D1CCFA16D + 20CF06B172F5E29327216AC656855B401F349EB06A7F8A9C85E4F43BD796A9B5 + B16597974912D55F8BE4CC8DE1BA8022F8E94DBAD1E545A8A682FBB0A0408718 + 1D4E7F499307CCEDD93420142055B4D1F6D85F7415D8248347F9DCA1A15CA676 + 3BA892681E80F2BFFD677AAB83859604C2AC3EF31E8942541E509EC4343D5671 + E6560E620277E673EF38B6260ADA4790739B87A556B7B1D37BA153C083C286D8 + 2E930B012E9E2B2B22B38949E47459B5977A6B7447BC05DB28BEEFE9E478511F + B5725438249EC494A49B75FE5FB0F2FE2322BA48932399D139F5CDF9C655E2D3 + B66387D8FF6FDF3ECB403E9D6C4D985FD89E8D0D3D52B837D3920D6881292AA5 + ADCBD354FD0C7CABF8DD85B0693EDE808FAE7B105D469BEF5AC73E9597959D2C + 4C6A037945895EC3C4336A3A848E92F81D1FBF7C225A4B2F5A0A7F9397F1A901 + 692CC522352BB072D9DCD3CD757C2A36628FAAFEE3C255B3CE6089586D1FF41C + 6539C3C5497D38288D24855A7BA85BCE4B404B852C94B124828BE125BA9BBB65 + 7AB04CC7A4357D603757942C1EEF2EF91AFAE0877912B462F0A1503CD940189F + D007405657980E6D8EA0C97A1E3397BF567257AA486A85BDDDA1A42470889D01 + 540B7EDE87734B57F72DC85CFC565439030ED10CB2E3F00992DF2A288C33D43C + 6FE9006CDAF7C0C64AF893DD77A0A58D4EA82DB336A5D6AC5C39E94BB3287515 + 1E2ECCA79FE69EE7DEA30F183C48A67B600954D60DA3E3E2B7A479D62F394939 + C60F297E3379DE0A893C78F413FBC4C88C29610CE22CD82F53A33ADE3164168B + E1CB8F648D269BDDF32B817E2D899A3116CC22DF822F1C16DE43DBC8AA61306B + 607910E7196EF2B985A50EA17846850CAD638ED6703AACA1A5368F23D1738984 + 7821161E394F1475AE981C0EADDC1D1A96A3ABC40B648A447CD7EE54FE43645B + 798A1441327803A0D9DBCE0C9C44C6ECB79EEA39E4B67F49900EC5CDADA5E383 + AAC2AFD0342FC832172546961C6A14E689C77A9E8AD8D2BF192429DB9402C7AE + F289C04B571E563428ED5E4D674285E9B03337C1F7AB5FC42A6662019676B717 + C0A397A11FC9F6075C21CCEF52520B301FECF68FF77B85F2C1F4DE5148AA83F8 + B2C9C3126637DA537BD68BA809DEEB63B1365B0D2E6AA28DA5BD42FE3408E838 + F853C77AD0B0EE459CCA1225B4AD607829D8A8C48425B315590246F1E2D102FB + 67D0300E6CFB657E068FD289C4BEB404D2AE4D81FB468F478A3BF6A3D99AE294 + 5762AF631463301949E653F1FBB198BFAB8E99A8863BFF7C2E9C789AAECEB7C3 + D31F8B691E85450A266294F8B4B0C20C24F678F06701F280B1B439CF9346F0FA + CDEFFED8714304EB4F24BAD7DCB1F2C92D4CC3FE109769E47E0FAED549A4A6A5 + 96E215F362960EA7C354A061F527D2904B6CB70FA5C6F88AACF8314C8A05B90C + 1A46CD8641021247826A8D42A4E636F48BEB3F8EBD21EC45DD2072C97F04F50C + B5D6EBCA8CF4DABA533BD3FC91178E5EAF85285EF37145EA0DF1D1D64EF0C8D4 + 0E59135320F1E7CA6F2885C21276C519269D74868F9DBBB8FD8B7C5CB364E387 + 9FC291BFFAB18C3A1E2C09CD85A9DEBD1234D5D8AD0F948BEC4053C8409FDF06 + 8A48CDB192FE9F8A408C9CF9333A5317CF85A9477A0EA2FCC21C4BBC4711E9F4 + 46BC9BC211119FFE3DFB49A2B9FD4FF0FDB9D71975CFD26F1EEFC89CCD04EF4C + 3ABBFC5C483080C823672B0DC14AC028F4AA8A1CCDC1BEB15A432640744E9FAE + 210A6CB05AFCB0AE3FBAFBCF5C2EEDFEF9CEC38F4D3231D8081BDF626D34836C + FA12A87DFC7C372689B828A0B87208D3F671DEA588214F55036879489909A448 + A51D990A8FEB82EA5F02C0EEF4CC059C9C208728B19ECA9F49D3B5689BC248A8 + 0DB3BCD587B514133CF049D430E8C9F58274EDA709376BAC0E6FDD459AF3F9C2 + EE2950159217F56AD4C6C4AEEDD3C6A75335CCF5902EA83DC7881669025959AB + D73464297406DF3C5ACDBD94699FC69C59FBDEBCBB5EAD6AF42B94EEFEC61E1B + 3820EE074B3ADF65157C34EEE65CBE26B55522B4B50A8EAFAB0D7222D5A3CAC3 + D12FEA970B82FD687725516DCB453FB2E2943C367F6CB4DD525ED6FDFB68DDDD + 7283AAFECF26DE754C24391BA039F5DBA09EE4D67B0F11B5CA368EBD2BC20BEF + 6AE85F89B0650C6C4BFA57F82755AE4D74A5ED011B887C38C7FDDCC1D10A26AF + 52DD75B95AB0AA6C9682995EE9678A34AFA018D5AA15B6DDCBAE1EBF5A2F02DC + 4B0F0AF138CEC21AEEC0235D0265A31671FF4E9276E8A92B6F0F84AE37E40672 + 6103F004A47557C9F4B4CC41A09BDFF3AB3BEB217DE8858A5E41568E692556EF + C91C65F2261769302D6F6484A788EFA33C6C83C7E01A9902819C3DF3A57FC964 + 0653856DD8548ADBB308E724BCF54814C71585BD20B4928D3BFD0C1D9ED053BF + 228F9E41EEBF70FBCC73067A6CF64B3D6926ABC7AF36C3F66A120F3357878BED + 22E356839EE037EFC50BBED8657A0658CF43AD47470FD946C85C06AB06349A6A + 932681F278CCA3CF4A46102AB7C186D790193B3AB5424D591BD4C9652997B847 + 29ED6212856CBCCE14141A11AA0E1DC47840BEEE2129D51BC1A2E7929BA5BE65 + EFB279C99DED7F580FAEB9CEB1A9AFA9BCCBE028DDB0E43A40E246EE93B04748 + 595E50F3EAC08567781786FA9DD3EE4140FC985FB9D854F178CCEA5CAF62C286 + 16452A2E0594942004D55EDD8AF1E9DC5E684B2CC2F78E52D4CE02C243003352 + D31743FAA2D2AC42A7EE87D4A08EB706B969420D8AE00C572C7912FE528B284C + 2B5ABF48FF025865A93E07C02208944D897F70BBE72622351AAC9987DDE7A387 + 3EAF1F9CB2306A1D78296EB4365D0563EDA8715ED20A2A767803636C029F1EE7 + 106A9FD7D46164FAC681472DFC990675A6E687272693A8169A01ED67ED161D77 + 8409C4EC395BFDB9C61B672EA2729AD81397B5ABF71D99C15986BB6AB721D210 + A59D7E37C0A43E50BA5F84EC0D66DD64EFA0A239262D040AE08C913918A4B22F + 3081B55C0C4396DB3EA7EB5FB5E187B0BECAEDF658E5F0E0365DC1058232A973 + AAC9333D81CE61BC99D57AB55CCE9CCE1EDD62174309B0ADE04CF63FAF4D608F + 1E2F73C9379BC49349CEBA8F414DE5167F88DFE5CBC7E3585C750A0356282796 + 599E91968AA256C0BA32B42B6BD1EFE3187B1EA9B9358FABEC03056A099C554D + D767CB4998DB0BF04D28196C45BF6CF9FE95C56709788A3B2B8BB16B461B45C9 + 27E53889F9B910812731F7B27CF3BB82BB58A0D3F85218A470B43DD97975414C + 88512C65104F621C7707FDF0F3AEB30CB307C1D78276513B87D12337F8DFD23A + DC486C5B4534C70C9DE1DFB127D4C864EF521D9DF13E0BF3A265CA3718F6D004 + 1261DF + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR17 + %!PS-AdobeFont-1.1: CMR17 1.0 + %%CreationDate: 1991 Aug 20 16:38:24 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR17) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR17 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 63 /question put + dup 65 /A put + dup 68 /D put + dup 72 /H put + dup 73 /I put + dup 76 /L put + dup 83 /S put + dup 97 /a put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 105 /i put + dup 107 /k put + dup 108 /l put + dup 110 /n put + dup 111 /o put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 119 /w put + dup 121 /y put + dup 122 /z put + readonly def + /FontBBox{-33 -250 945 749}readonly def + /UniqueID 5000795 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F075EA0A10A15B0ED05D5039DA41B32B16E95 + A3CE9725A429B35BAD796912FC328E3A28F96FCADA20A598E247755E7E7FF801 + BDB00E9B9B086BDBE6EDCF841A3EAFC6F5284FED3C634085BA4EE0FC6A026E96 + 96D55575481B007BF93CA452EE3F71D83FAAB3D9DEDD2A8F96C5840EAE5BE5DC + 9322E81DFF5E250DEB386E12A49FC9FBF9B4C25C3283F3CEA74B8278A1B09DA7 + E9AE4FBAAF23EDF5A3E07D39385D521547C3AAAB8EB70549756EBA8EF445AF4A + 497CA924ACCC3DD5456F8E2C7E36946A5BF14E2E959895F7C94F49137256BE46 + 4A238684D52792234869EAE1A6D8ADF4E138B79472D2A90A6CA99E2394CC20CD + 3841733046175B20CEBE372327BF13428EED6A3E2FDF84C2DBA4B0AD584EE9DF + B51828D3B8F385846158C29C9AC3496CB9692DD10219697B2ED4D425C3957FD8 + C4600D76E045C561216EF05D38177243C314877A69A1C22E3BEC611A2EE5A216 + 9B7C264CF6D1839DBBD78A40610F2C0D7C2FE09FFA9822FF55035AD52546970F + 83EED2D30EABB1F303091EBC11A5379B12BB3F405E371519A53EA9D66174ED25 + A2E55463EC71A97BE4C04B39E68112956117C8252DB6FB14AB64534B4BCD568B + 246DB833982B38CDE7268BBF74B6B0C18091E1B1F87D32D66F4DD023D1F10D2A + 7736A960F72AC01F733A11023832CD68FB6288A5977743F781214D8FA9C0C3F7 + 80001321D4397771F728FD9EE57CFE7D9192B887EC883EB1505068261DC40089 + 7B7D2820F06515CD74513521F6397FEAB3AD3572D9A8269430E407E357422461 + 1785FC2782047F4C0339D79B16862D939F3A37F78E4E2174E4FBF132539CB760 + 207999FF86F6A3EBE48EB0A1CA635450FDEEF79EB16D853F3BF4B7AE5DF6AB7E + 8F0B7B8FADECE9C0E48E51C895CA622B99309AD77274A2C57D264C509879A135 + 9C141157B2C6B9A99B9B1ED343CFEF29C5A317ADE88DAA6665AFB0C4E666647F + 2BC0FF19DD1A84499CD2AB08F34E4BAB18D90CBDFA5539E8E6AB51D88A0FF8F5 + F565DF91D941094A145F94CAF56B48CAD01A387D469A514319E0627CAD0FFB5F + 5A2A74AD01281C914111FAE99688E6778FE366626D5409DD2420DA6358C1CE64 + B7C6096753AE843689914680D75B52D04F40711B7CC712B18A87054574425959 + C4CF6F23F194D067F10C7D74FE5392BB30657E6F462E1A765443361571F9A237 + 90936D64EC3C6E0CC920CB3348FE9D13C374C3F662513A1A713B5DEBA9174756 + BCA6B066F354C4E16603B53837AF4D2D339CCCA82CA3B1DDC66099055F49DF22 + F72746F318C112099F55A564E58959E9ED55C5D262A620B313F3CD505FE831B3 + 9BCCDEA3DE43571324F5F55A0339CEEB4183A6DBDC6DD911416E49F279F8B696 + 084BE4B5BEEF49176F4FE2633E3DC1E9C647A64CE6F1D58C851AD69A6A350696 + 5A0D47AA8168AA81A7436598C7A3DBBAB5895E3C40291157DCDD454A3583D2C1 + 3E6A3613B7BFB423CB06CEFFB9540FF0ECDF0F13DB6024DD013BE99435E4CA07 + 797B4ABCD029B20404650539E2C41FCB11F268E1BB55877629A5ACEEB86E2A0F + F2695E6A9EE8574D7262B45FEF33A162D88E31F8BF8D6B278DFF42E7A2B41402 + D323E3B0C5DA447A5C0CA4D3E5ED93B5E48A96C8B86E2C59985B7D366634DD79 + 040FD5F7E44CD9F61F41F240AFE1AF684EB67E1EC700EFADFA3DE21C6EFE1B6B + B8007E33D3E6C296EE138DB14038083CB175013DAB3B5462970F875F7C8BD42C + 10CBF085DCF8901ACA6291F5EA727C85674E3B4EE3C93AEE98CB23B491269EA7 + F42198B0B0203F12EFC3E1E331F2AFC2EE6A75AEB51977C72AE7102A387AEEFE + E877430A15F2CB000A2D9F843A0C97590F8A90D303206640DE19001A58C11C20 + A66CE241DC0203A89E8204A6B51A388AAD480337F935BC9949B3A08692B5C5B4 + 8DC3CA8DD276A21ED7095F760D1B95B81D105F4DD01B13E080BBB5824C815013 + 1B8EE82989B92763791729FEA535971EAEE0F11275E8ED9BCD1352C696193845 + E96014938C250BD941412836EB579522A8226F4FB01E8F8A585C9B97BC05C73D + 5B7E413D7CCF21F34C89BA68155FB821DE0071B663D8F6CDD6A09AF4CBD4D2CE + 4FBD72AC8EADF97B59CAC55C833F6345700BC551A1EEFFFEAB7F802E0D42132B + 215FBC98039C985CBADDA2BE971925362C0342783E96F4656E771E200FA92D84 + DA0C4866E2F472563AE42EAD4C6DC013E42BEFF7FC21AB165A986091D71FD2CB + F9FB7EC7122D204823541435792436014842C7D46E6A246390508BB6625FC92E + B18B7C0289B96072241EBE924310ADC397B2D8306DC8E425DBFBC09161977B7B + FEE3776197A5F502745505E5D936766FC8B925414F8C781BB3E680985ACF684D + 516D55864D984AEE26B69244AD3382CBA2946CB958ACEC212AEF0DD1F0F26E69 + 367400932145614F3BE456BCA0B24FB09E55CBE9D10E97A491D8FA0E19FD7797 + 11D1B0AF75AC5A1A4FC6AE00DA763A13308FAC67571345860500349FE6A5E0D3 + ADE34BB9DCBDD0429308563ED188447402618F1FF21B8400DA7153425E0A9671 + 5F4512E00A33868A9F2B87CFF17BCF50F0C38295CA10E0A5BD5851C88D75DC6A + DE2EF4F7FA1AAA03944FC6FEFFE244C295E2663E632829BAC8C30C54454D0459 + 5028D9F31A6CF02EBC9C9F19B35A37B2F004AA4B4C97CE804E4C5543D1535C12 + AF64DEAE42D535527D73ED67895FC06ABC4AB3B9B0E2B40458E31B6D9ABFCFD7 + 039E632D60100D5DF1F87B9049E4DA8F38F28A9679962F28B68B039710F30146 + 3F44C5665BD7A2A308AA97DC41B0E4946659E0AE9340178974D9C338B687902B + 9E69F35F69B585A7BF0735CAA0CCF8B9BA04BFD88888E602A727A333C0455F80 + DF65C1EDE818BF9B952BFA981F65585ADF1E14AC17532F0887BA9EA3A56BBDAC + 7240DCD5C5096EA391886F33172DF223755287D5A057E5727BA157F6A056FB36 + 59A7224933F40537111511BEA99EF5CB51AA5955DE7DBEAE03FC9650EB4B5C66 + 2E5CD32952D053D8B0BAD24CD1D7E0F7AA847DFD58723305AF4F2005E423B3C3 + C547F8F6419ECA0F07D028EE7CF9B5F431406F9D588F51175764516CDE0D92A8 + B077E0DFF43220D5C02B431E24293C1F66AFD108F285F40197F020954ACEA8E0 + 975F45013D8427695C477010C4E880547667B5C5358331E401CA53A0476B971E + 00ECF86A074512EB727D3201152D19A3D66B75871C4B80CEFA1363E7515366D3 + 5EE60A9E60615C7C3DC1EAA5815A07E1A4054FAE2339E3A58E8061CE45655B7C + EA194828205D49F97519BFD64E0965E838357F1E07266E4D2FCECEBF8F25BE09 + 12B3C4B93CD519E3065C5F70F86CD860B78E775C8611DE90B0D6DA8A3B214DA0 + 2C1FBF44028D9CE72F3AFB98006CED4BAA67F53525650128654AF9CE0325C117 + A4B71FB2DDE7B84E26987B1C86FD55F1C0A9C3E11381EBB5AF43E35D90D5D630 + 647E4C9CE8DD89F6DF6DA4138425C24AE7DB2D90A0591A0F1087CF904987EE59 + 2F3E48725BB6AA262F3F160CE46AD2D4751F3ED3A30F4F64E6F4DD304071B3CA + C64515B1047387ECDE638533E14D62E524FD109C7EAAA5D4E8AF8BB3868B612A + 2E4B0BE1CD58423C615FBAF88AF937097EE2828C8D10CF31EA579E589BE3F88A + 42C2E523657BECE482A25ABA54ADB9856BF1DDF68685497A323A468EA0FEA257 + C7BF3A659828D4382265D4977E32ACB3129AB0DC46850EA20768DF560C50B9C1 + 6ED97E406A0DFA9161109002E5C23C7E1C75114A6E204390C8C5FD302C3F7A07 + 6915EFAD0CB45E3926E9BA160F7E40DAD20CC90DF0EAFAADFCE82C4EBCC92D95 + 15D77D7403955F21EFC148757C9EA7B83932F9CDD98C513B02A45C7D7BA33028 + 81A293A608C0C68F9A16DA6B516FD68438AA08951CD75B3AC5F2642293FC8720 + A4D71B8FCA615350E43FD9E617DF9701827BB1E5F17F823381FB7BA1C37B7E4A + AA6F397A4BC5CEE141D8EA31CE3CB0ACF8FD09E249EB8D5EC00ACECF38C26B7E + 68B3C3D31F30DFEB608242B894FD1FBF0880393E2556EA73C15288C50CC5D6BA + 33E94CB632F5539B93F1647625783012AC0F59C1BEA3DE27360747BC86EEF058 + 9F596395FF356FA479FA14BF14810E62B4063780DA71C061B1DA09D487E37B8B + 59F464FE181D8AEDE2877DC0A943BBA10FF8D87CAC45F49A049D687DCD971DA6 + 648B969359682B3B9D8A7FC70A514F8C184272597C970678E472BB56DD601FC7 + 350EFA22B8222E99338A8C4B1720A741A6349B6B79C59A901AE8A63F175BB124 + 2496C9F01C2A41E43CBA8523D1B91C2C9EBC85DAAC592893C706484507E1F131 + A4A4E75DCFBA2F77B389BAE17E1CA4D63508EBB8B8387CFDB2413564583724D1 + 9240A154463AE162D8344B891987C2264D097C335C78FFF840BE7975E56ADFFD + E96FD65CC05271F73AEF7CEAE0F7F4E999EC167D73A6650E72F5BB01F67C93FC + 70FCA24DFC99FE6A0D4D8185B4C0BAB2B4D379694068F42DF55BC80434807538 + 0A3B4DB1D12564E9166A9D45AD29205D2F49436E3B0DE73DAD2D22B45288F724 + C369C5C78B4F6F7E429D3DEFBF4ED2A10C15D5D78C17C95A8C2F6FFFD27C2A57 + C5B7AC5C3B975AB0011BD4456DCCD5638C19641EDB565AF1940F0BE4F912F5C4 + E3DCA998633FB0E6DF2EFF1F581D68984F7BE03682712A15A34F86F1C3537E87 + FA566DD7123E8FD6AA15B6DDE8C6608E99F81854C0E40D2A1C2169D1E509437D + 01E0148FAC898CBC549EEB3D376228D50D6C48647B397DDD5DB0DB2C5CC637D0 + 5CF659CA5A4EF39B7B6181BEF2BA4BF240192576C0E650FB5E3BD16E0D5A0CCA + 23D56DECEEE63E283902E3E8EE72CC9B16A8173E95D5E1DDE7C4DA8FF2CD64BA + D4788DD75969BACC8C84233447897BDF1547649C7F9164931BB0431F64DCB52B + 69CCA24AB31BBAAC934602B3D8813BFFA68882021BDCC94185A95C4BC395DD51 + CA16456D4AD7E68B1C2700F23E8359BD180113D51F5F15157A9E1D84475CFDE8 + 2E8BDA62C1D31DE99C2907CAB6977CE8FB47C2E4E7B9E350889F84900EB7B27D + BBB9F1598EE8B33922E9D0752DCE4379CFA996F149A0A168EC3774DB0CDE36B3 + B4C889FCD061A5C4D0096386C8D24DA44060144AA2B33D991E1C23ED4EF8D158 + 1A39E22DF19F5A48631AD9F937601E26DAFB9F57F2590F5225946485DB3B1DD9 + 04C008BF09BFE774E054266137A06D0B3F15E8F0371299A580EBFACB30C5A770 + 9E55A0B7C0855236BBA3192134DCEC7BEFA1D4B9DCB3609BCCEF73EB92D2409B + 6CDBD9C7F21325FDC4639A917CEEB9B4D65E73E5FCFB37C669A330D377A07527 + C8635593BB305593767AEB4EE2F8A65A0500FE59DE6B9F980144C71973C5E45F + 019BFB82748604FB8322F24D68A0690181C53D67E6AB9DE15B35F1439BC03B61 + 0358A83547FAD1FA69CC8FD0BEB558717C1B981A24B3B1B0291847A723B8FCE8 + F048E546AA7D63C96D639AF479E354C58DB41C62E870B85E82B5496A3282895F + 0F12D2FD83AD4C2F85C4945862137D0E07080CF540BB082E22A13893DE256046 + 85CEB302972987F83F7EFE42DCE625269C9E1CD3605819591B19CD55724BDEF1 + D49BDB2B3FA0EB54F5C0243342B5DEC26FF55216BB18CF30A5C28F9DC990AFE5 + 3153C08E17ECFD950758568646B38919303898E0C07DC6C25162471F01AB474B + 28F94E42340157F6868A1CB47DAACBF0CA451DF3F6B051908C82C8DE98D4FEF0 + 38F5483D0721C7E34AF121354B5B078FE827BF18E3A0E4057F7CD1F6DE0C5FAA + 509024A708DEB51AB85F274B61463EC4942AF5B85BDF98D138503CE2364BA089 + 2A497FEA0CDDCB148AFAB6F8DB008BA080C0C1E5EE724F1EB945C19FA86DF498 + A0D604F453DD6ACDCAE8853A0F5F84A60D6A36D0676DF7DB401B5486A96F36E9 + D886CFC3DBE41784BCBFCA0436619C6FC537DC9A6F71205375160BEB953A19AA + 88C22009E1ED8C5AFFEAFA958D7801C8E66D16FFC9BE15912F6E931281E91D93 + AFC74B9D2BDF0F733B56E05DA1E876FB5B71C7640A08AF7735AF2CE8B75768D9 + 453E5A10E51310896063C08E7F51FCC83015B1BC8766C340E70C7B9CA8548CC0 + 6A03028935175BC2E3528FE6F847F8ACA7B20C213E41D3FB316567A8C9EB8C01 + EFD47467811EDC7C29CE3BBAA8CFED556DA786653FE9301AD43CA63F8AF1B681 + 739DB308AE0535616152C06FC7B3589B3E8FE1BD6BE3190D90447A3358EC0EBC + 477DD8A0E0141D4409278D2347002DE59D66BFE2D0C6AF066AC01F294CA777D8 + 9A3247CE2918942ED32386DC2B186452501F160E4E862C6247757487E01890A7 + 6AAB39F0EC0D2135578C5CD7931EAE2ABA86F8099A5B59BD49DF324CB9ED5BE5 + A6286615B45CA99AF2D37260232E4039BEC63AAE2105EFC45518A5B2AB26700F + AEEDA68BD8DAB82A65404B3497945CC4DC5EC9E275BC038238D621026C2DF9C7 + AF1BD5857D105A7A2FFB6665FFD213779B49D7B5812F5820BDD49A312EFDF54F + 44494D94DD3888398805FE79B9F8686843B596D255B554C1C6B82A83F1647EFB + 84708B78EDC9313FD07AF9432012524810505DDD23E0C1DC34F840A2F777CE63 + D318D71F70A40FC5 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + TeXDict begin 40258431 52099146 1000 1200 1200 (dsa-evaluation-tr.dvi) + @start /Fa 133[63 74 3[82 51 63 65 1[78 78 86 125 39 + 2[47 1[71 47 71 78 71 1[78 12[110 86 2[104 118 114 138 + 96 2[59 1[119 2[116 110 1[114 18[47 4[63 63 47 39[{}34 + 149.44 /CMTI9 rf /Fb 132[77 68 81 1[111 81 85 60 61 60 + 81 85 77 85 128 43 81 47 43 85 77 47 68 85 68 85 77 3[43 + 1[43 1[115 1[158 115 115 111 85 113 119 105 1[115 141 + 96 1[79 55 115 1[100 1[117 111 109 115 6[43 77 77 77 + 77 77 77 77 77 77 77 1[43 51 43 2[60 60 26[85 13[{}65 + 149.44 /CMR9 rf /Fc 136[95 95 1[95 95 95 1[95 95 95 95 + 95 2[95 95 95 95 95 95 95 95 95 39[95 1[95 1[95 1[95 + 1[95 95 95 95 95 2[95 95 95 40[{}31 181.818 /CMTT10 rf + /Fd 205[71 71 49[{}2 132.835 /CMR8 rf /Fe 153[89 22[139 + 146 1[124 154 1[80 1[143 3[130 8[51 58[{}9 181.818 /CMMI10 + rf /Ff 134[110 3[116 81 82 86 1[116 105 116 174 58 110 + 1[58 116 105 1[96 116 93 1[102 13[116 5[198 126 2[79 + 164 164 2[160 151 1[158 6[58 16[81 81 40[{}30 181.818 + /CMBX10 rf /Fg 134[118 3[125 87 88 92 1[125 112 125 187 + 62 118 1[62 125 112 68 102 125 100 1[109 9[232 1[172 + 156 125 2[153 2[213 5[176 2[172 1[159 169 6[62 112 2[112 + 112 112 112 112 112 2[62 46[{}38 199.253 /CMBX12 rf /Fh + 134[88 84 121 84 98 60 74 77 84 93 93 102 149 46 84 56 + 56 93 84 56 84 93 84 84 93 7[135 1[182 1[135 130 102 + 133 1[123 1[135 163 114 2[70 2[119 123 1[130 1[135 17[93 + 1[65 3[74 74 26[107 102 112 11[{}47 181.818 /CMTI10 rf + /Fi 222[182 15[141 1[91 14[141{}4 181.818 /CMSY10 rf + /Fj 133[81 96 96 131 96 101 71 72 71 96 101 91 101 152 + 51 96 56 51 101 91 56 81 101 81 101 91 51 2[51 91 51 + 3[187 136 136 131 101 134 1[124 141 136 167 114 141 1[66 + 136 143 119 124 139 131 129 136 1[86 1[141 1[51 51 91 + 91 91 91 91 91 91 91 91 91 91 51 61 51 141 91 71 71 51 + 141 2[152 91 51 17[152 152 101 101 106 11[{}83 181.818 + /CMR10 rf /Fk 134[142 1[194 1[149 105 106 110 1[149 134 + 149 224 75 142 1[75 149 134 82 123 149 120 149 131 14[201 + 4[255 3[100 1[211 3[194 191 8[134 134 134 134 134 134 + 134 134 134 134 1[75 90 45[{}39 239.103 /CMBX12 rf /Fl + 134[81 4[55 68 2[85 1[93 136 42 76 1[51 2[51 76 85 76 + 1[85 97[{}14 166.044 /CMTI10 rf /Fm 133[74 88 88 120 + 88 92 65 65 65 88 92 83 92 138 46 88 51 46 92 83 51 74 + 92 74 92 83 9[171 1[125 120 92 2[113 3[104 2[60 1[130 + 108 1[127 120 118 125 6[46 83 83 83 83 83 83 83 83 83 + 83 1[46 55 46 2[65 65 46 26[92 97 11[{}58 166.044 /CMR10 + rf /Fn 137[101 106 74 75 79 2[95 106 159 53 101 1[53 + 106 2[88 106 85 106 93 13[106 3[143 149 1[115 150 1[72 + 1[150 2[146 138 136 144 29[159 35[{}29 166.044 /CMBX10 + rf /Fo 137[103 103 103 103 103 1[103 103 103 103 103 + 103 103 103 103 2[103 103 103 103 103 32[103 13[103 3[103 + 1[103 44[{}23 199.253 /CMTT12 rf /Fp 152[100 100 102[{}2 + 199.253 /CMSY10 rf /Fq 138[105 65 1[82 1[100 100 110 + 159 50 2[60 100 2[90 1[90 1[100 11[145 139 110 142 8[75 + 4[147 139 10[100 1[100 100 2[100 1[100 2[70 9[159 35[{}27 + 199.253 /CMTI12 rf /Fr 134[103 1[141 103 108 76 77 76 + 1[108 98 108 163 54 103 60 54 108 98 60 87 108 87 108 + 98 10[146 146 1[108 2[133 1[146 179 122 2[70 5[141 138 + 146 11[98 2[98 1[98 2[65 54 44[{}39 199.253 /CMR12 rf + /Fs 133[117 139 1[192 1[147 102 103 102 2[132 147 1[72 + 139 1[72 1[132 79 117 147 117 1[132 13[147 6[165 2[94 + 199 3[203 2[199 1[124 63[{}25 286.924 /CMR17 rf end + %%EndProlog + %%BeginSetup + %%Feature: *Resolution 1200dpi + TeXDict begin + %%BeginPaperSize: Letter + letter + %%EndPaperSize + end + %%EndSetup + %%Page: 1 1 + TeXDict begin 1 0 bop -115 884 a Fs(Ho)-7 b(w)85 b(Successful)f(Is)j + (Data)e(Structure)e(Analysis)i(in)h(Isolating)e(and)h(Analyzing)2487 + 1327 y(Link)-7 b(ed)85 b(Data)g(Structures?)320 1882 + y Fr(P)-5 b(atric)g(k)63 b(Meredith,)i(Balpreet)g(P)-5 + b(ank)-11 b(a)11 b(j,)63 b(Sw)-5 b(arup)66 b(Saho)5 b(o,)65 + b(Chris)g(Lattner)f(and)i(Vikram)e(Adv)-5 b(e)715 2164 + y Fq(Computer)69 b(Scienc)-10 b(e)67 b(Dep)-10 b(artment)68 + b(T)-15 b(e)-10 b(chnic)g(al)68 b(R)-10 b(ep)g(ort)69 + b(#UIUCDCS-R-2005-2658)2046 2446 y Fr(Univ)-5 b(ersit)g(y)64 + b(of)g(Illinois)i(at)f(Urbana-Champaign)1186 2727 y Fp(f)p + Fo(pmeredit,bpankaj2,ss)o(ah)o(oo)o(2,)o(la)o(tt)o(ne)o(r,v)o(ad)o(ve)o + Fp(g)p Fo(@)o(cs)o(.u)o(iuc)o(.e)o(du)3244 3009 y Fr(No)-5 + b(v)g(em)g(b)5 b(er)64 b(2005)3535 3698 y Fn(Abstract)464 + 4043 y Fm(This)51 b(rep)5 b(ort)50 b(describ)5 b(es)51 + b(a)g(set)f(of)h(exp)5 b(erimen)-5 b(ts)51 b(to)f(ev)-9 + b(aluate)49 b(qualitativ)-5 b(ely)50 b(the)g(e\013ectiv)-5 + b(eness)51 b(of)f(Data)g(Struc-)215 4285 y(ture)56 b(Analysis)h + (\(DSA\))e(in)i(iden)-5 b(tifying)56 b(prop)5 b(erties)57 + b(of)f(a)g(program's)i(data)e(structures.)78 b(W)-14 + b(e)56 b(man)-5 b(ually)58 b(insp)5 b(ected)215 4527 + y(sev)-5 b(eral)46 b(b)5 b(enc)-5 b(hmarks)47 b(to)f(iden)-5 + b(tify)46 b(link)-5 b(ed)47 b(data)f(structures)h(and)g(their)f(prop)5 + b(erties,)48 b(and)f(compared)g(these)f(against)215 4768 + y(the)58 b(results)h(pro)5 b(duced)59 b(b)-5 b(y)59 b(DSA.)f(The)h + (prop)5 b(erties)59 b(w)-5 b(e)59 b(considered)g(are)f(those)h(that)f + (w)-5 b(ere)59 b(the)f(primary)h(goals)h(of)215 5010 + y(DSA:)53 b(distinguishing)k(di\013eren)-5 b(t)54 b Fl(kinds)68 + b Fm(of)54 b(data)g(structures,)h(distinct)f Fl(instanc)-8 + b(es)69 b Fm(of)53 b(a)i(particular)f(kind,)h Fl(typ)-8 + b(e)66 b Fm(in-)215 5252 y(formation)52 b(for)f(ob)9 + b(jects)52 b(within)g(an)g(LDS,)g(and)g(information)h(ab)5 + b(out)51 b(the)h Fl(lifetime)65 b Fm(of)52 b(suc)-5 b(h)53 + b(ob)9 b(jects)52 b(\(particularly)-14 b(,)215 5494 y(those)58 + b(lo)5 b(cal)57 b(to)h(a)g(function)g(rather)f(than)h(global\).)82 + b(W)-14 b(e)58 b(de\014ne)g(a)g(set)g(of)g(metrics)g(for)g(the)f(DS)h + (graphs)h(computed)215 5735 y(b)-5 b(y)55 b(DSA)g(that)g(w)-5 + b(e)56 b(use)g(to)f(summarize)h(our)g(results)g(concisely)g(for)f(eac) + -5 b(h)56 b(b)5 b(enc)-5 b(hmark.)74 b(The)56 b(results)g(of)f(the)g + (study)215 5977 y(are)g(summarized)i(in)e(the)g(last)h(section.)-240 + 6613 y Fk(1)269 b(In)-7 b(tro)7 b(duction)-240 7067 y + Fj(The)78 b(algorithm)e(called)h(Data)g(Structure)h(Analysis)f(\(DSA\)) + g(b)-5 b(y)78 b(Lattner)f(and)h(Adv)-5 b(e)78 b([4])f(is)h(designed)e + (to)i(iden)-5 b(tify)-240 7341 y(and)74 b(isolate)e(instances)g(of)h + (link)-5 b(ed)73 b(data)g(structures)g(\(LDS\),)f(their)h(lifetimes,)h + (and)g(in)-5 b(ternal)72 b(structural)h(and)h(t)-5 b(yp)5 + b(e)-240 7615 y(information,)56 b(but)h(not)h(to)f(pro)-5 + b(v)g(e)58 b(shap)5 b(e)58 b(prop)5 b(erties.)78 b(In)57 + b(particular,)g(our)h(goal)f(has)h(b)5 b(een)58 b(to)f(dev)-5 + b(elop)57 b(an)h(algorithm)-240 7889 y(that)68 b(is)g(v)-5 + b(ery)69 b(fast)e(in)i(practice)e(\(sacri\014cing)g(analysis)g(p)5 + b(o)-5 b(w)g(er)69 b(where)g(necessary\))e(and)i(also)f(is)g(designed)f + (to)i(handle)-240 8163 y(c)-5 b(hallenging)64 b(practical)h(issues)g + (faced)h(b)-5 b(y)66 b(pro)5 b(duction)66 b(compilers,)f(including)g + (incomplete)f(and)i(non-t)-5 b(yp)5 b(e-safe)64 b(pro-)-240 + 8437 y(grams,)59 b(reuse)i(of)f(data)g(structure)g(manipulation)e + (functions)h(for)h(separate)g(LDS)g(instances,)f(and)h(complex)f + (features)-240 8711 y(of)h(C)h(and)g(C++.)42 8985 y(Because)46 + b(our)h(algorithm)f(trades)g(o\013)h(analysis)f(precision)f(for)i(sp)5 + b(eed)47 b(in)f(sev)-5 b(eral)46 b(imp)5 b(ortan)-5 b(t)46 + b(w)-5 b(a)g(ys,)49 b(it)d(is)h(imp)5 b(ortan)-5 b(t)-240 + 9259 y(to)89 b(ev)-10 b(aluate)88 b(sp)5 b(eci\014cally)87 + b(ho)-5 b(w)89 b(successful)e(the)i(algorithm)f(is)g(in)h(extracting)f + (the)h(relev)-10 b(an)-5 b(t)88 b(prop)5 b(erties)89 + b(of)f(data)-240 9533 y(structures.)79 b(The)61 b(four)f(ma)10 + b(jor)60 b(prop)5 b(erties)60 b(of)g(data)g(structures)f(DSA)i(aims)e + (to)i(extract)e(include:)33 9956 y Fi(\017)91 b Fj(distinct)58 + b Fh(kinds)76 b Fj(of)60 b(data)g(structures;)33 10379 + y Fi(\017)91 b Fj(distinct)58 b Fh(instanc)-9 b(es)76 + b Fj(of)60 b(a)g(particular)g(kind;)33 10803 y Fi(\017)91 + b Fh(typ)-9 b(e)74 b Fj(information)58 b(for)i(ob)10 + b(jects)60 b(within)f(a)i(link)-5 b(ed)59 b(data)h(structure;)g(and) + 3855 11672 y(1)p eop end + %%Page: 2 2 + TeXDict begin 2 1 bop 33 77 a Fi(\017)91 b Fj(the)63 + b Fh(lifetime)77 b Fj(of)63 b(suc)-5 b(h)64 b(ob)10 b(jects)63 + b(\(particularly)-15 b(,)62 b(to)i(distinguish)d(ob)10 + b(jects)63 b(that)g(are)h(lo)5 b(cal)63 b(to)h(a)g(function)e(rather) + 215 351 y(than)e(global\).)42 774 y(Unfortunately)-15 + b(,)58 b(ev)-10 b(aluating)57 b Fh(quantitatively)76 + b Fj(whether)59 b(DSA)g(actually)f(iden)-5 b(ti\014ed)57 + b(\\logical)h(data)g(structures")g(in)-240 1048 y(programs)i(is)g + (di\016cult)f(for)h(t)-5 b(w)g(o)60 b(reasons:)33 1472 + y Fi(\017)91 b Fj(First,)59 b(the)h(notion)g(of)h(what)g(is)f(a)h(data) + f(structure)g(is)h(somewhat)e(sub)10 b(jectiv)-5 b(e.)80 + b(Complex,)59 b(p)5 b(oin)-5 b(ter-based)59 b(data)215 + 1745 y(structures)e(are)h(hierarc)-5 b(hical,)56 b(e.g.,)h(an)h(arra)-5 + b(y)59 b(of)f(trees)f(of)h(link)-5 b(ed-lists.)76 b(F)-15 + b(urthermore,)57 b(man)-5 b(y)58 b(sub-structures)215 + 2019 y(can)43 b(b)5 b(e)44 b(in)-5 b(terconnected)43 + b(for)g(inciden)-5 b(tal)42 b(reasons)h(that)h(ma)-5 + b(y)43 b(b)5 b(e)44 b(b)5 b(est)44 b(in)-5 b(terpreted)43 + b(as)g(separate)g(data)h(structures)215 2293 y(if)68 + b(they)i(serv)-5 b(e)69 b(di\013eren)-5 b(t)69 b(purp)5 + b(oses,)71 b(e.g.,)f(when)g(t)-5 b(w)g(o)69 b(unrelated)g(en)-5 + b(tities)67 b(lik)-5 b(e)69 b(a)h(tree)f(and)g(a)h(hash-table)e(are)215 + 2567 y(p)5 b(oin)-5 b(ted)59 b(to)h(b)-5 b(y)61 b(a)f(common)g(global)f + (con)-5 b(tainer)59 b(structure)h(for)h(programming)e(con)-5 + b(v)g(enience.)33 2991 y Fi(\017)91 b Fj(Second,)63 b(w)-5 + b(e)64 b(do)g(not)g(ha)-5 b(v)g(e)63 b(an)h(alternativ)-5 + b(e)62 b(to)5 b(ol)63 b(that)g(can)g(analyze)g(the)h(relev)-10 + b(an)-5 b(t)62 b(prop)5 b(erties)63 b(of)h(data)f(struc-)215 + 3265 y(tures.)77 b(This)52 b(mak)-5 b(es)51 b(it)h(di\016cult)f(to)h + (systematically)d(iden)-5 b(tify)51 b(the)h(data)g(structures)g(in)g + (order)h(to)f(compare)g(ho)-5 b(w)215 3538 y(w)g(ell)59 + b(the)h(algorithm)f(do)5 b(es.)42 3962 y(T)-15 b(o)48 + b(ev)-10 b(aluate)47 b(the)g(algorithm,)i(therefore,)g(w)-5 + b(e)48 b(ha)-5 b(v)g(e)47 b(p)5 b(erformed)47 b(a)h(painstaking)e + Fh(manual)54 b(but)f(p)-9 b(artial)9 b(ly)54 b(qualitative)-240 + 4236 y Fj(exp)5 b(erimen)-5 b(t.)128 b(W)-15 b(e)77 b(man)-5 + b(ually)75 b(insp)5 b(ected)75 b(sev)-5 b(eral)76 b(of)h(our)g(b)5 + b(enc)-5 b(hmarks)76 b(to)h(iden)-5 b(tify)75 b(link)-5 + b(ed)76 b(data)g(structures)g(and)-240 4510 y(their)70 + b(prop)5 b(erties,)72 b(and)f(compared)f(these)f(against)h(the)g + (results)g(pro)5 b(duced)70 b(b)-5 b(y)71 b(DSA.)f(T)-15 + b(o)71 b(address)f(the)h(problem)f(of)-240 4784 y(hierarc)-5 + b(hical)45 b(organization)g(ab)5 b(o)-5 b(v)g(e,)49 b(w)-5 + b(e)46 b(separately)g(considered)f(instances)g(of)h Fh(linke)-9 + b(d)52 b(data)g(structur)-9 b(es)61 b Fj(and)47 b(instances)-240 + 5057 y(of)80 b(iden)-5 b(ti\014able)78 b(sub-data-structures)g(within)i + (the)g(larger)g(structures)f(\(whic)-5 b(h)80 b(w)-5 + b(e)81 b(call)e Fh(lo)-9 b(gic)g(al)82 b(data)i(structur)-9 + b(es)15 b Fj(\).)-240 5331 y(These)60 b(terms)g(are)g(de\014ned)h + (concretely)e(in)h(Section)f(2.3.)42 5605 y(This)46 b(tec)-5 + b(hnical)45 b(rep)5 b(ort)46 b(presen)-5 b(ts)45 b(the)h(detailed)f + (results)g(of)h(this)f(man)-5 b(ual)45 b(exp)5 b(erimen)-5 + b(tal)44 b(study)-15 b(.)75 b(The)47 b(next)f(section)-240 + 5879 y(describ)5 b(es)67 b(the)h(goals)g(of)g(the)g(study)-15 + b(,)70 b(the)e(terminology)e(w)-5 b(e)69 b(use)f(to)g(mak)-5 + b(e)68 b(these)g(goals)f(and)i(our)g(metrics)d(concrete,)-240 + 6153 y(and)g(a)g(set)f(of)g(metrics)f(w)-5 b(e)66 b(de\014ne)g(to)f + (quan)-5 b(tify)64 b(the)i(k)-5 b(ey)65 b(data)h(structure)f(prop)5 + b(erties)65 b(in)g(whic)-5 b(h)66 b(w)-5 b(e)65 b(are)h(in)-5 + b(terested.)-240 6427 y(Section)74 b(3)g(describ)5 b(es)74 + b(our)h(exp)5 b(erimen)-5 b(tal)72 b(metho)5 b(dology)73 + b(and)i(the)g(\014v)-5 b(e)74 b(b)5 b(enc)-5 b(hmarks)74 + b(w)-5 b(e)75 b(use)f(in)h(this)e(w)-5 b(ork.)124 b(The)-240 + 6701 y(follo)-5 b(wing)57 b(\014v)-5 b(e)59 b(sections)e(describ)5 + b(e)57 b(the)i(detailed)e(results)g(for)i(eac)-5 b(h)58 + b(of)h(these)f(\014v)-5 b(e)58 b(b)5 b(enc)-5 b(hmarks.)79 + b(Finally)-15 b(,)57 b(Section)g(10)-240 6975 y(summarizes)h(the)i + (conclusions)f(w)-5 b(e)61 b(arriv)-5 b(e)60 b(at)g(in)g(this)g(w)-5 + b(ork.)-240 7611 y Fk(2)269 b(Goals)91 b(and)f(Metrics)-240 + 8065 y Fj(As)67 b(noted)f(in)g(the)g(In)-5 b(tro)5 b(duction,)66 + b(the)g(broad)h(goal)e(of)h(our)h(exp)5 b(erimen)-5 b(ts)65 + b(is)g(to)i(ev)-10 b(aluate)65 b(ho)-5 b(w)66 b(successful)f(the)h(DSA) + -240 8339 y(algorithm)52 b(is)i(in)g(extracting)f(the)g(prop)5 + b(erties)54 b(of)f(data)h(structures)g(it)f(aims)g(to)h(extract:)76 + b(disjoin)-5 b(t)52 b(instances,)i(lifetime,)-240 8613 + y(and)61 b(t)-5 b(yp)5 b(e)60 b(information.)-240 9150 + y Fg(2.1)225 b(Goals)75 b(of)h(the)e(Study)-240 9541 + y Fj(The)60 b(questions)e(\(corresp)5 b(onding)58 b(to)h(k)-5 + b(ey)59 b(data)h(structure)e(prop)5 b(erties\))59 b(w)-5 + b(e)59 b(considered)g(in)g(this)f(ev)-10 b(aluation)58 + b(include:)-18 9964 y(1.)91 b(W)-15 b(as)84 b(DSA)i(successful)c(at)j + (distinguishing)d(link)-5 b(ed)84 b(data)h(structures)f(\(LDS\))g(of)h + Fh(di\013er)-9 b(ent)86 b(kinds)100 b Fj(\(ignoring)215 + 10238 y(distinct)72 b(instances)g(of)h(a)h(particular)f(kind\)?)120 + b(F)-15 b(or)74 b(example,)h(a)f(program)g(that)f(creates)g(t)-5 + b(w)g(o)74 b(similar)e(link)-5 b(ed)215 10512 y(lists)82 + b(and)i(three)g(similar)f(binary)h(trees,)89 b(w)-5 b(ould)84 + b(DSA)h(distinguish)d(the)i(lists)e(from)i(the)g(trees?)151 + b(A)85 b(simple)215 10786 y(t)-5 b(yp)5 b(e-based)51 + b(analysis)g(is)h(su\016cien)-5 b(t)51 b(in)i(a)g(strongly)f(t)-5 + b(yp)5 b(ed)52 b(language)g(but)h(not)f(in)h(C.)g(This)f(requires)g + (su\016cien)-5 b(tly)215 11060 y(precise)70 b(memory)g(disam)-5 + b(biguation)68 b(so)j(that)f(ob)10 b(jects)70 b(of)g(di\013eren)-5 + b(t)71 b(t)-5 b(yp)5 b(es)70 b(are)h(not)g(incorrectly)e(aliased,)j + (and)3855 11672 y(2)p eop end + %%Page: 3 3 + TeXDict begin 3 2 bop 215 77 a Fj(requires)59 b(inferring)h(accurate)f + (t)-5 b(yp)5 b(e)60 b(information)f(from)g(memory)h(op)5 + b(erations)59 b(\(e.g.,)g(ev)-5 b(en)60 b(in)g(the)g(presence)g(of)215 + 351 y(casts\))74 b(so)i(that)f(the)g(\014eld-sensitiv)-5 + b(e)73 b(analysis)h(can)i(capture)f(the)g(in)-5 b(ternal)75 + b(structure)g(of)g(eac)-5 b(h)76 b(kind)f(of)g(data)215 + 625 y(structure.)-18 1048 y(2.)91 b(W)-15 b(as)57 b(DSA)h(successful)d + (at)i(distinguishing)e Fh(disjoint)62 b(instanc)-9 b(es)73 + b Fj(of)57 b(LDS)h(of)f(a)g(particular)g(kind?)79 b(In)-5 + b(terestingly)-15 b(,)215 1322 y(this)59 b(question)g(includes)g(three) + h(distinct)f(cases)h(that)g(require)g(di\013eren)-5 b(t)59 + b(analysis)g(capabilities:)291 1745 y(\(a\))91 b(Distinct)48 + b(instances)g(created)i(at)g(t)-5 b(w)g(o)51 b(di\013eren)-5 + b(t)49 b(places)g(in)h(the)g(program,)i(whether)e(in)g(the)g(same)f + (function)615 2019 y(or)60 b(di\013eren)-5 b(t)60 b(function.)281 + 2360 y(\(b\))91 b(Distinct)46 b(instances)g(created)h(and)h(used)g + (within)f(di\013eren)-5 b(t)47 b(in)-5 b(v)g(o)5 b(cations)46 + b(of)i(the)f(same)h(function)e(\(i.e.,)i(lo)5 b(cal)615 + 2634 y(to)60 b(a)g(function\).)301 2974 y(\(c\))91 b(Distinct)60 + b(instances)h(created)h(\(t)-5 b(ypically)61 b(at)h(one)h(place,)f + (within)f(a)i(lo)5 b(op)62 b(or)h(recursion\))f(and)h(stored)f(in)-5 + b(to)615 3248 y(another)60 b(aggregate)f(structure)h(\(e.g.,)f(an)h + (arra)-5 b(y)61 b(or)g(list)e(of)h(p)5 b(oin)-5 b(ters)59 + b(to)i(the)f(instances\).)215 3671 y(These)d(tend)g(to)g(ha)-5 + b(v)g(e)57 b(di\013eren)-5 b(t)57 b(outcomes)f(b)5 b(ecause)57 + b(the)g(\014rst)g(one)h(requires)e(con)-5 b(text-sensitivit)g(y)-15 + b(,)54 b(the)j(second)215 3945 y(requires)h(accurate)g(lifetime)e + (information,)g(and)j(the)g(third)f(requires)g(\015o)-5 + b(w-sensitivit)g(y)56 b(plus)j(some)e(p)5 b(oten)-5 b(tially)215 + 4219 y(more)50 b(sophisticated)f(analysis)h(suc)-5 b(h)50 + b(as)h(shap)5 b(e)51 b(analysis)f(\(e.g.,)h(for)g(a)g(list)f(of)h + (disjoin)-5 b(t)49 b(lists\),)h(or)i(arra)-5 b(y)51 b(data\015o)-5 + b(w)215 4493 y(analysis)58 b(and)j(dep)5 b(endence)60 + b(analysis)f(\(e.g.,)f(for)i(an)h(arra)-5 b(y)61 b(of)f(disjoin)-5 + b(t)58 b(lists\).)-18 4916 y(3.)91 b(F)-15 b(or)54 b(data)f(structures) + h(whose)g(lifetime)d(is)j(lo)5 b(cal)53 b(to)h(a)g(function,)g(w)-5 + b(as)54 b(DSA)g(successful)e(at)i(pro)-5 b(ving)54 b(the)g(lifetime)215 + 5190 y(is)68 b(lo)5 b(cal?)106 b(More)69 b(broadly)-15 + b(,)70 b(ho)-5 b(w)70 b(man)-5 b(y)68 b(data)h(structures)g(w)-5 + b(ere)69 b(iden)-5 b(ti\014ed)68 b(as)h(lo)5 b(cal)68 + b(vs.)106 b(global?)g(The)69 b(latter)215 5464 y(directly)50 + b(determines)f(the)i(answ)-5 b(er)51 b(to)h(question)e(2\(b\))g(ab)5 + b(o)-5 b(v)g(e,)53 b(b)-5 b(y)51 b(fo)5 b(cusing)50 b(on)i(functions)d + (that)i(are)g(p)5 b(oten)-5 b(tially)215 5738 y(in)g(v)g(ok)g(ed)59 + b(more)h(than)g(once.)-18 6161 y(4.)91 b(W)-15 b(as)59 + b(DSA)i(successful)c(at)j(extracting)f(t)-5 b(yp)5 b(e)60 + b(information)e(for)h(individual)f(DS)j(no)5 b(des)59 + b(within)h(the)f(data)h(struc-)215 6435 y(tures?)158 + b(This)86 b(information)e(enables)i(our)g(\014eld-sensitiv)-5 + b(e)84 b(analysis)h(to)h(trac)-5 b(k)86 b(distinct)f(p)5 + b(oin)-5 b(ter)85 b(\014elds)h(and)215 6709 y(therefore)50 + b(determines)g(whether)h(DSA)g(is)g(able)g(to)g(extract)f(structural)h + (information)e(ab)5 b(out)51 b(eac)-5 b(h)51 b(kind)g(of)f(data)215 + 6983 y(structure.)95 b(F)-15 b(or)65 b(e\016ciency)-15 + b(,)65 b(DSA)h(is)f(\014eld-sensitiv)-5 b(e)63 b(only)i(for)h(DS)g(no)5 + b(des)65 b(where)h(all)f(referenced)g(\014elds)g(of)g(all)215 + 7257 y(ob)10 b(jects)59 b(ha)-5 b(v)g(e)60 b(compatible)e(t)-5 + b(yp)5 b(es.)-240 7794 y Fg(2.2)225 b(Strengths)74 b(and)f(W)-19 + b(eaknesses)77 b(of)e(DSA)-240 8185 y Fj(Understanding)82 + b(the)f(outcomes)g(of)h(these)f(questions)g(requires)h(an)g + (understanding)f(of)h(the)g(basic)f(strengths)g(and)-240 + 8459 y(w)-5 b(eakness)52 b(of)h(the)f(DSA)h(algorithm.)76 + b(W)-15 b(e)53 b(brie\015y)f(summarize)f(these)h(as)h(follo)-5 + b(ws;)53 b(they)f(are)h(explained)f(in)g(more)h(detail)-240 + 8733 y(in)60 b([6,)g(4]:)-240 9007 y Fh(Str)-9 b(engths)-18 + 9430 y Fj(1.)91 b Fh(T)-14 b(yp)-9 b(e)54 b(information)14 + b Fj(:)74 b(Abilit)-5 b(y)47 b(to)i(infer)f(t)-5 b(yp)5 + b(e)49 b(information)e(for)i(sets)f(of)g(ob)10 b(jects)48 + b(\(DS)h(no)5 b(des\).)76 b(Where)49 b(a)-5 b(v)-10 b(ailable,)215 + 9704 y(this)59 b(information)f(also)i(enables)f(\014eld-sensitiv)-5 + b(e)58 b(analysis,)g(i.e.,)g(trac)-5 b(king)60 b(of)g(distinct)f(p)5 + b(oin)-5 b(ter)59 b(\014elds.)-18 10127 y(2.)91 b Fh + (Context-sensitivity)16 b Fj(:)88 b(Abilit)-5 b(y)62 + b(to)h(distinguish)e(heap)j(ob)10 b(jects)62 b(via)h(acyclic)f(call)g + (paths.)89 b(This)64 b(enables)e(distin-)215 10401 y(guishing)h(t)-5 + b(w)g(o)65 b(or)h(more)e(instances)f(in)i(case)g(2\(a\))f(ab)5 + b(o)-5 b(v)g(e,)65 b(and)g(also)g(mak)-5 b(es)64 b(it)g(more)h(lik)-5 + b(ely)63 b(in)i(case)f(2\(b\).)93 b(By)215 10675 y(allo)-5 + b(wing)72 b(more)h(precise)g(memory)f(disam)-5 b(biguation,)74 + b(it)f(can)g(also)g(mak)-5 b(e)73 b(it)g(more)g(lik)-5 + b(ely)72 b(to)h(extract)g(precise)215 10949 y(t)-5 b(yp)5 + b(e)60 b(information)e(or)j(lifetimes.)3855 11672 y(3)p + eop end + %%Page: 4 4 + TeXDict begin 4 3 bop -18 77 a Fj(3.)91 b Fh(Esc)-9 b(ap)g(e)71 + b(information)14 b Fj(:)94 b(Abilit)-5 b(y)66 b(to)h(distinguish)f + (lifetimes)e(of)k(sets)f(of)g(ob)10 b(jects)66 b(\(DS)i(no)5 + b(des\))67 b(via)g(reac)-5 b(habilit)g(y)215 351 y(in)60 + b(the)g(p)5 b(oin)-5 b(ts-to)58 b(graph.)81 b(This)60 + b(enables)f(distinguishing)f(t)-5 b(w)g(o)60 b(or)h(more)f(instances)f + (in)h(case)g(2\(b\))g(ab)5 b(o)-5 b(v)g(e.)-240 774 y + Fh(We)c(aknesses)-18 1198 y Fj(1.)91 b Fh(Flow-insensitivity)16 + b Fj(:)101 b(The)71 b(lac)-5 b(k)70 b(of)g(\015o)-5 b(w-insensitivit)g + (y)68 b(in)i(the)g(basic)g(alias)g(analysis)f(algorithm)g(can)h(lead)g + (to)215 1472 y(imprecision)64 b(in)j(all)e(the)i(goals)f(ab)5 + b(o)-5 b(v)g(e,)67 b(esp)5 b(ecially)65 b(when)i(a)g(single)e(a)i(p)5 + b(oin)-5 b(ter)66 b(is)h(used)f(at)h(di\013eren)-5 b(t)66 + b(places)f(in)215 1745 y(the)h(program)h(to)g(p)5 b(oin)-5 + b(t)66 b(to)h(di\013eren)-5 b(t)66 b(ob)10 b(jects)66 + b(with)h(di\013eren)-5 b(t)66 b(prop)5 b(erties)66 b(\(e.g.,)h(lo)5 + b(cal)65 b(vs.)100 b(global)66 b(lifetimes,)215 2019 + y(di\013eren)-5 b(t)59 b(t)-5 b(yp)5 b(es,)60 b(or)g(distinct)f + (instances\).)78 b(W)-15 b(e)60 b(refer)g(to)h(this)e(as)h + Fh(b)-9 b(asic)64 b(\015ow)h(insensitivity)p Fj(.)215 + 2368 y(Static)57 b(analysis)f(algorithms)g(for)i(data)g(structures)g + (can)g(conceiv)-10 b(ably)56 b(ha)-5 b(v)g(e)58 b(more)g(p)5 + b(o)-5 b(w)g(erful)57 b(capabilities)f(that)215 2642 + y(require)46 b(\015o)-5 b(w)47 b(insensitivit)-5 b(y)44 + b(together)i(with)h(additional)e(analysis)g(features.)75 + b(Tw)-5 b(o)48 b(imp)5 b(ortan)-5 b(t)45 b(ones)i(w)-5 + b(e)47 b(iden)-5 b(tify)215 2916 y(\(based)59 b(partly)h(on)h(our)f + (exp)5 b(erience)60 b(in)g(this)g(study\))f(as)i(lac)-5 + b(king)59 b(in)h(DSA)h(are:)433 3339 y Fi(\017)91 b Fh(No)75 + b(uniqueness)g(information)14 b Fj(:)102 b(W)-15 b(e)72 + b(use)g(this)f(term)g(informally)f(to)i(refer)g(to)f(the)h(k)-5 + b(ey)72 b(\\#1")f(prop)5 b(ert)-5 b(y)615 3613 y(exploited)82 + b(b)-5 b(y)84 b(previous)f(shap)5 b(e)83 b(analysis)g(algorithms)f([7)o + (,)i(2].)150 b(A)84 b(static)e(represen)-5 b(tation)83 + b(of)g(a)h(set)g(of)615 3887 y(dynamic)f(memory)g(ob)10 + b(jects)84 b(\(e.g.,)k(a)d(DS)f(no)5 b(de\))84 b(has)h(this)e(prop)5 + b(ert)-5 b(y)85 b(at)f(a)h(program)f(p)5 b(oin)-5 b(t)84 + b(if)f(ev)-5 b(ery)615 4161 y(dynamic)65 b(memory)h(ob)10 + b(ject)66 b(is)g(guaran)-5 b(teed)66 b(to)g(ha)-5 b(v)g(e)67 + b(at)f(most)g(one)h(incoming)e(p)5 b(oin)-5 b(ter)66 + b(from)g(an)-5 b(y)66 b(other)615 4435 y(memory)59 b(ob)10 + b(ject)60 b(at)g(that)g(program)g(p)5 b(oin)-5 b(t.)433 + 4775 y Fi(\017)91 b Fh(No)d(arr)-9 b(ay)88 b(data\015ow)g(analysis)15 + b Fj(:)133 b(An)-5 b(y)86 b(algorithm)e(that)i(can)f(distinguish)f + (data)i(structures)f(instances)615 5049 y(reac)-5 b(hed)81 + b(from)f(t)-5 b(w)g(o)81 b(distinct)f(arra)-5 b(y)81 + b(elemen)-5 b(ts)80 b(\(in)g(an)i(arra)-5 b(y)81 b(of)g(p)5 + b(oin)-5 b(ters\))80 b(w)-5 b(ould)81 b(generally)f(require)615 + 5323 y(some)59 b(form)h(of)g(arra)-5 b(y)61 b(data\015o)-5 + b(w)60 b(analysis.)-18 5746 y(2.)91 b Fh(Uni\014c)-9 + b(ation)14 b Fj(:)82 b(DSA)62 b(ma)-5 b(y)61 b(merge)g(t)-5 + b(w)g(o)62 b(sets)f(of)g(ob)10 b(jects)60 b(if)h(a)h(particular)e(p)5 + b(oin)-5 b(ter)61 b(v)-10 b(ariable)61 b(or)h(\014eld)f(ma)-5 + b(y)61 b(p)5 b(oin)-5 b(t)215 6020 y(to)74 b(ob)10 b(jects)74 + b(in)h(either)f(set.)123 b(Lik)-5 b(e)74 b(\015o)-5 b(w-sensitivit)g(y) + -15 b(,)75 b(uni\014cation)e(can)i(lead)f(to)h(imprecision)e(in)h(all)g + (the)h(goals)215 6294 y(ab)5 b(o)-5 b(v)g(e.)-18 6718 + y(3.)91 b Fh(Limite)-9 b(d)73 b(c)-9 b(ontext)74 b(sensitivity)h(in)f + (r)-9 b(e)g(cursion)14 b Fj(:)98 b(DSA)71 b(cannot)f(distinguish)e + (distinct)g(heap)j(ob)10 b(jects)69 b(created)g(in)215 + 6992 y(di\013eren)-5 b(t)61 b(function)h(in)-5 b(v)g(o)5 + b(cations)60 b(within)i(a)h(recursiv)-5 b(e)61 b(computation)g(if)h + (those)g(ob)10 b(jects)61 b(in)h(certain)g(cases.)85 + b(F)-15 b(or)215 7265 y(example,)50 b(if)f(ob)10 b(jects)49 + b(created)h(in)f(one)h(in)-5 b(v)g(o)5 b(cation)49 b(are)h(passed)f(as) + h(argumen)-5 b(ts)49 b(to)h(a)g(later)g(recursiv)-5 b(e)49 + b(in)-5 b(v)g(o)5 b(cation)215 7539 y(\(the)48 b(incoming)f(argumen)-5 + b(ts)47 b(to)i(the)f(recursiv)-5 b(e)48 b(function)f(w)-5 + b(ould)49 b(b)5 b(e)48 b(merged)g(with)h(the)f(outgoing)g(argumen)-5 + b(ts)47 b(to)215 7813 y(the)62 b(recursiv)-5 b(e)61 b(call\).)85 + b(This)62 b(is)f(true)i(with)f(either)f(self-recursion)f(or)j(m)-5 + b(utual)61 b(recursion.)85 b(On)63 b(the)f(other)h(hand,)215 + 8087 y(DSA)f Fh(c)-9 b(an)76 b Fj(distinguish)60 b(heap)i(ob)10 + b(jects)61 b(created)h(within)g(an)g(in)-5 b(v)g(o)5 + b(cation)60 b(and)j(only)f(used)g(lo)5 b(cally)60 b(or)j(passed)e(to) + 215 8361 y(\(or)48 b(returned)h(from\))e(only)i(callee)e(functions)g + (outside)g(the)i(strongly)e(connected)h(comp)5 b(onen)-5 + b(t)47 b(of)i(the)f(call)f(graph.)215 8635 y(W)-15 b(e)60 + b(will)f(refer)h(to)h(these)e(as)h Fh(r)-9 b(e)g(cursive)62 + b(ar)-9 b(gument)64 b(obje)-9 b(cts)75 b Fj(and)60 b + Fh(non-r)-9 b(e)g(cursive)63 b(obje)-9 b(cts)74 b Fj(resp)5 + b(ectiv)-5 b(ely)-15 b(.)-240 9171 y Fg(2.3)225 b(T)-19 + b(erminology)-240 9563 y Fj(T)k(o)77 b(mak)-5 b(e)75 + b(our)i(exp)5 b(erimen)-5 b(ts)75 b(and)h(metrics)f(concrete,)k(w)-5 + b(e)77 b(use)f(the)g(follo)-5 b(wing)75 b(terms)h(and)g(de\014nitions.) + 127 b(The)76 b(\014rst)-240 9837 y(t)-5 b(w)g(o)58 b(terms)e(are)i + (de\014ned)g(with)f(resp)5 b(ect)57 b(to)g(data)g(t)-5 + b(yp)5 b(es)57 b(and)h(usage)f(within)g(the)g(program)h(and)g(are)f + (unrelated)g(to)g(the)-240 10111 y(analysis.)-240 10584 + y Ff(Data)70 b(Structure)g(Snapshot)h(\(DSS\))92 b Fj(A)50 + b(set)g(of)f(memory)h(ob)10 b(jects)48 b(at)i(run)-5 + b(time)49 b(that)g(form)h(no)5 b(des)49 b(of)h(a)g(connected)215 + 10858 y(graph,)65 b(where)g(an)g(edge)f(is)g(formed)g(b)-5 + b(y)64 b(a)h(p)5 b(oin)-5 b(ter)64 b(from)g(one)g(ob)10 + b(ject)64 b(elemen)-5 b(t)63 b(to)h(another,)h(and)g(elemen)-5 + b(ts)63 b(of)215 11132 y(individual)72 b(ob)10 b(jects)73 + b(can)h(b)5 b(e)74 b(tra)-5 b(v)g(ersed)74 b(via)f(structure)h(or)g + (arra)-5 b(y)75 b(indexing.)120 b(This)74 b(giv)-5 b(es)73 + b(the)h(k)-5 b(ey)74 b(prop)5 b(ert)-5 b(y)3855 11672 + y(4)p eop end + %%Page: 5 5 + TeXDict begin 5 4 bop 215 77 a Fj(that)54 b(a)g(DSS)h(m)-5 + b(ust)53 b(b)5 b(e)55 b Fh(tr)-9 b(aversable)67 b Fj(via)54 + b(sequences)f(of)i(p)5 b(oin)-5 b(ter)53 b(dereferences)h(and)g + (indexing)g(op)5 b(erations.)77 b(One)215 351 y(DSS)g(can)h(con)-5 + b(tain)77 b(another;)86 b(for)77 b(example,)j(an)e(arra)-5 + b(y)78 b(of)g(binary)f(trees)h(forms)e(a)i(DSS,)g(and)f(so)h(do)5 + b(es)78 b(eac)-5 b(h)215 625 y(individual)58 b(tree)i(\(view)-5 + b(ed)60 b(at)g(a)h(particular)e(p)5 b(oin)-5 b(t)60 b(in)g(an)g + (execution\).)-240 1048 y Ff(Link)-6 b(ed)70 b(Data)g(Structure)h + (\(LDS\))91 b Fj(:)77 b(A)52 b(maximal)e(subset)i(of)f(user-de\014ned)h + (data)f(t)-5 b(yp)5 b(es)52 b(in)g(a)g(program)g(suc)-5 + b(h)52 b(that)215 1322 y(there)k(is)g(some)g(DSS)h(in)g(some)e + (execution)h(that)g(consists)f(of)i(instances)e(of)h(exactly)g(these)g + (t)-5 b(yp)5 b(es)56 b(and)h(a)g(p)5 b(oin)-5 b(ter)215 + 1596 y(edge)60 b(from)g(\014eld)g Fe(O)1592 1623 y Fd(1)1670 + 1596 y Fe(:f)1810 1623 y Fd(1)1949 1596 y Fj(to)h Fe(O)2311 + 1623 y Fd(2)2389 1596 y Fe(:f)2529 1623 y Fd(2)2668 1596 + y Fj(in)g(the)f(DSS)h(corresp)5 b(onds)60 b(to)g(v)-10 + b(alid)59 b(\014elds)h Fe(f)5810 1623 y Fd(1)5950 1596 + y Fj(and)g Fe(f)6392 1623 y Fd(2)6532 1596 y Fj(for)g(the)h(static)e(t) + -5 b(yp)5 b(es)215 1870 y(of)60 b Fe(O)561 1897 y Fd(1)700 + 1870 y Fj(and)g Fe(O)1192 1897 y Fd(2)1271 1870 y Fj(.)215 + 2219 y(This)79 b(giv)-5 b(es)78 b(a)h(precise)g(de\014nition)f(for)h + (the)g(static)f(notion)h(of)g(a)g(data)g(structure.)137 + b(De\014ning)78 b(it)h(in)g(terms)g(of)215 2493 y(dynamic)58 + b(snapshots)g(correctly)g(captures)h(the)g(case)g(of)g(a)g(generic)g + (data)g(t)-5 b(yp)5 b(e)59 b(\(e.g.,)e(a)j(list)d(of)74 + b Fc(void*)61 b Fj(used)e(for)215 2766 y(lists)f(of)i(t)-5 + b(w)g(o)61 b(di\013eren)-5 b(t)59 b(kinds)h(of)g(data)h(t)-5 + b(yp)5 b(es\).)79 b(It)60 b(is)g(also)f(indep)5 b(enden)-5 + b(t)59 b(of)i(an)-5 b(y)60 b(particular)f(analysis.)215 + 3115 y(Unfortunately)-15 b(,)95 b(this)89 b(de\014nition)f(b)-5 + b(y)90 b(itself)e(is)h(not)h(v)-5 b(ery)90 b(useful)f(in)g(practice)g + (b)5 b(ecause)89 b(it)g(is)h(common)e(for)215 3389 y(man)-5 + b(y)66 b(in)-5 b(tuitiv)g(ely)64 b(distinguishable)g(\\logical)h(data)i + (structures")f(to)g(b)5 b(e)67 b(group)5 b(ed)67 b(in)-5 + b(to)67 b(larger)f(structures)g(for)215 3663 y(con)-5 + b(v)g(enience,)51 b(as)h(noted)g(in)g(the)g(In)-5 b(tro)5 + b(duction.)76 b(The)53 b(next)f(term)f(captures)h(these)f(smaller,)h + (logical)f(structures,)215 3937 y(but)46 b(it)f(is)h(less)f(precise)g + (and)h(iden)-5 b(tifying)44 b(them)h(requires)h(some)f(sub)10 + b(jectiv)-5 b(e)44 b(judgemen)-5 b(t)45 b(and)h(w)-5 + b(e)47 b(do)f(it)f(man)-5 b(ually)-15 b(.)-240 4360 y + Ff(Logical)68 b(Data)i(Structure)h(\(Logical)d(DS\))92 + b Fj(:)80 b(A)59 b(minimal)d(subset)i(of)h(user-de\014ned)f(data)g(t)-5 + b(yp)5 b(es)59 b(within)f(an)g(LDS)215 4634 y(that)h(in)-5 + b(tuitiv)g(ely)58 b(serv)-5 b(e)60 b(a)h(single)e(purp)5 + b(ose)60 b(within)g(the)g(input)g(program.)215 4983 y(F)-15 + b(or)69 b(example,)h(if)f(a)g(program)h(creates)e(a)i(hash)f(table)g + (mapping)g(iden)-5 b(ti\014ers)68 b(to)h(binary)g(trees)g(\(and)h(no)f + (other)215 5257 y(data)77 b(t)-5 b(yp)5 b(es)77 b(p)5 + b(oin)-5 b(t)78 b(to)f(the)h(hash)g(table)f(or)h(trees\),)j(the)c(hash) + h(table)f(with)g(the)h(trees)f(w)-5 b(ould)78 b(form)f(a)h(link)-5 + b(ed)215 5531 y(DS,)58 b(while)g(the)g(data)g(t)-5 b(yp)5 + b(es)58 b(forming)f(the)i(hash)f(table)g(and)g(those)g(forming)g(the)g + (tree)g(w)-5 b(ould)59 b(b)5 b(e)58 b(t)-5 b(w)g(o)59 + b(separate)215 5805 y(logical)65 b(DSs.)100 b(Note)67 + b(that)f(the)h(tree)g(ma)-5 b(y)67 b(con)-5 b(tain)66 + b(m)-5 b(ultiple)64 b(no)5 b(de)67 b(t)-5 b(yp)5 b(es)67 + b(and)g(ma)-5 b(y)67 b(still)e(b)5 b(e)67 b(a)g(single)f(logical)215 + 6078 y(DS.)215 6427 y(On)58 b(the)g(other)g(hand,)h(w)-5 + b(e)58 b(often)g(consider)f(a)h(small)f(hierarc)-5 b(h)g(y)-15 + b(,)57 b(e.g.,)g(an)i(arra)-5 b(y)58 b(of)g(trees)g(or)g(a)h(list)e(of) + h(lists,)e(as)i(a)215 6701 y(single)51 b(logical)f(DS)i(if)g(the)g + (arra)-5 b(y)53 b(or)f(the)g(list)f(of)h(lists)f(is)h(the)g(primary)g + (fo)5 b(cus)51 b(of)h(the)g(algorithm.)76 b(Distinguishing)215 + 6975 y(these)59 b(t)-5 b(w)g(o)61 b(kinds)e(of)i(situations)d(is)i(wh) + -5 b(y)60 b(w)-5 b(e)61 b(consider)f(this)f(step)h(sub)10 + b(jectiv)-5 b(e.)42 7448 y(Note)73 b(that)f(the)h(only)f(sub)10 + b(jectiv)-5 b(e)71 b(step)h(here)h(is)f(to)h(iden)-5 + b(tify)71 b(a)h(set)h(of)f(t)-5 b(yp)5 b(es)72 b(that)g(in)-5 + b(tuitiv)g(ely)70 b(serv)-5 b(e)73 b(a)g(\\single)-240 + 7722 y(purp)5 b(ose")67 b(within)g(the)g(program.)102 + b(Once)68 b(that)f(set)g(has)g(b)5 b(een)67 b(iden)-5 + b(ti\014ed,)68 b(the)f(remaining)f(de\014nitions)g(and)i(metrics)-240 + 7996 y(used)60 b(in)g(the)g(study)g(are)h(precise.)42 + 8270 y(T)-15 b(o)55 b(ev)-10 b(aluate)53 b(the)h(prop)5 + b(erties)53 b(of)h(the)g(static)f(analysis,)g(w)-5 b(e)55 + b(m)-5 b(ust)53 b(b)5 b(e)54 b(able)g(to)g(refer)g(to)g + Fh(sets)60 b(of)f(instanc)-9 b(es)70 b Fj(of)54 b(LDSs)-240 + 8544 y(and)76 b(logical)e(DSs)h(distinguished)f(b)-5 + b(y)75 b(the)h(analysis.)124 b(F)-15 b(or)76 b(example,)i(a)d(single)g + (logical)f(DS)h(consisting)f(of)h(a)h(link)-5 b(ed)-240 + 8818 y(list)66 b(data)i(t)-5 b(yp)5 b(e)67 b(ma)-5 b(y)67 + b(b)5 b(e)68 b(represen)-5 b(ted)67 b(b)-5 b(y)68 b(m)-5 + b(ultiple)65 b(DS)j(no)5 b(des)67 b(\(clones)g(of)g(eac)-5 + b(h)67 b(other\))g(in)h(di\013eren)-5 b(t)67 b(functions)f(or)-240 + 9092 y(within)59 b(the)h(same)f(function.)79 b(Tw)-5 + b(o)60 b(distinct)e(DS)j(no)5 b(des)59 b(in)h(the)g(same)f(or)h + (di\013eren)-5 b(t)59 b(functions)g(that)g(are)h(\\complete")-240 + 9366 y(represen)-5 b(t)73 b(disjoin)-5 b(t)72 b(lists)h(b)5 + b(eing)73 b(created)h(in)f(the)h(program.)121 b(Eac)-5 + b(h)73 b(\\complete")f(DS)i(no)5 b(de)74 b(has)g(also)f(b)5 + b(een)74 b(pro)-5 b(v)g(ed)-240 9639 y(lo)5 b(cal,)66 + b(so)g(it)g(pro)-5 b(v)g(es)66 b(that)g(distinct)f(dynamic)g(instances) + f(of)i(the)h(logical)d(DS)j(are)f(created)g(at)g(run-time)f(in)h + (separate)-240 9913 y(in)-5 b(v)g(o)5 b(cations)56 b(of)i(the)g + (function.)78 b(Both)58 b(these)f(situations)f(represen)-5 + b(t)58 b(m)-5 b(ultiple)56 b(instances)g(of)i(a)g(single)f(logical)g + (DS.)g(W)-15 b(e)-240 10187 y(refer)62 b(to)g(eac)-5 + b(h)61 b(suc)-5 b(h)62 b(DS)g(no)5 b(de)62 b(\(in)g(this)f(example\))f + (or)i(set)g(of)g(DS)g(no)5 b(des)61 b(as)h(a)g(\\static)f(data)h + (structure)f(instance")g(of)-240 10461 y(the)f(single)f(logical)g(DS.) + -240 10885 y Ff(Static)70 b(Data)g(Structure)h(Instance)f(\(SDSI\))93 + b Fj(:)100 b(A)72 b(sub-graph)e(of)g(a)h(function's)e(DS)h(graph)h + (whose)g(no)5 b(des)70 b(rep-)215 11158 y(resen)-5 b(t)61 + b(instances)e(of)j(the)f(data)g(t)-5 b(yp)5 b(es)61 b(in)g(a)h(logical) + e(DS,)h(and)h(whose)f(edges)g(correctly)g(capture)g(a)h(sup)5 + b(erset)61 b(of)3855 11672 y(5)p eop end + %%Page: 6 6 + TeXDict begin 6 5 bop 215 77 a Fj(the)64 b(p)5 b(oin)-5 + b(ts-to)63 b(prop)5 b(erties)64 b(b)5 b(et)-5 b(w)g(een)64 + b(those)g(instances,)g(and)h(suc)-5 b(h)64 b(that)g(ev)-5 + b(ery)65 b(DS)g(no)5 b(de)64 b(in)h(the)f(subgraph)h(is)215 + 351 y(complete)58 b(\(no)i(I)h(\015ags\).)215 700 y(Completeness)72 + b(is)i(imp)5 b(ortan)-5 b(t)73 b(for)i(t)-5 b(w)g(o)74 + b(reasons:)108 b(\(a\))74 b(to)h(coun)-5 b(t)74 b(an)h(SDSI)f(only)g + (once,)j(instead)d(of)g(in)g(ev)-5 b(ery)215 973 y(function)70 + b(to)i(whic)-5 b(h)71 b(it)h(is)f(passed)g(or)h(from)g(whic)-5 + b(h)71 b(it)h(is)f(returned;)77 b(and)72 b(\(b\))f(to)h(ensure)g(that)f + (an)-5 b(y)72 b(p)5 b(oten)-5 b(tial)215 1247 y(collapsing)58 + b(of)i(t)-5 b(yp)5 b(e)60 b(information)e(has)j(b)5 b(een)60 + b(considered.)-240 1671 y Ff(Static)70 b(Collection)91 + b Fj(:)84 b(An)63 b(SDSI)f(con)-5 b(taining)61 b(an)i(Arra)-5 + b(y)63 b(no)5 b(de)63 b(\(the)f Ff(A)g Fj(\015ag)h(is)f(set\))g(or)g(a) + h(cycle)f(\(including)e(a)j(self-)215 1945 y(cycle\),)58 + b(or)j(a)g(set)f(of)g(SDSI)g(con)-5 b(taining)59 b(a)i(cycle.)79 + b(An)-5 b(y)61 b Fh(other)80 b Fj(SDSI)60 b(reac)-5 b(hable)60 + b(from)g(a)g(static)f(collection)g(ma)-5 b(y)215 2219 + y(ha)g(v)g(e)68 b(m)-5 b(ultiple)66 b(instances)g(at)i(run-time)f(reac) + -5 b(hable)68 b(from)f(a)i(single)e(instance)g(of)h(the)g(collection.) + 101 b(This)68 b(helps)215 2493 y(iden)-5 b(tify)58 b(case)i(2\(c\))g + (of)g(distinct)e(instances)h(discussed)g(earlier,)g(e.g.,)g(an)i(arra) + -5 b(y)60 b(or)h(list)e(or)i(tree)f(of)g(SDSIs.)-240 + 3029 y Fg(2.4)225 b(Metrics)74 b(for)h(Data)g(Structure)d(Prop)6 + b(erties)-240 3420 y Fj(In)48 b(order)h(to)e(summarize)g(the)h(results) + f(of)h(our)g(study)g(concisely)e(for)i(eac)-5 b(h)48 + b(b)5 b(enc)-5 b(hmark,)50 b(w)-5 b(e)48 b(use)g(the)g(follo)-5 + b(wing)46 b(metrics:)143 3856 y Fe(N)220 b Fi(\021)199 + b Fj(T)-15 b(otal)60 b(n)-5 b(um)g(b)5 b(er)60 b(of)g(SDSI)g(in)h(all)e + (function)g(DS)i(graphs.)154 4238 y Fe(G)212 b Fi(\021)199 + b Fj(Num)-5 b(b)5 b(er)73 b(of)f(SDSI)h(that)f(are)h(global,)h(i.e.,)f + (some)f(no)5 b(de)73 b(in)f(the)g(SDSI)h(is)f(reac)-5 + b(hable)72 b(from)g(a)g(DS)849 4464 y(no)5 b(de)61 b(mark)-5 + b(ed)60 b Ff(G)p Fj(.)164 4847 y Fe(L)221 b Fi(\021)199 + b Fj(Num)-5 b(b)5 b(er)61 b(of)g(SDSI)f(that)g(are)h(not)g(global.)80 + b(Since)60 b(no)5 b(des)61 b(in)f(an)h(SDSI)g(are)g(complete,)d(this)i + (means)849 5073 y(that)g(they)g(are)h(lo)5 b(cal)59 b(to)h(a)h + (function.)79 b(By)60 b(de\014nition,)f Fe(L)50 b Fj(=)h + Fe(N)60 b Fi(\000)41 b Fe(G)p Fj(.)142 5455 y Fe(K)213 + b Fi(\021)199 b Fj(T)-15 b(otal)60 b(n)-5 b(um)g(b)5 + b(er)60 b(of)g Ff(H)g Fj(no)5 b(des)61 b(in)f(all)f(SDSI.)179 + 5837 y Fe(I)250 b Fi(\021)199 b Fj(T)-15 b(otal)58 b(n)-5 + b(um)g(b)5 b(er)59 b(of)f Ff(H)h Fj(no)5 b(des)58 b(in)h(all)f(SDSI)g + (that)g(satisfy)f(the)i(follo)-5 b(wing)57 b(prop)5 b(ert)-5 + b(y:)79 b(there)59 b(are)f(t)-5 b(w)g(o)849 6063 y(or)78 + b(more)g Ff(H)f Fj(no)5 b(des)78 b(in)g(a)f(function's)f(DS)i(graph)g + (ha)-5 b(v)g(e)78 b(iden)-5 b(tical)75 b(t)-5 b(yp)5 + b(es)78 b(represen)-5 b(ting)76 b(disjoin)-5 b(t)849 + 6289 y(instances)59 b(in)h(the)g(same)g(function)f(and)i(no)f(instance) + f(is)h(Collapsed.)154 6671 y Fe(O)216 b Fi(\021)199 b + Fj(Num)-5 b(b)5 b(er)61 b(of)f Ff(H)g Fj(no)5 b(des)60 + b(in)g(all)g(SDSI)g(that)g(are)g(Collapsed.)160 7054 + y(C)218 b Fi(\021)199 b Fj(Num)-5 b(b)5 b(er)57 b(of)g + Ff(H)g Fj(no)5 b(des)57 b(in)g(all)f(SDSI)h(that)g(are)g(reac)-5 + b(hed)57 b(b)-5 b(y)57 b(at)g(least)f(one)h(Collection)e(\(whic)-5 + b(h)57 b(ma)-5 b(y)849 7280 y(b)5 b(e)61 b(the)f(no)5 + b(de)60 b(itself)14 b(\).)42 7657 y(Note)71 b(that)e + Fe(N)20 b Fj(,)73 b Fe(G)d Fj(and)h Fe(L)f Fj(refer)g(to)g(static)f + (instances)f(of)i(logical)f(DSs)h(\(i.e.,)g(SDSI\),)g(whereas)g + Fe(K)13 b Fj(,)73 b Fe(I)14 b Fj(,)72 b Fe(O)k Fj(and)70 + b Fe(C)-240 7931 y Fj(refer)j(to)g(DS)g(no)5 b(des.)119 + b(An)73 b(SDSI)g(ma)-5 b(y)73 b(con)-5 b(tain)72 b(m)-5 + b(ultiple)71 b(DS)j(no)5 b(des.)118 b Fe(I)88 b Fj(iden)-5 + b(ti\014es)71 b(o)5 b(ccurrences)73 b(of)g(case)f(2\(a\).)118 + b Fe(L)-240 8205 y Fj(iden)-5 b(ti\014es)59 b(o)5 b(ccurrences)59 + b(of)h(case)g(2\(b\),)g(and)g Fe(O)66 b Fj(iden)-5 b(ti\014es)58 + b(o)5 b(ccurrences)60 b(of)g(case)g(2\(c\).)-240 8841 + y Fk(3)269 b(Metho)7 b(dology)93 b(and)d(Benc)-7 b(hmarks)-240 + 9303 y Fg(3.1)225 b(Benc)-6 b(hmarks)73 b(Used)j(in)e(the)h(Study)-240 + 9695 y Fj(Because)52 b(of)g(the)h(time)f(and)h(e\013ort)f(required,)i + (w)-5 b(e)53 b(are)g(only)g(able)f(to)h(do)g(this)f(study)g(for)h(a)g + (small)e(n)-5 b(um)g(b)5 b(er)53 b(of)f(mo)5 b(derate)-240 + 9968 y(size)53 b(programs)h(\(smaller)e(programs)i(usually)f(ha)-5 + b(v)g(e)54 b(few)g(in)-5 b(teresting)53 b(data)h(structures)f(and)h + (often)g(only)f(one)i(instance)-240 10242 y(of)62 b(eac)-5 + b(h\).)86 b(W)-15 b(e)63 b(c)-5 b(hose)62 b(mo)5 b(derate-size,)60 + b(p)5 b(oin)-5 b(ter-in)g(tensiv)g(e)59 b(programs)j(that)g(do)h(not)g + (use)f(custom)f(allo)5 b(cators)61 b(\(except)-240 10516 + y(for)76 b(parser,)j(discussed)c(b)5 b(elo)-5 b(w\).)126 + b(Three)77 b(are)f(from)f(Sp)5 b(ecIn)-5 b(t2000:)111 + b Fc(175.vpr)p Fj(,)82 b Fc(197.parser-b)p Fj(,)k Fc(300.twolf)p + Fj(.)131 b(The)-240 10790 y(three)53 b(other)f(programs)h(are)f + Fc(fpgrowth)57 b Fj(\(a)c(small)e(program)h(that)h(has)f(in)-5 + b(teresting)51 b(recursiv)-5 b(e)52 b(b)5 b(eha)-5 b(vior)52 + b(with)h(resp)5 b(ect)-240 11064 y(to)60 b(creation)g(of)g(data)g + (structures,)f Fc(espresso)64 b Fj(and)d Fc(eon)p Fj(.)3855 + 11672 y(6)p eop end + %%Page: 7 7 + TeXDict begin 7 6 bop 42 77 a Fj(Although)58 b Fc(197.parser)k + Fj(uses)57 b(a)h(custom)e(memory)h(allo)5 b(cator,)56 + b(the)i(in)-5 b(terface)56 b(to)h(this)g(allo)5 b(cator)56 + b(is)h(seman)-5 b(tically)-240 351 y(equiv)-10 b(alen)-5 + b(t)53 b(to)h Fc(malloc/free)p Fj(,)61 b(but)55 b(this)e(cannot)i(b)5 + b(e)54 b(inferred)h(ev)-5 b(en)54 b(with)g(\\full")g(con)-5 + b(text-sensitivit)g(y)50 b(\(i.e.,)k(they)g(are)-240 + 625 y(not)67 b(just)f(mallo)5 b(c)66 b(\\wrapp)5 b(ers"\).)100 + b(In)67 b(the)g(original)f(program,)i(virtually)e(all)g(in)-5 + b(teresting)65 b(heap)i(ob)10 b(jects)66 b(are)i(merged)-240 + 899 y(in)-5 b(to)59 b(a)h(single)e(DS)i(no)5 b(de)59 + b(b)5 b(ecause)59 b(of)g(the)h(custom)e(allo)5 b(cator.)79 + b(W)-15 b(e)59 b(c)-5 b(hanged)59 b(the)g(allo)5 b(cation)58 + b(routines)h(in)g(197.parser)-240 1173 y(to)c(call)e(mallo)5 + b(c/free)53 b(directly)g(\(no)-5 b(w)55 b(con)-5 b(text-sensitivit)g(y) + 50 b(is)k(enough!\),)h(yielding)e(the)h Fc(197.parser\(b\))61 + b Fj(b)5 b(enc)-5 b(hmark.)-240 1447 y(Because)59 b(it)h(calls)f(mallo) + 5 b(c)59 b(&)i(free,)f(DSA)h(is)e(able)h(to)g(iden)-5 + b(tify)59 b(man)-5 b(y)60 b(in)-5 b(teresting)58 b(logical)h(data)h + (structures.)-240 1983 y Fg(3.2)225 b(Metho)6 b(dology)-240 + 2374 y Fj(Brie\015y)-15 b(,)59 b(w)-5 b(e)61 b(to)5 b(ok)60 + b(the)g(follo)-5 b(wing)59 b(steps)g(for)i(eac)-5 b(h)60 + b(of)g(the)g(b)5 b(enc)-5 b(hmarks:)-18 2798 y(1.)91 + b(Run)73 b(DSA)i(to)e(construct)g(the)h(\\Complete)e(Bottom-Up")g + (\(CBU\))i(DS)g(graphs.)120 b(W)-15 b(e)74 b(use)f(the)h(CBU)g(graphs) + 215 3072 y(b)5 b(ecause)84 b(these)h(are)h(the)f(most)g(complete)f + (\\summary")g(information)g(for)h(the)h(side-e\013ects)d(of)i(a)h + (function,)215 3346 y(including)54 b(the)i(side-e\013ects)d(of)j(all)f + (its)g(kno)-5 b(wn)56 b(callees.)77 b(This)56 b(graph)g(is)f(the)h + (starting)f(p)5 b(oin)-5 b(t)55 b(for)h(clien)-5 b(t)54 + b(queries,)215 3619 y(including:)433 4043 y Fi(\017)91 + b Fh(A)-5 b(lias)82 b(analysis)15 b Fj(:)116 b(The)78 + b(CBU)g(graphs)g(are)g(inlined)e(top-do)-5 b(wn)77 b(to)h(construct)e + (the)i(TD)g(graph)g(for)g(eac)-5 b(h)615 4317 y(function,)50 + b(whic)-5 b(h)50 b(includes)f(aliasing)g(information)f(for)i(all)f + (callers.)76 b(T)-15 b(ec)-5 b(hnically)-15 b(,)50 b(this)f(top-do)-5 + b(wn)50 b(inlining)615 4591 y(can)59 b(b)5 b(e)60 b(p)5 + b(erformed)59 b(with)g(either)g(the)h(BU)g(or)g(CBU)g(graphs)g(with)f + (iden)-5 b(tical)58 b(results,)g(so)i(w)-5 b(e)60 b(actually)e(do)615 + 4865 y(it)h(with)i(the)f(BU)g(graphs.)80 b(Nev)-5 b(ertheless,)59 + b(the)h(conceptual)f(e\013ect)h(is)g(lik)-5 b(e)59 b(using)h(the)g(CBU) + h(graphs.)433 5205 y Fi(\017)91 b Fh(Inter-pr)-9 b(o)g(c)g(e)g(dur)g + (al)62 b(\(IP\))k(Mo)-9 b(d/R)g(ef)37 b Fj(:)80 b(The)61 + b(CBU)g(graphs)g(of)f(a)g(subset)g(of)g(callees)f(is)h(inlined)f(in)-5 + b(to)60 b(the)g(TD)615 5479 y(graph)77 b(of)g(a)g(caller)f(at)h(a)g + (particular)f(call)g(site)g(to)h(compute)f(the)h(IP)g(Mo)5 + b(d/Ref)76 b(side-e\013ects)f(for)i(those)615 5753 y(callees)58 + b(at)i(that)g(call)g(site.)433 6093 y Fi(\017)91 b Fh(A)-5 + b(utomatic)62 b(Po)-9 b(ol)62 b(A)-5 b(l)9 b(lo)-9 b(c)g(ation)14 + b Fj(:)80 b(This)57 b(transformation)f(tak)-5 b(es)57 + b(the)g(CBU)h(graph)g(as)f(its)f(primary)h(input)g(to)615 + 6367 y(insert)i(p)5 b(o)g(ol)60 b(descriptors)f(and)i(iden)-5 + b(tify)59 b(their)g(lifetimes)f([5)o(].)-18 6790 y(2.)91 + b(W)-15 b(e)55 b(then)h(iden)-5 b(ti\014ed)55 b(all)g(the)h + (\\Complete")e(no)5 b(des)56 b(with)g('H')f(or)i('S')e(mark)-5 + b(ers)56 b(in)f(order)i(to)f(iden)-5 b(tify)54 b(no)5 + b(des)56 b(that)215 7064 y(are)k(p)5 b(oten)-5 b(tial)59 + b(mem)-5 b(b)5 b(ers)59 b(of)h(an)h(SDSI.)-18 7488 y(3.)91 + b(Using)74 b(these)h(no)5 b(des,)78 b(w)-5 b(e)75 b(examined)f(the)h + (data)f(structures)h(in)g(the)f(program)h(source)g(to)g(understand)g + (man)-5 b(y)215 7762 y(prop)5 b(erties)60 b(of)i(these)f(data)g + (structures,)f(including)h(their)g(data)g(t)-5 b(yp)5 + b(es,)61 b(lifetimes)d(\(including)i(iden)-5 b(tifying)59 + b(DSs)215 8035 y(with)75 b(globals)g(p)5 b(oin)-5 b(ting)75 + b(to)h(them\),)i(and)f(the)f(functions)e(where)j(they)e(w)-5 + b(ere)77 b(created)e(and)i(used.)127 b(Although)215 8309 + y(w)-5 b(e)80 b(studied)g(man)-5 b(y)80 b(suc)-5 b(h)80 + b(prop)5 b(erties,)84 b(the)c(sp)5 b(eci\014c)80 b(question)f(w)-5 + b(e)81 b(had)f(to)h(answ)-5 b(er)80 b(for)h(eac)-5 b(h)80 + b(function)f(w)-5 b(as)215 8583 y(whic)g(h)53 b(subsets)g(of)g(the)h + (ab)5 b(o)-5 b(v)g(e)53 b(complete)f(DS)i(no)5 b(des)53 + b(should)g(b)5 b(e)54 b(considered)f(a)h(single)e(logical)g(DS?)i(This) + f(is)g(the)215 8857 y(sub)10 b(jectiv)-5 b(e)58 b(step)i(men)-5 + b(tioned)59 b(earlier.)-18 9281 y(4.)91 b(Iden)-5 b(tify)57 + b(the)i(DS)h(no)5 b(des)59 b(corresp)5 b(onding)58 b(to)h(static)f + (instances)g(of)h(eac)-5 b(h)59 b(suc)-5 b(h)59 b(logical)e(DS.)i(This) + g(iden)-5 b(ti\014es)57 b(the)215 9555 y(SDSI)62 b(in)h(eac)-5 + b(h)63 b(function.)87 b(F)-15 b(or)63 b(example,)f(there)h(are)g(t)-5 + b(w)g(o)63 b(static)f(instances)f(of)i(the)g(Connector)g(struct)f + (logical)215 9828 y(DS)e(in)g(Figure)g(11)g(and)h(also)f(in)g(Figure)f + (13.)-18 10252 y(5.)91 b(Coun)-5 b(t)45 b(the)f(SDSI)h(in)g(all)f + (functions)f(\()p Fe(N)20 b Fj(\))44 b(and)h(the)g(cases)f(of)h(SDSI)f + (or)i(SDSI)e(no)5 b(des)45 b(matc)-5 b(hing)43 b(the)i(other)g(metrics) + 215 10526 y(listed)51 b(previously)-15 b(.)77 b(One)53 + b(k)-5 b(ey)54 b(question)e(w)-5 b(e)53 b(m)-5 b(ust)53 + b(answ)-5 b(er)53 b(in)g(this)g(coun)-5 b(ting)52 b(is)h(this:)75 + b(When)54 b(t)-5 b(w)g(o)53 b(SDSI)g(within)215 10800 + y(a)g(function)f(are)i(iden)-5 b(tical)51 b(in)i(structure,)h(do)g + (they)f(corresp)5 b(ond)53 b(to)g(disjoin)-5 b(t)52 b(instances)g(of)h + (a)g(single)g(logical)e(DS?)215 11074 y(And)j(do)h(they)e(require)h + (con)-5 b(text-sensitivit)g(y)50 b(with)k(heap)g(cloning)f(\(they)h(do) + g(not)g(if)f(the)h(actual)f(allo)5 b(cation)53 b(sites)3855 + 11672 y(7)p eop end + %%Page: 8 8 + TeXDict begin 8 7 bop 215 77 a Fj(are)50 b(distinct)f(for)h(the)g(t)-5 + b(w)g(o)51 b(SDSI\).)e(In)h(all)g(cases,)h(w)-5 b(e)50 + b(ha)-5 b(v)g(e)51 b(encoun)-5 b(tered,)51 b(the)f(answ)-5 + b(er)50 b(to)h(b)5 b(oth)50 b(these)g(questions)215 351 + y(is)59 b(\\)p Fh(Y)-14 b(es)15 b Fj(".)-240 981 y Fk(4)269 + b(Results)89 b(for)i(fpgro)-7 b(wth)-240 1443 y Fg(4.1)225 + b(Summary:)-240 1835 y Fj(This)46 b(is)f(a)h(sp)5 b(eci\014c)45 + b(implemen)-5 b(tation)43 b(of)i(fpgro)-5 b(wth)46 b(algorithm)e([3],)k + (whic)-5 b(h)45 b(is)h(one)g(of)f(the)h(most)f(e\016cien)-5 + b(t)44 b(algorithms)g(to)-240 2108 y(mine)62 b(frequen)-5 + b(t-itemset)59 b(using)j(divide-and-conquer)f(strategy)-15 + b(.)87 b(This)62 b(algorithm)f(uses)i(man)-5 b(y)62 b(instances)f(of)i + (sp)5 b(ecial)-240 2382 y(tree)58 b(data)f(structures)g(called)g + (FP-tree.)78 b(This)58 b(implemen)-5 b(tation)54 b(has)k(634)g(lines)e + (of)i(co)5 b(de,)57 b(544)h(memory)f(instructions)-240 + 2656 y(in)j(LL)-20 b(VM)60 b(represen)-5 b(tation)59 + b(and)h(1)h(strongly)e(connected)h(comp)5 b(onen)-5 b(t)59 + b(in)h(the)g(call)g(graph.)-240 3186 y Fg(4.2)225 b(Data)74 + b(Structures:)p 1444 3496 4913 7 v 1444 8413 7 4918 v + 1500 8364 a @beginspecial 177 @llx 441 @lly 456 @urx + 721 @ury 2880 @rwi @setspecial + %%BeginDocument: Figures/fptree.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 177 441 456 721 + %%HiResBoundingBox: 177.340234 441.340234 455.539453 720.019531 + %................................. + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/11/29 00:16:35 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{<j#+eD at B*KFenAF5!)t!.PIso'1qtoj] + huE]5s8W-!s8W+)J,`f(df2u=0"im&;W05 at fLhh@9W/BR#'C-[651Q>@!H-g%gF^j"2n?(5;W~> + 3810 6965 94 94 @C + , + -%M.2$6Xo9",%X:k_ at 5>5_4\V#3[2b+II8?UtmB^2qt1WDRZM/l+6Mj]l.7q^9 at 5&II$4ns8JAR + s8VEbrI=eF^Xr5YFoB(Oqq#&%9)d8Rd^N:`V/EH$[&p0A.qr*o.q'i7KGBSXMAV$U-t,DnK* + 3911 6965 94 94 @C + , + -%M.2$6Xo9",%X:k_ at 5>5_4\V#3[2b+II8?UtmB^2qt1WDRZM/l+6Mj]l.7q^9 at 5&II$4ns8JAR + s8VEbrI=eF^Xr5YFoB(Oqq#&%9)d8Rd^N:`V/EH$[&p0A.qr*o.q'i7KGBSXMAV$U-t,DnK* + 4012 6965 56 118 /1L + $C + .0;dH at o.fNl-OPH:NSn;]HI%[dVhq9VAC0LJ,fQKs8W-!s8W-!s8W-!s8W-!s8W-!q1*#TpP6$] + 'o0KkHi)[o^V0+)Hi)^W~> + , + 153 51 r6 + 3415.2 6331.2 454.801 324 re + S + K + 3462 6386 115 178 @C + , + ,Qr](#W`G-%tW.FRO)?rV$8*^NQ4!_[5 at M^AYh6rVM*5hgb(oJ)>b5J,=`qDu[HLmJlp1 + p[A+[rr9aj^Yee_rql`QJ,=`mn&V^IHiqJG]XhYV3H + >C1L$p)6cH=A[Ka:gfp~> + 3557 6425 42 90 /4S + $C + 1FOAfl-lR)?iTlNokMu6$l"3ks8W-!-41#!3csWbYQ"3C>."f,"T~> + , + 3608 6427 102 135 @C + , + .R:b_s1\I2rV,dTn+Z;FJ+nH)cN2s1qtL,7rqjcjKGRJBDmnK9rO]N3qgGp?pA8cGmIpEon$h%u + GAjtFDVootgUhmC\(eNC\$pPXDf<+.hVW5 + qffa at hY-DbgV*&l~> + 153 51 r6 + 4135.2 6331.2 409.199 324 re + S + K + 4214 6425 83 90 /2A + $C + .01\2."i'A3'kE'*=u%k5`K2#+Pd/>cu,%p2bC\A + , + 4311 6425 4S , + 4378 6427 72 135 @C + , + -D466i&41.VKDtPeaI81^\7]As0qt$rP.g9n%\8iIK+6_n,)S2J)>_TIf'-ApYY`&^Ycd(rr)ip + p[@kFpOBr-]D_d(lesiC%<&a=PljF+JVd>8Kk(uH5u-3c~> + 153 51 r6 + 4130.4 5856 420 321.602 re + S + K + 4209 5946 93 139 @C + , + +TWir2k<;o#TOuG&7U4-"DS?C"s$&@ODhAuDm8XKmIpDemHqXF]=6P^gV3X#h7N(S[r&nRpNM+6 + Hf!Z;H["@kqnDOrHf"bqn,)k8pO=?;hY5\CrOq[.rVa-NmD!PNCNf[1p + 4318 5946 4S , + 4384 5948 72 135 @C + , + -D466i&41.VKDtPeaI81^\7]As0qt$rP.g9n%\8iIK+6_n,)S2J)>_TIf'-ApYY`&^Ycd(rr)ip + p[@kFpOBr-]D_d(lesiC%<&a=PljF+JVd>8Kk(uH5u-3c~> + 153 51 r6 + 4130.4 5377.2 420 322.801 re + S + K + 4185 5430 116 129 @C + , + 4q59K!Lj9#eZ3$VGQ.Vks*k"9s6fpTs6f#Xp`^UjYX%^`A/%j&,H)rA%mbta2qWEch1sb>ICl`\ + ID4OGrV$-CDr5I,\*a()Hi&<)HbTLHrP/6 + 4318 5469 4S , + 4384 5471 72 135 @C + , + -D466i&41.VKDtPeaI81^\7]As0qt$rP.g9n%\8iIK+6_n,)S2J)>_TIf'-ApYY`&^Ycd(rr)ip + p[@kFpOBr-]D_d(lesiC%<&a=PljF+JVd>8Kk(uH5u-3c~> + 10 M + 0 J + 1 j + 153 51 r6 + 4340.4 6339.6 0 -168 S + 4340.4 5860.8 0 -168 S + 3914.4 6872.4 426 -217.2 S + 3914.4 6872.4 -272.4 -217.2 S + 8 M + 1 J + 0 j + 3655.2 5856 421.199 321.602 re + S + K + 3734 5946 93 139 @C + , + +TWir2k<;o#TOuG&7U4-"DS?C"s$&@ODhAuDm8XKmIpDemHqXF]=6P^gV3X#h7N(S[r&nRpNM+6 + Hf!Z;H["@kqnDOrHf"bqn,)k8pO=?;hY5\CrOq[.rVa-NmD!PNCNf[1p + 3843 5946 4S , + 3909 5948 72 135 @C + , + -D466i&41.VKDtPeaI81^\7]As0qt$rP.g9n%\8iIK+6_n,)S2J)>_TIf'-ApYY`&^Ycd(rr)ip + p[@kFpOBr-]D_d(lesiC%<&a=PljF+JVd>8Kk(uH5u-3c~> + 153 51 r6 + 3181.2 5856 409.199 321.602 re + S + K + 3260 5946 2A , + 3357 5946 4S , + 3416 5947 91 136 @C + , + +bP"`%17W:_?WBR3dCq4%Y52/idrlCJ("c7"^#+#3^&*;/g\_$>s7cJArkI(] + )!_K$n*f-ZlT~> + 10 M + 0 J + 1 j + 153 51 r6 + 3642 6331.2 -255.6 -153.6 S + 3642 6331.2 223.2 -153.6 S + 8 M + 1 J + 0 j + 3175.2 5377.2 421.199 322.801 re + S + K + 3254 5469 93 90 @C + , + 2$Y=7_%=n"*$E^`)@hD2G7OGDmkL`\(i[h[ZeT;/].c*lrOC_)RqK3,R?]#~> + 3363 5469 4S , + 3421 5470 91 136 @C + , + +bP"`%17W:_?WBR3dCq4%Y52/idrlCJ("c7"^#+#3^&*;/g\_$>s7cJArkI(] + )!_K$n*f-ZlT~> + 153 51 r6 + 3475.2 4897.2 421.199 322.801 re + S + K + 3554 4989 93 139 @C + , + +TWir2k<;o#TOuG&7U4-"DS?C"s$&@ODhAuDm8XKmIpDemHqXF]=6P^gV3X#h7N(S[r&nRpNM+6 + Hf!Z;H["@kqnDOrHf"bqn,)k8pO=?;hY5\CrOq[.rVa-NmD!PNCNf[1p + 3663 4989 4S , + 3729 4991 72 135 @C + , + -D466i&41.VKDtPeaI81^\7]As0qt$rP.g9n%\8iIK+6_n,)S2J)>_TIf'-ApYY`&^Ycd(rr)ip + p[@kFpOBr-]D_d(lesiC%<&a=PljF+JVd>8Kk(uH5u-3c~> + 153 51 r6 + 2942.4 4897.2 465.602 322.801 re + S + K + 3021 4989 139 90 @C + , + 4"D9nE]@H`L(HSIgP4^(pYFSOL'M`/48X1kGJClZ]>&7 + 3174 4989 4S , + 3232 4991 88 136 @C + , + -D5VXrO^gtmG?[fDTJK?@,8'a%rJpsD7b5*[s$WcD1ueCgUDUc[r1$6G4"%nDV`"\[r1$6G4"&? + ]6#8#.f(T%mCVJNi.r2Q$Q5\Kc@>(jnC`,Jq=KC/` + C=T7te27X_ at 6oSO$<4mX~> + 153 51 r6 + 2965.2 4418.4 421.199 322.801 re + S + K + 3020 4471 116 129 @C + , + 4q59K!Lj9#eZ3$VGQ.Vks*k"9s6fpTs6f#Xp`^UjYX%^`A/%j&,H)rA%mbta2qWEch1sb>ICl`\ + ID4OGrV$-CDr5I,\*a()Hi&<)HbTLHrP/6 + 3153 4510 4S , + 3211 4512 88 136 @C + , + -D5VXrO^gtmG?[fDTJK?@,8'a%rJpsD7b5*[s$WcD1ueCgUDUc[r1$6G4"%nDV`"\[r1$6G4"&? + ]6#8#.f(T%mCVJNi.r2Q$Q5\Kc@>(jnC`,Jq=KC/` + C=T7te27X_ at 6oSO$<4mX~> + 10 M + 0 J + 1 j + 153 51 r6 + 3386.4 5860.8 0 -168 S + 3386.4 5382 -210 -168 S + 3386.4 5382 300 -168 S + 3176.4 4902 0 -166.8 S + 8 M + 1 J + 0 j + 3452.4 4418.4 465.602 322.801 re + S + K + 3531 4510 139 90 @C + , + 4"D9nE]@H`L(HSIgP4^(pYFSOL'M`/48X1kGJClZ]>&7 + 3684 4510 4S , + 3750 4512 72 135 @C + , + -D466i&41.VKDtPeaI81^\7]As0qt$rP.g9n%\8iIK+6_n,)S2J)>_TIf'-ApYY`&^Ycd(rr)ip + p[@kFpOBr-]D_d(lesiC%<&a=PljF+JVd>8Kk(uH5u-3c~> + 10 M + 0 J + 1 j + 153 51 r6 + 3686.4 4902 0 -166.8 S + 8 M + 1 J + 0 j + 1778.4 4602 921.602 2053.2 re + S + K + 1855 5738 152 135 @C + , + 2@$NQ*rl8a^p&UraWM;=(b%b4<#,WG+MtM9VQSLbg2$`gs8W-!s8W-!s8W-!s8W-!s8W-!s8W-! + s8W-!s8G7_s87LIQiI*cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s%P`WRWR#USH]XE5f+"C"_8H$ + c%55C#J^<.~> + 2011 5735 85 98 @C + , + ,lri:"V?.+PeC:h'_US[(V/bKu_XA + 2100 5735 98 98 @C + , + +T`6q,[b7-5f=dY3'i3;+OG3KFEj`pgNmk at IR^p_r67+_=5JMK>HL8H!(?>&7G*+-O;o.:T*ZbqLAPFs'PG#p$/]k + X`pg=]"1qj\lK_GfKiXA%\\\T_M/aA.2!'B-jCd~> + 2201 5735 107 138 @C + , + ,,*)<7`.WUOep:YqGp^7Y)u + Y.t#5s8Ke4^]4?6s8W-!s8W&ts8Uu+s8DushuDTkJ+hLg?*4(-[C3Nq@;Hc)'Rbl+G.;=qfN^;O + >VNZA>`4 + 2312 5735 85 98 @C + , + ,lri:"V?.+PeC:h'_US[(V/bKu_XA + 2401 5738 87 95 @C + , + 49kic%"b^G+>r,3C=^)ks8W-!s8W-!s8W-!s8W-!s8W)u.L"c5g3l,^e(X1PqbG^0/9#$@5?H`b + Wk9ju>(XM)L:^`iL7s;_E?G~> + 1855 5502 127 135 @C + , + ,=$Lgs!",D-"+n#$6$lOO at 6$O;:)1l!6,9STA+_cA#^^]~> + 1988 5499 98 98 @C + , + +T`6q,[b7-5f=dY3'i3;+OG3KFEj`pgNmk at IR^p_r67+_=5JMK>HL8H!(?>&7G*+-O;o.:T*ZbqLAPFs'PG#p$/]k + X`pg=]"1qj\lK_GfKiXA%\\\T_M/aA.2!'B-jCd~> + 2089 5499 104 138 @C + , + 3^cddA.0/\KF_IC_a*o,HVY%o(moY8J\@l9(e?@N:$K>uDboi2X8d+qqg\A>huE0Fp\t3es8W,n + s8W-!s8W,q?iU0+?gI`!lg+LtDs;acD1-7QY/4:T@=hVj_8UT0?*;cf0%ULa(gJb"V[piJs8W-! + s8W-!s6JuQ==b9ghu~> + 2201 5502 51 135 /6Q + $C + 0FXT3_*\A8>5#Y5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!rk?+SK#)s9~> + , + 2256 5499 85 98 @C + , + ,lri:"V?.+PeC:h'_US[(V/bKu_XA + 153 51 r6 + 2628 6190.8 50.4 3.6 30 2.4 0 -9.6 -28.8 -2.4 -50.4 -3.6 H + 2737.2 6200.4 40.8 3.6 22.8 2.4 15.6 2.4 2.4 -9.6 -16.8 -2.4 -24 -2.4 -39.6 -4.8 H + 2846.4 6212.4 1.2 1.2 22.8 3.6 20.4 3.6 21.6 4.8 12 3.6 2.4 -9.6 -12 -3.6 + -21.6 -4.8 -21.6 -3.6 -22.8 -4.8 -1.2 0 H + 2953.2 6237.6 16.8 6 16.8 7.2 7.2 3.6 8.4 3.6 13.2 9.6 6 4.8 7.2 -7.2 + -7.2 -6 -14.4 -9.6 -8.4 -4.8 -8.4 -3.6 -18 -7.2 -16.8 -6 H + 3043.2 6292.8 7.2 7.2 9.6 13.2 9.6 12 8.4 13.2 12 18 8.4 -6 ^ + -9.6 -13.2 -9.6 -12 -9.6 -13.2 -7.2 -8.4 H + 3108 6380.4 7.2 9.6 10.8 10.8 12 10.8 13.2 9.6 14.4 8.4 6 2.4 3.6 -8.4 + -4.8 -2.4 -13.2 -7.2 -12 -9.6 -12 -10.8 -9.6 -10.8 -7.2 -8.4 H + 3199.2 6444 15.6 6 16.8 4.8 18 4.8 19.2 4.8 8.4 1.2 2.4 -9.6 -8.4 -1.2 + -18 -4.8 -18 -4.8 -16.8 -4.8 -15.6 -6 H + 3307.2 6471.6 38.4 6 40.8 4.8 1.2 -9.6 -40.8 -4.8 -38.4 -6 H + 3416.4 6486 10.8 1.2 20.4 1.2 1.2 -9.6 -20.4 -2.4 -10.8 -1.2 H + 3387.6 6517.2 70.8 -32.4 -63.6 -45.6 P + -2.4 -1.2 -4.8 -1.2 -7.2 1.2 c + -1.2 2.4 -1.2 4.8 1.2 7.2 c + 56.4 39.6 1.2 -8.4 -62.4 30 p + -3.6 1.2 -3.6 3.6 -2.4 6 c + 1.2 2.4 3.6 3.6 6 2.4 c + f + 2628 6010.8 80.4 0 0 -9.6 ^ H + 2738.4 6010.8 80.4 0 0 -9.6 ^ H + 2848.8 6010.8 79.2 0 0 -9.6 ^ H + 2958 6010.8 80.4 0 0 -9.6 ^ H + 3068.4 6010.8 80.4 0 0 -9.6 ^ H + 3091.2 6045.6 67.2 -39.6 -67.2 -39.6 P + -2.4 -1.2 -6 0 -7.2 2.4 c + -1.2 2.4 0 4.8 2.4 6 c + 60 36 0 -9.6 -60 36 p + -2.4 1.2 -3.6 3.6 -2.4 6 c + 1.2 2.4 4.8 3.6 7.2 2.4 c + f + 3528 6010.8 2.4 0 -1.2 0 2.4 1.2 -1.2 -1.2 1.2 1.2 2.4 1.2 1.2 1.2 + 3.6 2.4 2.4 3.6 3.6 3.6 4.8 4.8 6 6 6 7.2 6 7.2 8.4 9.6 + 4.8 6 7.2 -6 -4.8 -7.2 -7.2 -8.4 -7.2 -8.4 -6 -7.2 -6 -6 -4.8 -4.8 + -3.6 -3.6 -3.6 -3.6 -2.4 -2.4 -3.6 -2.4 -2.4 -1.2 -1.2 -1.2 P + 0 0 -1.2 0 v + -2.4 -1.2 p + 0 0 -1.2 0 v + -1.2 0 h + 3598.8 6087.6 1.2 1.2 6 7.2 4.8 8.4 7.2 8.4 12 18 14.4 20.4 1.2 2.4 + 8.4 -6 -1.2 -2.4 -14.4 -20.4 -13.2 -18 -6 -8.4 -6 -8.4 -6 -7.2 0 -1.2 H + 3662.4 6177.6 10.8 15.6 16.8 21.6 15.6 21.6 4.8 6 7.2 -6 -3.6 -4.8 -16.8 -22.8 + -15.6 -21.6 -10.8 -15.6 H + 3728.4 6266.4 10.8 14.4 16.8 20.4 18 19.2 6 7.2 7.2 -7.2 -6 -6 -16.8 -20.4 + -18 -20.4 -10.8 -13.2 H + 3801.6 6349.2 6 6 9.6 7.2 8.4 7.2 16.8 13.2 18 10.8 6 3.6 4.8 -8.4 + -6 -3.6 -16.8 -10.8 -16.8 -13.2 -8.4 -6 -8.4 -7.2 -6 -6 H + 3892.8 6412.8 3.6 2.4 18 8.4 19.2 8.4 18 8.4 14.4 4.8 3.6 -9.6 -13.2 -4.8 + -19.2 -7.2 -18 -8.4 -18 -9.6 -3.6 -1.2 H + 3994.8 6454.8 14.4 4.8 39.6 10.8 22.8 6 3.6 -9.6 -24 -6 -38.4 -10.8 -14.4 -4.8 H + 4101.6 6483.6 6 2.4 2.4 -9.6 ^ H + 4044 6505.2 74.4 -21.6 -56.4 -54 P + -1.2 -2.4 -4.8 -2.4 -7.2 0 c + -1.2 1.2 -1.2 4.8 1.2 7.2 c + 49.2 48 2.4 -8.4 -66 19.2 p + -3.6 1.2 -4.8 3.6 -3.6 7.2 c + 0 2.4 3.6 3.6 6 2.4 c + f + 2629.2 5757.6 45.6 -10.8 22.8 -7.2 9.6 -2.4 -2.4 -9.6 -9.6 2.4 -22.8 7.2 -45.6 10.8 H + 2736 5727.6 6 -1.2 22.8 -8.4 22.8 -9.6 22.8 -10.8 -3.6 -8.4 -22.8 9.6 -22.8 9.6 + -21.6 8.4 -7.2 2.4 H + 2836.8 5683.2 8.4 -6 10.8 -7.2 22.8 -15.6 22.8 -16.8 1.2 -1.2 -6 -8.4 -1.2 1.2 + -22.8 16.8 -21.6 15.6 -12 7.2 -7.2 4.8 H + 2926.8 5618.4 19.2 -14.4 12 -7.2 10.8 -7.2 10.8 -6 10.8 -6 3.6 -1.2 -4.8 -9.6 + -3.6 2.4 -10.8 6 -12 6 -10.8 7.2 -12 8.4 -19.2 13.2 H + 3020.4 5564.4 14.4 -6 22.8 -8.4 22.8 -7.2 15.6 -4.8 -3.6 -9.6 -15.6 4.8 -22.8 7.2 + -22.8 8.4 -14.4 6 H + 3124.8 5529.6 25.2 -6 -2.4 -9.6 -25.2 6 H + 3103.2 5570.4 55.2 -54 -74.4 -21.6 P + -2.4 -1.2 -6 0 -6 3.6 c + -1.2 2.4 0 4.8 2.4 6 c + 67.2 19.2 -2.4 -8.4 -49.2 48 p + -2.4 2.4 -2.4 6 0 7.2 c + 2.4 2.4 4.8 2.4 7.2 0 c + f + 2640 5578.8 36 0 36 -1.2 8.4 0 -1.2 -10.8 -8.4 1.2 -70.8 0 H + 2750.4 5575.2 15.6 -1.2 19.2 -3.6 18 -2.4 19.2 -4.8 7.2 -1.2 -2.4 -9.6 -6 1.2 + -19.2 4.8 -18 2.4 -18 2.4 -16.8 2.4 H + 2859.6 5553.6 2.4 0 19.2 -7.2 20.4 -8.4 20.4 -9.6 12 -6 -4.8 -8.4 ^ + -19.2 8.4 -20.4 8.4 -19.2 7.2 -2.4 0 H + 2960.4 5508 3.6 -2.4 10.8 -7.2 10.8 -8.4 12 -7.2 10.8 -9.6 16.8 -13.2 -6 -7.2 + ^ -10.8 8.4 -12 8.4 -10.8 7.2 -10.8 7.2 -3.6 2.4 H + 3048 5440.8 7.2 -4.8 24 -21.6 24 -21.6 6 -4.8 -7.2 -7.2 ^ -24 21.6 + -22.8 20.4 -7.2 6 H + 3130.8 5367.6 20.4 -18 22.8 -21.6 15.6 -14.4 -7.2 -7.2 -14.4 14.4 -24 21.6 -20.4 18 H + 3211.2 5293.2 9.6 -7.2 21.6 -19.2 21.6 -18 8.4 -7.2 -6 -8.4 -9.6 7.2 -21.6 18 + -21.6 20.4 -8.4 7.2 H + 3295.2 5223.6 7.2 -4.8 19.2 -13.2 16.8 -10.8 18 -10.8 6 -3.6 -4.8 -9.6 -7.2 4.8 + -16.8 10.8 -18 10.8 -18 13.2 -7.2 4.8 H + 3387.6 5164.8 1.2 0 14.4 -8.4 15.6 -7.2 14.4 -7.2 14.4 -6 12 -6 -3.6 -8.4 + -12 4.8 -14.4 7.2 -15.6 6 -14.4 8.4 -16.8 8.4 H + 3487.2 5119.2 1.2 -1.2 26.4 -9.6 8.4 -2.4 -3.6 -9.6 -7.2 2.4 -27.6 10.8 -1.2 0 H + 3480 5157.6 50.4 -60 -76.8 -14.4 P + -2.4 0 -4.8 1.2 -6 4.8 c + 0 2.4 1.2 4.8 4.8 6 c + 68.4 12 -3.6 -8.4 -44.4 54 p + -2.4 1.2 -1.2 4.8 0 7.2 c + 2.4 1.2 6 1.2 7.2 -1.2 c + f + 3835.2 5036.4 9.6 30 8.4 30 4.8 15.6 9.6 -2.4 ^ -8.4 -31.2 -9.6 -30 H + 3865.2 5140.8 1.2 4.8 4.8 16.8 3.6 18 3.6 19.2 3.6 19.2 9.6 -1.2 -3.6 -19.2 + -3.6 -19.2 -3.6 -18 -4.8 -18 -1.2 -4.8 H + 3885.6 5248.8 2.4 13.2 2.4 22.8 2.4 24 1.2 19.2 10.8 -1.2 -2.4 -19.2 -2.4 -24 + -2.4 -22.8 -1.2 -13.2 H + 3896.4 5358 0 3.6 1.2 27.6 1.2 30 1.2 18 9.6 0 0 -19.2 -1.2 -28.8 + -1.2 -28.8 -1.2 -3.6 H + 3900 5467.2 0 13.2 1.2 32.4 0 34.8 9.6 0 0 -80.4 H + 3901.2 5577.6 -1.2 3.6 0 76.8 9.6 0 0 -6 1.2 -36 0 -38.4 H + 3898.8 5688 0 36 -1.2 43.2 9.6 0 ^ 1.2 -36 H + 3896.4 5797.2 0 1.2 -1.2 54 10.8 1.2 1.2 -55.2 0 -1.2 H + 3862.8 5794.8 37.2 68.4 40.8 -67.2 P + 2.4 -2.4 1.2 -4.8 -1.2 -6 c + -2.4 -2.4 -6 -1.2 -7.2 1.2 c + -36 58.8 8.4 0 -33.6 -60 p + -1.2 -2.4 -4.8 -3.6 -7.2 -2.4 c + -2.4 1.2 -2.4 4.8 -1.2 7.2 c + f + 4008 6010.8 80.4 0 0 -9.6 ^ H + 4051.2 6045.6 67.2 -39.6 -67.2 -39.6 P + -2.4 -1.2 -6 0 -7.2 2.4 c + -1.2 2.4 0 4.8 2.4 6 c + 60 36 0 -9.6 -60 36 p + -2.4 1.2 -3.6 3.6 -2.4 6 c + 1.2 2.4 4.8 3.6 7.2 2.4 c + f + 2641.2 5340 25.2 -4.8 26.4 -3.6 25.2 -4.8 2.4 -1.2 -2.4 -9.6 ^ -24 4.8 + -26.4 3.6 -26.4 3.6 H + 2749.2 5318.4 16.8 -4.8 10.8 -4.8 9.6 -4.8 10.8 -6 9.6 -6 8.4 -6 6 -6 + -7.2 -7.2 -4.8 4.8 -8.4 6 -8.4 6 -9.6 4.8 -9.6 4.8 -10.8 4.8 -15.6 4.8 H + 2839.2 5254.8 3.6 -6 3.6 -12 3.6 -12 3.6 -13.2 4.8 -26.4 2.4 -9.6 -10.8 -1.2 + -1.2 9.6 -4.8 25.2 -3.6 12 -3.6 12 -3.6 10.8 -2.4 6 H + 2865.6 5146.8 2.4 -12 3.6 -10.8 3.6 -9.6 3.6 -9.6 4.8 -7.2 6 -7.2 6 -6 + 4.8 -4.8 -7.2 -7.2 -4.8 4.8 -6 7.2 -7.2 7.2 -4.8 8.4 -4.8 10.8 -3.6 10.8 + -3.6 10.8 -2.4 12 H + 2924.4 5064 12 -6 15.6 -6 15.6 -4.8 14.4 -3.6 -2.4 -9.6 -14.4 3.6 -16.8 4.8 + -16.8 6 -12 6 H + 2932.8 5090.4 57.6 -54 -74.4 -22.8 P + -2.4 -1.2 -6 0 -7.2 3.6 c + 0 2.4 1.2 4.8 3.6 6 c + 66 20.4 -1.2 -8.4 -50.4 48 p + -2.4 1.2 -2.4 4.8 0 7.2 c + 1.2 1.2 4.8 1.2 6 0 c + f + 3363.6 5037.6 9.6 -10.8 9.6 -12 8.4 -13.2 8.4 -13.2 8.4 -15.6 1.2 -2.4 -9.6 -3.6 + -1.2 2.4 -7.2 14.4 -8.4 13.2 -8.4 12 -8.4 10.8 -9.6 12 H + 3418.8 4941.6 1.2 -4.8 2.4 -9.6 2.4 -12 1.2 -12 1.2 -13.2 1.2 -14.4 0 -14.4 + -10.8 0 0 27.6 -1.2 13.2 -1.2 12 -2.4 10.8 -2.4 9.6 -1.2 4.8 H + 3427.2 4831.2 0 -2.4 -2.4 -33.6 -1.2 -33.6 -1.2 -10.8 -9.6 0 0 10.8 2.4 33.6 + 1.2 33.6 0 2.4 H + 3422.4 4720.8 0 -20.4 1.2 -13.2 1.2 -10.8 2.4 -10.8 2.4 -10.8 2.4 -8.4 1.2 -2.4 + -9.6 -3.6 -1.2 2.4 -2.4 10.8 -2.4 9.6 -2.4 12 -1.2 12 -1.2 13.2 -1.2 14.4 + 0 6 H + 3444 4616.4 4.8 -9.6 8.4 -13.2 8.4 -12 6 -7.2 -8.4 -6 ^ -8.4 12 + -8.4 14.4 -6 9.6 H + 3460.8 4640.4 13.2 -76.8 -73.2 27.6 P + -2.4 0 -4.8 3.6 -3.6 6 c + 1.2 2.4 3.6 3.6 7.2 2.4 c + 64.8 -24 -7.2 -4.8 -10.8 68.4 p + 0 2.4 1.2 4.8 4.8 4.8 c + 2.4 1.2 4.8 -1.2 4.8 -3.6 c + f + 2643.6 5097.6 33.6 -40.8 16.8 -21.6 -8.4 -6 -15.6 20.4 -33.6 42 H + 2712 5010 13.2 -19.2 14.4 -24 13.2 -24 0 -1.2 -8.4 -4.8 -1.2 1.2 -12 24 + -14.4 22.8 -13.2 20.4 H + 2766 4914 3.6 -10.8 4.8 -14.4 3.6 -15.6 3.6 -15.6 3.6 -22.8 -10.8 -1.2 -2.4 21.6 + -3.6 15.6 -3.6 14.4 -4.8 14.4 -3.6 10.8 H + 2788.8 4804.8 2.4 -13.2 4.8 -32.4 3.6 -14.4 3.6 -15.6 0 -2.4 -9.6 -2.4 0 2.4 + -3.6 15.6 -3.6 15.6 -4.8 32.4 -2.4 13.2 H + 2812.8 4699.2 4.8 -9.6 7.2 -12 7.2 -10.8 8.4 -9.6 8.4 -9.6 9.6 -8.4 1.2 -1.2 + -6 -7.2 -2.4 1.2 -9.6 9.6 -9.6 9.6 -8.4 10.8 -8.4 10.8 -7.2 12 -4.8 10.8 H + 2882.4 4620 19.2 -12 24 -13.2 24 -12 2.4 -1.2 -3.6 -8.4 ^ -25.2 12 + -25.2 13.2 -18 12 H + 2979.6 4569.6 3.6 -1.2 -3.6 -9.6 -4.8 2.4 H + 2944.8 4622.4 45.6 -62.4 -76.8 -9.6 P + -3.6 -1.2 -6 1.2 -6 3.6 c + 0 3.6 1.2 6 4.8 6 c + 68.4 8.4 -3.6 -8.4 -40.8 56.4 p + -1.2 2.4 -1.2 4.8 1.2 7.2 c + 2.4 1.2 4.8 1.2 7.2 -1.2 c + f + 3355.2 4556.4 2.4 21.6 1.2 12 1.2 10.8 3.6 12 2.4 12 4.8 10.8 9.6 -3.6 + -4.8 -10.8 -2.4 -10.8 -2.4 -10.8 -2.4 -10.8 -1.2 -10.8 -2.4 -22.8 H + 3385.2 4663.2 6 7.2 9.6 12 4.8 6 6 6 7.2 4.8 6 6 8.4 6 + 7.2 6 3.6 2.4 6 -8.4 -3.6 -2.4 -7.2 -6 -7.2 -4.8 -7.2 -6 -6 -4.8 + -6 -6 -4.8 -4.8 -8.4 -12 -6 -7.2 H + 3470.4 4735.2 7.2 4.8 10.8 4.8 12 6 13.2 4.8 13.2 4.8 15.6 4.8 2.4 0 + 2.4 -9.6 -2.4 0 -14.4 -4.8 -13.2 -4.8 -12 -4.8 -12 -4.8 -10.8 -6 -7.2 -3.6 H + 3573.6 4773.6 16.8 4.8 16.8 3.6 18 3.6 18 4.8 8.4 2.4 2.4 -10.8 -9.6 -1.2 + -18 -4.8 -16.8 -3.6 -16.8 -3.6 -16.8 -4.8 H + 3681.6 4798.8 18 3.6 38.4 8.4 21.6 6 2.4 -10.8 -21.6 -4.8 -39.6 -8.4 -16.8 -3.6 H + 3788.4 4824 26.4 6 38.4 12 12 3.6 2.4 -9.6 -10.8 -3.6 -38.4 -12 -27.6 -7.2 H + 3892.8 4855.2 15.6 4.8 16.8 7.2 16.8 7.2 16.8 8.4 7.2 3.6 4.8 -8.4 -7.2 -4.8 + -16.8 -7.2 -16.8 -8.4 -18 -7.2 -15.6 -4.8 H + 3991.2 4900.8 12 8.4 14.4 9.6 25.2 21.6 10.8 9.6 6 -7.2 -10.8 -10.8 -26.4 -21.6 + -13.2 -9.6 -12 -8.4 H + 4074 4971.6 15.6 15.6 21.6 26.4 14.4 18 7.2 -6 -14.4 -19.2 -21.6 -26.4 -15.6 -15.6 H + 4142.4 5056.8 8.4 12 19.2 30 15.6 25.2 8.4 -6 ^ -19.2 -30 -8.4 -12 H + 4200 5149.2 6 10.8 16.8 32.4 13.2 27.6 9.6 -3.6 -14.4 -28.8 -16.8 -32.4 -6 -10.8 H + 4249.2 5247.6 4.8 10.8 28.8 62.4 8.4 -4.8 -27.6 -61.2 -4.8 -12 H + 4294.8 5347.2 13.2 30 8.4 -3.6 ^ H + 4252.8 5338.8 63.6 45.6 8.4 -76.8 P + 1.2 -3.6 -1.2 -6 -3.6 -6 c + -3.6 0 -6 1.2 -6 4.8 c + -8.4 68.4 8.4 -3.6 -56.4 -40.8 p + -2.4 -1.2 -4.8 -1.2 -7.2 1.2 c + -1.2 2.4 -1.2 6 1.2 7.2 c + f + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 6350 8413 V 1444 8420 4913 7 v 1166 8756 + a Fj(Figure)60 b(1:)80 b Fm(Structure)55 b(of)g(FP-tree)h(data)f + (structure)g(\(tak)-5 b(en)55 b(from)g(Shengnan)h(Cong)42 + 9257 y Fj(There)49 b(are)f(t)-5 b(w)g(o)49 b(signi\014can)-5 + b(t)46 b(kinds)i(of)g(data)g(structures)g(in)g(this)f(implemen)-5 + b(tation)45 b(-)j Fh(FPtr)-9 b(e)g(e)48 b Fj(and)g Fh(lar)-9 + b(ge)53 b(item)g(table)p Fj(.)-240 9531 y(The)72 b(structure)f(of)g + (the)h(main)e(data)i(structure)f(fptree)g(is)g(sho)-5 + b(wn)71 b(in)h(Figure)f(1.)113 b(It)72 b(has)f(a)h(ro)5 + b(ot)71 b(no)5 b(de)72 b(and)g(a)f(set)h(of)-240 9805 + y(no)5 b(des)55 b(forming)g(a)h(tree)f(structure.)78 + b(The)56 b(tree)g(structure)f(\(sho)-5 b(wn)55 b(with)h(solid)e(lines)h + (in)g(the)h(\014gure\))f(is)g(imp)5 b(osed)55 b(using)-240 + 10079 y(three)76 b(p)5 b(oin)-5 b(ter)76 b(v)-10 b(ariables.)128 + b("P)-5 b(aren)g(t")76 b(v)-10 b(ariable)76 b(p)5 b(oin)-5 + b(ts)75 b(to)i(the)f(paren)-5 b(t)77 b(of)f(the)h(giv)-5 + b(en)76 b(no)5 b(de,)80 b("\014rst)p 6933 10079 55 7 + v 65 w(son")c(v)-10 b(ariable)-240 10353 y(p)5 b(oin)-5 + b(ts)74 b(to)g(the)h(\014rst)f(c)-5 b(hild,)77 b("righ)-5 + b(t)p 2264 10353 V 64 w(brother")75 b(p)5 b(oin)-5 b(ts)74 + b(to)g(next)h(sibling.)121 b(The)75 b(header)f(table)g(con)-5 + b(tains)74 b(p)5 b(oin)-5 b(ters)73 b(to)-240 10627 y(\014rst)54 + b(no)5 b(de)53 b(with)h(a)g(particular)f(lab)5 b(el.)76 + b(The)55 b("next")e(p)5 b(oin)-5 b(ter)53 b(in)g(eac)-5 + b(h)54 b(no)5 b(de)54 b(forms)f(a)g(link)-5 b(ed)53 b(list)g(of)g(no)5 + b(des)54 b(with)f(same)-240 10900 y(lab)5 b(el)63 b(\(sho)-5 + b(wn)64 b(with)g(dotted)g(arro)-5 b(ws)65 b(in)f(the)g(\014gure\).)92 + b(The)64 b(large)g(item)f(table)h(data)g(structure)f(con)-5 + b(tains)63 b(n)-5 b(um)g(b)5 b(er)65 b(of)-240 11174 + y(large)60 b(items,)e(an)j(arra)-5 b(y)61 b(of)f(large)g(items)e(and)j + (their)f(coun)-5 b(t)60 b(\(i.e)f(n)-5 b(um)g(b)5 b(er)60 + b(of)g(o)5 b(ccurrence)60 b(of)g(eac)-5 b(h)60 b(large)g(item\).)3855 + 11672 y(8)p eop end + %%Page: 9 9 + TeXDict begin 9 8 bop 42 77 a Fj(One)79 b(main)f(FPtree)g(is)g(created) + g(in)h(build)p 3045 77 55 7 v 64 w(fp)p 3266 77 V 65 + w(tree)p 3635 77 V 65 w(from)p 4070 77 V 65 w(transaction)e(function.) + 134 b(The)79 b(main)e(function)h(calls)f(a)-240 351 y(recursiv)-5 + b(e)63 b(function)f(fptree)p 1710 351 V 64 w(mine.)88 + b(A)64 b(lo)5 b(cal)63 b(FPtree)f(is)h(created)g(in)g(this)g(function)f + (and)h(passed)g(as)g(an)h(argumen)-5 b(t)62 b(to)-240 + 625 y(the)71 b(recursiv)-5 b(e)71 b(call.)112 b(Main)70 + b(FPtree)h(is)g(passed)f(to)h(the)h(\014rst)f(call)f(from)h(main)f + (function.)112 b(In)71 b(this)g(w)-5 b(a)g(y)71 b(man)-5 + b(y)71 b(lo)5 b(cal)-240 899 y(FPtree)72 b(data)h(structures)f(are)h + (created)g(in)g(fptree)p 3333 899 V 64 w(mine)f(function.)117 + b(In)73 b(a)g(similar)f(manner,)j(a)e(large)g(item)f(table)g(is)-240 + 1173 y(passed)48 b(as)h(an)g(argumen)-5 b(t)48 b(to)h(the)g(fptree)p + 2566 1173 V 64 w(mine)f(function,)i(where)f(man)-5 b(y)48 + b(lo)5 b(cal)48 b(large)h(item)e(tables)h(are)h(created)f(lo)5 + b(cally)-15 b(.)-240 1447 y(Another)60 b(set)f(of)h(lo)5 + b(cal)59 b(data)h(structures)f(called)f(conditional)g(table)h(are)h + (also)f(created)h(recursiv)-5 b(ely)58 b(in)i(this)f(function.)-240 + 1721 y(But)h(it)g(is)g(not)g(passed)g(on)g(to)h(the)f(recursiv)-5 + b(e)59 b(call)h(as)g(an)g(argumen)-5 b(t.)p 244 1962 + 7313 7 v 244 4766 7 2804 v 300 4716 a @beginspecial 89 + @llx 563 @lly 507 @urx 720 @ury 4320 @rwi @setspecial + %%BeginDocument: Figures/fpgrowth_cbu1.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 89 563 507 720 + %%HiResBoundingBox: 89.999219 563.999609 507.000000 720.000000 + %................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/11/29 01:32:50 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{< + ]setcolorspace[0 255]false @X + IC + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!!$#!!"TP>!!*3&":>,/z#7:Y:!!*35$4 at .?!!Wf=!=Af,"9A`-z!"Ju9#6556 + !"&f1!!!!+#658@!WWW9z$jH\3#64`(!!!!,#ljr.#ljr+$ig8-#mgS3!<`N3$31&+zzzzz!!*'"zzz + zzzzzzzzzzzz!!!$"zzz!!!0+"U+l0"98E%!!!!,$31&+zz!!!!-z$OHe5#7V(L%1*@Az%KHh@!"Ju; + "oo&A!!!$&!!EW/!<`B*$31&+!!!!+#64`.#64`)$ig8-#mgS3!<`N3$31&+zzz!!*'"zzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzz!!!!$!WrK2%fcS0$j[=Q!#; + $OHe5!#;$OHe5 + !!=f)7$31A? + !!`i2!<`f=!!!-&z$OHe7"98i2!:!<`B3 + $ig8-!!!!+#64`.#64`/!"K8D$OHe5!<`N2"98E%zzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzz!!!$"zzzzzz!X\o-$3:V>%KQtI#QkJ9"TS],#6=u8!=0#?!6%Gzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!!"!tk;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!1)?Bj>zzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzz!!!!9)$'aMzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzz!!!!4!?2"=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!QK!PS7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"^%L!;zzzz + zzz!"&r2!!WZ.$NUS7!!E<-!"0)5$NUb6%fcqA!!!6($3pP2#64`(!!!!,!=Af,#6588"oo#:"onu8!!EB1 + %1J8!!!B-!t#&0$3:50!=T/5"p>#/!t#&0$NL/, + !<`B&#m:5:"onu5!!!0*#Qau+$OHe5!!#QY/:!=Sr.!!!!""98E0#lk/1%0-_?!"T86$3pPA"onW'!!!!,#7(h? + #655D!!!!&!rrZ5!!!H/!Xf;7!!N?,$j-S@!!!!/!=/f/#m^P4!tGY=!Y>z!"&`-!!WW3)$ig8- + !!!!""98E0!D9!sAi9!!`i2"q1J?"q1k> + !!!<5z!<`B&#m:5:"onu5!!30%!=/Z*$OHe5!!!"0)5"p4i*zzz!<<*"zz!!*'"zzzz!!!!%"TSl> + "U>P@"U>89!!`i2"p5;@"qD+C!!!<,z!<`B&#m:5:"onW.":P_>%1!=A$OHe5$ipk=!<`B3$ig\? + !!r],!!!N8%gW4@$igD2!"T>G#Qau6!=Af,z!"&r2!!WZ.$O-S:$igV>!"0)5"p4i*zzzz!!!!"zzz + !<<*"zzzzz!!NK*!=Jo2!X&c3#m(51!!!<,$4-\<$31&1!rr<$!!!!""98E0#lk/3!!!?2!!!3- + $3pP2"pP&-!!!!,$31&9!<!"0)5"p4i*zzzzz!!!$"zzzzzzzzzzzzzzzzzzzz!<<*"zz!!`N2 + !!=K58!W`Q0":,)3!=oJ;!t>YE"9AW3!&/$P*7="98Q1!s9#6#R1\<"U#)5!tG;2!t>51#mLA0"p"`3 + "p"`2!%KQt<$j[7B"TS],#6=u9 + !z!"o;5!Z4Hzzzzzzzzzzzzz + !!!!6*!$'[+X-md!!!!6('+F:!?2"=z!$``i!#S$hB#ljr0$NL/,!!!!-"onW. + "onu2$NL/2!$jQb4!!WH($jH\3"9Al%L`=;!!NH)$jH\3!W``< + #ljr/z!!!!-"onW."onu5#6t_J$jH\=#6Fu-zzzzz!<<*"zzzz!!*'"zzzzzzzzzzzz!!*'"zzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"z + zzz!!!!&"98H1!<`H,#Qt/;"9AK&#m(G?%fm1@!!WN*z!!*3&!"&r2#6b)-$jH\3#6YA=!!!3-z + !"0,6!"K#0$NUG3$O?q:$jH\>#S$hB#ljr9"TSN&!!!!-"onW."onu5%fm";$jH\=#64u4zzzzz + !<<*"zzzz!!**#zzzzzzzzzzzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz!!!'-!!!?,%Km7B$k3IE$ipM3"T\i/"UY89 + $4?k<"pk80! + Q + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 7550 4766 V 244 4773 7313 7 v 1725 5108 + a(Figure)60 b(2:)80 b Fm(CBU)54 b(graphs)j(of)e(main)h(data)f + (structures)h(in)g(fpgro)-5 b(wth)42 5581 y Fj(The)80 + b(part)g(of)f(CBU)h(graph)g(of)f(main)g(function)f(sho)-5 + b(wing)79 b(the)g(parts)h(corresp)5 b(onding)79 b(to)g(the)g(imp)5 + b(ortan)-5 b(t)78 b(data)-240 5855 y(structures)c(is)g(sho)-5 + b(wn)75 b(in)f(Figure)h(2.)123 b(Fptree)74 b(data)h(structure)f(con)-5 + b(tains)73 b(tree)p 5332 5855 55 7 v 65 w(no)5 b(de)75 + b(structure)f(instances)f(forming)-240 6129 y(the)c(tree.)106 + b(The)70 b(\014gure)f(also)g(sho)-5 b(ws)69 b(header)g(arra)-5 + b(y)-15 b(,)71 b(whic)-5 b(h)69 b(forms)f(a)i(link)-5 + b(ed)68 b(list)g(of)g(tree)p 6049 6129 V 65 w(no)5 b(de)70 + b(ha)-5 b(ving)68 b(same)h(lab)5 b(el.)-240 6403 y(This)63 + b(\014gure)h(also)f(sho)-5 b(ws)63 b(the)h(structure)f(of)g(the)h + (large)f(item)f(table)h(in)g(main)g(function.)88 b(These)64 + b(data)f(structures)g(are)-240 6677 y(lo)5 b(cal)78 b(to)g(main.)135 + b(DSA)79 b(correctly)f(iden)-5 b(ti\014es)77 b(them)h(as)h(lo)5 + b(cal,)82 b(as)d(eviden)-5 b(t)77 b(from)i(the)f(absence)g(of)h("G")f + (\015ag.)136 b(The)-240 6951 y(no)5 b(des)73 b(also)g(con)-5 + b(tain)72 b(accurate)h(t)-5 b(yp)5 b(e)73 b(information)e(without)i(b)5 + b(eing)72 b(collapsed.)118 b(But)73 b(the)g(DSA)g(is)g(unable)g(to)g + (\014nd)-240 7224 y(disjoin)-5 b(t)55 b(instances)g(of)i(main)f(and)g + (lo)5 b(cal)56 b(fptree)g(data)h(structures)f(due)h(to)f(limited)f(con) + -5 b(text)56 b(sensitivit)-5 b(y)54 b(in)i(recursion.)-240 + 7498 y(This)74 b(is)g(also)g(the)h(case)f(with)g(large)g(item)g(table,) + i(as)f(it)f(is)g(also)g(a)h(recursiv)-5 b(e)73 b(argumen)-5 + b(t)74 b(ob)10 b(ject)74 b(lik)-5 b(e)74 b(FPtree.)121 + b(But)-240 7772 y(DSA)59 b(iden)-5 b(ti\014es)57 b(disjoin)-5 + b(t)56 b(lo)5 b(cal)58 b(conditional)e(table)i(data)g(structures,)f(as) + i(they)f(are)h(non-recursiv)-5 b(e)57 b(ob)10 b(jects)57 + b(\(i.e.)78 b(not)-240 8046 y(passed)60 b(as)g(argumen)-5 + b(t)60 b(to)g(recursiv)-5 b(e)59 b(calls\).)-240 8583 + y Fg(4.3)225 b(Metrics:)-240 8974 y Fj(The)61 b(v)-10 + b(alues)59 b(of)h(the)g(describ)5 b(ed)60 b(metrics)f(for)h(fpgro)-5 + b(wth)60 b(are)h(-)-240 9248 y(N=3)-240 9522 y(Three)71 + b(SDSI)f(w)-5 b(ere)70 b(found)g(in)g(this)g(co)5 b(de.)109 + b(The)71 b(data)f(structures)g(include)f(one)h(fptree,)h(one)g(large)f + (item)f(table)g(and)-240 9796 y(one)60 b(conditional)f(table)g(data)h + (structure.)-240 10070 y(G=0)-240 10344 y(No)h(SDSI)f(w)-5 + b(as)61 b(global)e(in)h(this)g(case.)-240 10617 y(L=3)-240 + 10891 y(All)g(data)g(structures)g(w)-5 b(ere)60 b(correctly)g(pro)-5 + b(v)g(ed)60 b(to)h(b)5 b(e)60 b(lo)5 b(cal)59 b(b)-5 + b(y)61 b(DSA.)-240 11165 y(K=9)3855 11672 y(9)p eop end + %%Page: 10 10 + TeXDict begin 10 9 bop -240 77 a Fj(The)61 b(main)e(data)h(structures)g + (consist)f(of)h(9)h(no)5 b(des.)-240 351 y(I=0)-240 625 + y(There)61 b(are)f(no)h(disjoin)-5 b(t)58 b(instances/no)5 + b(des)59 b(of)h(same)f(t)-5 b(yp)5 b(e.)-240 899 y(O=0)-240 + 1173 y(None)61 b(of)f(the)g(no)5 b(des)60 b(are)h(collapsed.)-240 + 1447 y(C=2)-240 1721 y(These)f(t)-5 b(w)g(o)61 b(no)5 + b(des)60 b(form)g(parts)g(of)g(t)-5 b(w)g(o)60 b(data)g(structures.) + -240 2631 y Fk(5)269 b(Results)89 b(for)i(espresso)-240 + 3093 y Fg(5.1)225 b(Summary:)-240 3484 y Fj(Espresso)48 + b(is)g(an)h(in)-5 b(teger)48 b(b)5 b(enc)-5 b(hmark.)76 + b(The)49 b(goal)g(of)f(espresso)g(b)5 b(enc)-5 b(hmark)49 + b(is)f(to)h(minimize)d(b)5 b(o)g(olean)48 b(functions)g(using)-240 + 3758 y(set)57 b(op)5 b(erations)57 b(suc)-5 b(h)57 b(as)h(union,)f(in) + -5 b(tersect)56 b(and)i(di\013erence.)78 b(The)58 b(input)g(to)f(the)g + (b)5 b(enc)-5 b(hmark)58 b(is)f(a)g(b)5 b(o)g(olean)57 + b(function)-240 4032 y(and)64 b(output)f(is)h(a)g(logically)d(equiv)-10 + b(alen)-5 b(t)62 b(function)h(p)5 b(ossibly)62 b(with)i(few)-5 + b(er)63 b(terms.)90 b(The)64 b(implemen)-5 b(tation)60 + b(consists)j(of)-240 4306 y(14959)d(lines)f(of)h(co)5 + b(de)61 b(and)f(appro)-5 b(ximately)59 b(50)h(source)g(\014les.)-240 + 4842 y Fg(5.2)225 b(Data)74 b(Structures:)-240 5234 y + Fj(There)54 b(are)f(t)-5 b(w)g(o)53 b(imp)5 b(ortan)-5 + b(t)52 b(data)h(structures)f(in)h(this)f(implemen)-5 + b(tation.)75 b(First,)53 b(there)g(are)g(disjoin)-5 b(t)51 + b(sym)-5 b(b)5 b(olic)p 7521 5234 55 7 v 64 w(struct)-240 + 5508 y(structures,)97 b(sym)-5 b(b)5 b(olic)p 1406 5508 + V 63 w(lab)g(el)p 1849 5508 V 64 w(struct)90 b(structures)g(and)h + (disjoin)-5 b(t)89 b(sym)-5 b(b)5 b(olic)p 5109 5508 + V 63 w(list)p 5417 5508 V 64 w(struct)90 b(structures)g(p)5 + b(oin)-5 b(ted)90 b(to)g(b)-5 b(y)-240 5782 y(program)79 + b(v)-10 b(ariables.)136 b(The)79 b(part)h(of)f(CBU)g(graph)h(sho)-5 + b(wing)79 b(some)f(parts)h(of)g(these)g(data)g(structures)f(is)h(sho)-5 + b(wn)79 b(in)-240 6056 y(Figure)67 b(3.)101 b(The)68 + b(disjoin)-5 b(tness)65 b(is)i(detected)f(b)-5 b(y)68 + b(con)-5 b(text)67 b(sensitivit)-5 b(y)64 b(in)k(DSA)g(algorithm.)99 + b(The)68 b(signi\014can)-5 b(t)66 b(part)i(of)-240 6330 + y(this)74 b(data)h(structure)f(consists)f(of)i(link)-5 + b(ed)74 b(list)g(of)g(link)-5 b(ed)74 b(lists.)122 b(This)75 + b(data)g(structure)f(is)h(lo)5 b(cal)74 b(to)g(main)g(function)-240 + 6603 y(and)62 b(DSA)h(correctly)e(iden)-5 b(ti\014es)61 + b(this)g(using)h(the)g(fact)f(that)h(none)g(of)g(no)5 + b(des)62 b(mark)-5 b(ed)61 b(with)h("G")g(\015ag)g(p)5 + b(oin)-5 b(t)62 b(to)g(these)-240 6877 y(structures.)79 + b(None)61 b(of)f(the)g(no)5 b(des)60 b(are)h(collapsed)e(and)h(all)g + (the)g(no)5 b(des)60 b(ha)-5 b(v)g(e)60 b(accurate)g(t)-5 + b(yp)5 b(e)60 b(information.)42 7151 y(Another)41 b(in)-5 + b(teresting)39 b(data)i(structure)f(is)g(a)h(sparse)g(matrix)e + (represen)-5 b(tation)40 b(in)g(do)p 5726 7151 V 66 w(sm)p + 6016 7151 V 64 w(minim)-5 b(um)p 6835 7151 V 63 w(co)g(v)g(er)41 + b(function.)-240 7425 y(The)73 b(part)g(of)g(CBU)g(graph)h(sho)-5 + b(wing)72 b(the)h(parts)g(of)f(this)g(data)h(structures)f(is)g(sho)-5 + b(wn)73 b(in)g(Figure)f(4.)118 b(the)73 b(ro)-5 b(ws)73 + b(and)-240 7699 y(columns)81 b(form)h(doubly)g(link)-5 + b(ed)82 b(lists)e(in)j(this)e(data)i(structure.)145 b(All)82 + b(the)h(matrix)e(elemen)-5 b(ts)81 b(are)h(connected)g(in)g(a)-240 + 7973 y(mesh)59 b(form,)g(where)h(eac)-5 b(h)60 b(elemen)-5 + b(t)58 b(has)h(p)5 b(oin)-5 b(ters)59 b(to)h(its)f(four)h(neigh)-5 + b(b)5 b(ors)59 b(along)g(the)h(same)e(ro)-5 b(w)61 b(and)f(column.)79 + b(DSA)-240 8247 y(algorithm)71 b(correctly)h(iden)-5 + b(ti\014es)70 b(disjoin)-5 b(t)71 b(arra)-5 b(ys)73 b(of)f(sm)p + 3816 8247 V 64 w(col)p 4103 8247 V 65 w(struct)g(structures)g(using)g + (con)-5 b(text)71 b(sensitivit)-5 b(y)-15 b(.)114 b(DSA)-240 + 8521 y(also)69 b(\014nds)g(disjoin)-5 b(t)67 b(lo)5 b(cal)68 + b(sparse)h(matrix)g(structures)f(using)h(escap)5 b(e)68 + b(analysis.)106 b(This)69 b(is)g(correctly)f(iden)-5 + b(ti\014ed)68 b(as)h(a)-240 8795 y(lo)5 b(cal)66 b(data)i(structures)e + (as)i(they)f(are)h(not)f(reac)-5 b(hable)67 b(from)f(an)-5 + b(y)68 b(no)5 b(de)68 b(mark)-5 b(ed)67 b("G".)101 b(DSA)68 + b(w)-5 b(as)67 b(able)g(to)h(infer)e(the)-240 9069 y(correct)75 + b(t)-5 b(yp)5 b(es)75 b(for)h(all)e(no)5 b(des)75 b(and)h(none)g(of)f + (the)g(no)5 b(des)75 b(got)g(collapsed.)124 b(F)-15 b(or)76 + b(example,)h(DSA)f(incorrectly)e(sho)-5 b(ws)-240 9343 + y(p)5 b(oin)-5 b(ters)59 b(to)i(sm)p 916 9343 V 64 w(col)p + 1203 9343 V 65 w(struct)f(in)g(stead)g(of)g(sm)p 2914 + 9343 V 64 w(ro)-5 b(w)p 3266 9343 V 66 w(struct.)-240 + 9879 y Fg(5.3)225 b(Metrics:)-240 10270 y Fj(The)61 b(v)-10 + b(alues)59 b(of)h(the)g(describ)5 b(ed)60 b(metrics)f(for)h(this)g(b)5 + b(enc)-5 b(hmark)59 b(are)i(-)f(N=22)-240 10544 y(The)93 + b(main)g(data)g(structures)f(found)h(include)f(link)-5 + b(ed)92 b(list)f(of)i(sym)-5 b(b)5 b(olic)p 5037 10544 + V 64 w(struct,)100 b(link)-5 b(ed)92 b(list)g(of)g(link)-5 + b(ed)92 b(of)h(sym-)-240 10818 y(b)5 b(olic)p 151 10818 + V 64 w(list)p 460 10818 V 64 w(struct)70 b(and)h(sym)-5 + b(b)5 b(olic)p 2120 10818 V 63 w(lab)g(el)p 2563 10818 + V 64 w(struct)70 b(structures,)i(disjoin)-5 b(t)69 b(pair)p + 5051 10818 V 65 w(struct)h(structures,)i(few)e(disjoin)-5 + b(t)69 b(sparse)-240 11092 y(matrices,)97 b(disjoin)-5 + b(t)89 b(set)p 1491 11092 V 64 w(family)h(structures,)97 + b(few)91 b(disjoin)-5 b(t)89 b(solution)p 4748 11092 + V 64 w(struct,)98 b(sm)p 5652 11092 V 64 w(col)p 5939 + 11092 V 65 w(struct,)g(sm)p 6844 11092 V 64 w(elemen)-5 + b(t)p 7521 11092 V 64 w(struct)3809 11672 y(10)p eop + end + %%Page: 11 11 + TeXDict begin 11 10 bop -240 -99 8513 7 v -240 4060 7 + 4160 v -184 4011 a @beginspecial 8 @llx 446 @lly 577 + @urx 721 @ury 5040 @rwi @setspecial + %%BeginDocument: Figures/espresso_cbu1.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 8 446 577 721 + %%HiResBoundingBox: 8.949609 446.999609 576.050000 720.050000 + %..................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/12/02 01:46:05 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{< + ]setcolorspace[0 255]false @X + IC + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**$!0Fzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzz!!!!2&.fB]zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzz((_#mzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!ZD&/P#R18/$3^D5!rrB.z!!!!*#R(2.z!!!!/#64o:$Om7>z!!!9.!!N]0!!ii1!!!-&$31&5 + "TST)"98E%zzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!z!!!32"9Ao2%KQP>#R(23$31&+z%06S3zz#7^_A#n$h:z!!!K0"98f7!!`N0!!!!* + !=f)>!<<*-#ljr*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!!!$#zzz!!!!%!sAW5"pFu,!!EQ-zzzzz$46b5z!XJc+!!!!+"TSr3%KZn9z!"9/; + %0-A.z!!!<1!!!N1"TSN&z!!z!!N]0!!!!/!<<*1$315:z!!!3, + #nI"9z!!!E5%KHJ!"9;Dzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzz!!!!,!=B5B!!!!-#QXr,!C!s/H.#64`(!"&`5%KHJ6"Tnf+"U>&%KQV3!WW3#zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzz!!!!'"TSW/%0Ze= + !!!01%h8RH$31,.!W`<&!=f,3!"'&7!5$O$P3!=/i:!"K#>$NU8/$315:z%KQP0!!!!&$31&+ + !!!'$!!<zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz!"958!!#-%KQ\4z!!!B1zzz!!if0"p586 + $NL5/"TSl:!!!?0!!NW2zzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz + !!!0,!!Nf9!rr]4!!!'$"TSN."TSu8"Utk?!!`T/#6>;@$31&+!!N]0!!!!/!<<*"!!!0/!!!K8 + !!s,8!!`c!"9,?zzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzz#n?q8#6>8B%KR"I + !"T86!"&u4#Qt,2!,/$k34B!"&`3!!!H:!!!91!=]G;$NU87!"/f:!=0/E!H.KBGKzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!C + !s/H.#64`("T]#3z!!`Z0!WWB/!=f)>! + $31/4!!*Q0!!3N.z!!!!&!=Sr.!!W`?&zzz!<<*"zzz!!**#zzzzzzzzzzzz + zzzzzzzzzzz!!**$!1"98E%zz!!!<+"TSN)!WWH1!"/l/%KR%>%KQP<#RUP3zz!!!$"zzz!!!$" + zzzzzzzzzzzzzzzzzzzzzz!!**$zzzzzzzzzz!!!$#!<<*"zzzzzzzz!!!!"!#6=i+z!!!0'"98E%zzz!!!K0!/3z!!`c0z!Y#/2!sJZ*!=/Z5 + $jm"9$46e7$31M9$NL/,zzz!!*'"zz!!!!"zz!!!!&!=9#4"T\W-!4%KQS2%KHJ/#R(29#lk#4z!!!6/%KR%>z!!!0'!F!tGP<$j-\D!s]&?!"'#4!XJc+!!!!)!!sS`*zzzz!!!$"zzzzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzz!<<*"zz!!!$"zz + zzzzzzzzzzzzzzzzz!<<*"zz!!!$"zzzzz%LN1B%hAsH!=f)$O$n=!"Utk?!!!'+z!!iW+!!!!#!rr<$$Od1D!!!K0"98E%z$O$M1z!"K#0!!!?0!!!B,!W`H)$46b5 + $3^D5#Qt,-zzzz!!*'"zzzzzzzzz!!!$"zzz!!!!,!=Af,$k!%F!=/Z*zzzzzz!!!$*zzzzzzz!!!!" + zzz!!*'"zzzzz!W`B+!!!0,z!!!!,!=f)0zzzzzzzz!!!!"zzz!!*'"zzzz!!!!+%KHeG%g`4:"98E* + !!!!K0#QY84 + %LiF>"V(tB%06e;!s&K*#QXr+!!!$#zzz!!!!"zzz!!!B-$31&7$NL/,zzzzz!!NB("TSN&!!`l3zz + !!!$"zzz!!!$#zzz$NUS7!"958zzzzz!!!!"!=f)0!W`<,z!!iW+"T\r1!!!B-%1E4H#QY2 at zz!!**# + zzz!!**#zz!!!!#!zzzzzz!!!$"zzz!!**#zzz"9T,7$igVE!!!!&zzzzz$NL/,zzzz!!**#zzz!!*'"zz + !!!-(%KQt<$4[%9!!N?&zzzz!!!!"%KHJ8!!`c0zz"UY50#6Fl2#65)=!"0,6zz!!*'"zzz!%fcS0!!N?&zzzz!!!00!!!6*!!if0zzz!!!!"!<<*"zz!!!!"zzzzzzz!!!!,!!"TM=#mUG1zz!<<*"zz + !!!!"zzz!!rf9%fctG!!!!&$31&+zzzz!!N]0!!!!#%1W@"T]&@#6PA=!=fA>%KQ\A$4Hn7!=f)0z + %KQbD!s\l0"9f57!!!3/!"B8D!!`r5$4-\4zz!!!!"zzz!!*'"zzzzz!!!!/%h&^E#65#?!"B88 + !=&`.$ig89!=f;C#64`0"qCY:zzzz!!!!"zzz!!*'"zzzzzzzzzzzzzzzz!<<*"zz!!!!"zzz!!!!, + !=B5B!!!!-#QXr6!=Ai:#6>86#QY;6$NL/,!!!E6!tG;2!!30.zzz!<<*"zz!!!!"zzz!"/f7$jlt7 + !"9,6!=Jo8!=]87%0-Y7$NUV8z!!*Q0!!!9,!WW3#!"/f;!!!00!!!!(!=Jl-$k3:Bzz!!!!"zzz + !!!$"zzz!W`B+"TeZ(!!E<'!"T\W)#QOi)zz!!!$"zzz!<<*"zzzzz!!!B8 + "UtY$jZk=!!N]0"UGMD%1EOM!"'/8%gW.8!!!!&$31&+!"KGAz!XJc+zz!!*'"zzz!<<*"zz!!!!"z + zz!!*'"zzz!<<*"zz!!!!"zzz!!!$"zzz!<<*"zz!!!!"zzz!!!$"zzz!!*'"zz!!!!"zzzzzzzzzz + !<<*"zzz!!!E8!!!**%0Zt=$jHeB!s\f+!!3Q6$NL21z!!!K0!Y,;6!XJc2#QP,6"UG)0$jR.D%1E4: + zzz!!*'"zz!!!!"zzzzzz"U4r1%0cn7#R(2;"TSQ5%KR%H$NpJ?!!WE/!WrZ-zzzzz!!*'"zz!!!!"z + zz!!!$"zzz!!*'"zz!!!!"zzz!!!$"z!!!$"zzz!!**#zzz!!!!'"TSW/%0Ze=!!!$$!!*Q0!=fS? + %KHk?z!!!0+z"UY50zz!!!$"zzz!!*'"zzz!!WT,!sT2%KR%>$O$M1!!!!" + %KHJ/!!!97z!=f)0"UY50!!!!($31D:!!rr3zz!!*'"zzz!<<*"zzz!"02=%0cn7"UY55$NL>;!!N]0 + $46b7!<<*"!!!00z!!`i2!!!!##QOi)zz!<<*"zz!!!!"zzz!!!$"zzz!<<*"zz!!!!"zzz!!!$"zzz + !!*'"zz!!!!"zzz!!!$"zzz!!*'"zzz!<<*"zz!!!$"zzzzzzzzz!!!!"zzzz!!s,8!!`N6$igY9 + #Qau-!s&K*$4$Y;!!iZ0z!"K#8!=Af-!=Jo/$4?kF!=&r;!=&T4!!zzz + zzzzz!!!!"zzz!!*'"zzzzzzz!!!90zzzzzzzzzz!!!!"zzz!!*'"zzz!<<*"zz!!!!"zzz!!*'"zzz + !<<*"!!!$#zzzz!8B%KR"H!zzz + zzzzzzzz!!!!"!<<*"zzz!!!!"zzzzzzzz!"'&5zzzzzzz!!!!"zzzz!<<*"zz!!!!"zzz!!*'"zzz + !<<*"zz!!!!"zzz!!!$"zzz!<<*"zz!!!!"zzz!!!$"zzz!!*'"zz!!!!"zzzzzzzzzz!<<*"zzzzzz + zzzzzzzzzzzzzzz!!*'"zz!!!!"zzzzzzzzzzzzzzzzzzz!!*'"zz!!!!"zzz!!!$"zzz!!*'"zz + !!!!"zzz!!!$"!!!$#zzzzz!#eR + &.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBazzzzzzzzzzzzzz + zzzzzzzz!!**$!G!qz!!**$!bNzzzzzzzz!!";s!?qLD!0zzzz!!!$#zzzzzz!<<*"zzzz!<<*"zzzzzz + !!!--zzzzzzzz!!!63!!!!)!WW]D"TST- + #R:>0#QXr5$ig8-zzz!!**#zzzzzzzzzzzzzzzzzzz!!!!"zzzzzz#6k;3!sAf;#64`-$315=$igG< + !"&lD!sB)>%fctB!"0#?!<`T4z!!!34 + #64`-$31,0"98T4!"&l;5!"&l;$NL/,zzzzz!<<*"zzz + zz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzz!!`]2!!sAT*!sAT(!!W]/!Wri9"onW'z#7CM3!!iW+ + %LNCG!!s&>#64`0"p5#/zzzz!!*'"zzzzzzzzzzzzzzzzzzz!!!$"zzzzz!!!K9!!s/H#n@@K%fcb? + !!N]0!!N]0$3^J:z$O6Y3!!!-)#n-e;$P*^I"Ub;6$315:!"'&5!W`?'!!!01!"0#3$O6_=zz!"KDB + %fcb?!!3E+!!N]0$3^J:z"UY50z!!!9+!!!63!!!?9#7V"M#7(;0$3^nA"onW'zzzz!!!!"zzzzzz + !!*'"zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzz!!!!/$31AC%g`^S#7ge<$31,5!!!00!"&l2 + #QOi)!!N]0!!!!%$jd%:!WrZ4!!30$!XJc-#QP2=!!30&!<<*'$NLP>!!N]0!=f)0z!!!!%":5J< + #QOi*%KHP9!!`l3!=f)0!!N]0z!!!!)!WW3*$NL/6%L3FM%L37>!!`l3%1`F=zzzzz!<<*"zzzzz + !!!$"zzzz!!*'"zzz!!*Q>!<<*#%KHM>%KR%@#QOi)!!!0.!=f/:!!!'+!!!E7!=/Z*$O$h:z!!!!( + $NL/,#Qau9$31>8$31>:!!!9+"p5>8zzzz!<<*"zzzzzzzzzzzzzzzzzzz!!*'"zzzzz!"'29#nIOQ + !!WE/!X/l1"UY50"UPSC"V(P;!!N]0$4?hE$Od%>!"/r1 + $O6Y>#7^b>zz!!WE/!X/l1!XJc+"UPSC"V(P!=f/5z$4?t;%KZn9!!3E+!!i`3 + #QOi+!)2!2!/4!=Jl1!=/u4!X/T*$Od7@$3ph:!!!!) + !#-"9S`/#7:J@$jQe?!9zz + zzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzz!!!$"zzzzzzzzzzzzzzz!!!B-!WW3#zzzzzzz!!!!, + !L + ,6.]Dzzzzzz!!"5h!!!$#!<<*"zzzzzzzzzzzzzzzzzzzz!!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzz + zzzzz!%J!M-3+#Gzzzzzz!%9,n!!!$#!<<*"zzzzzzzzzzzzzzzzzzz!!**#zzzzzzzzzzzzzz!!**$ + !<<*"zzzzzzzzzzzzzzzzzzzzzz!%IsK!!**$zzzzzzzzzzzzzzzzzzzzz!!!$#zzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzz-35Fnzzzzzzz,:k8E!Jzzzzzzzzzzzzzzzzzzzzz!$k!%8z!!!66zzzz"TSN&zzzzz%KR%>zz!XJc+zzz!!!$0z!"K#>zz!!*Q0zz!!!K6zzzz + #7^_6z!!`l3!!!9+!"K#:!!!!&!=&T)#Qau0!rr<$zzzzz!!*'"zzzzz!!!$#z!<<*#!<<*"zzzzz + !s/`4%LN19z!!!00zzzz#mUG1zzzzz!"'&5zz!"0#3zzz!!!B3z!!!?5zz!!N]0zz!!!00zzzz"UY50 + z!!!9+!!!63!!!?6%fcS7$O?_4#7CM7#R:>0zzzzz!!!$"zzzzz!!!!"z!zz!=f)0zz!!rl1zzz + !!!E5%KHJ/z#7CM3!!iW+%LW:G!!!B4#64`0!WWQ5zzzzzz!87 + !!EQ.#Qt,2$31)4!"9;;#S$h7z!XJc6!=fMD!so,3!$NL\C$j-VB#S-nC#65,:$ipJ8#QOi)z$O6Y3!"TD:$4?hE#R:e=$4-\9$31&+!!!!- + !sJZ)"UY52!sAT-$31D:$ipJ8#QP#8zz#Qau+#7CM3$4[LM!X/f7!!!63"To/5zzzzzz!:$jH_B$O$M<%0-P=!!3E+%g`4F#64`(!!!!##QOi*%L*@I!!!B3z!!!E0"TSN(#QOi* + #64f2!!`l3%0[4D%L!1>z!!!!)!WW3*$NL/6%LiXE"U>;5!!`l8!t5/0zzzzz!!!!"zzzzz!!!!" + !<<*"!<<*"zzzzzz#lk84$31MB$ig8.%KHkD!!!$0%KQP?#lkD>!XJc+!!!34#64`-$NLMB!!*65 + !=&`.%LrL@%Kcq>#lk,0$j$\7!!*Q6#Rh4Nz!!!!"%KHJ/%0m at D!Y,;;$4d+B"TSQ5z!!!N;"98E0 + #64o:$igY?!!iW1#Rh4N!!*Q0z!!!63!!!!)!WW];"pb28$j[(!"0#5#QOi)z!!!!,#64l5!=Af6$31,."T\W)#QP#8z + !!!!%":5J?$31,5!!!00!"&l2#QOi)!!N]0z!!!!)!WW3*$NL/6%L3FM%L37>!!`l3%1`F=zzzzz + !!!!"!<<*"zzzzz!!*'"!!*'"zzzzz!!!!,$j@(E!rrH4#m:;8!!!$0!!3E+#7CM4%KHJ/!XJc+ + !!!-%$3pP>!sT)4!!*-$!=f)1%L37>!!*-%!WW9&!!N]0!XJc6#64`(z!!!'+!!!$0%L`RQ!"0#3z + !!!-)#n-k@!!!$0!!3E+#7CM4%KHJ/"UY50z!!!9+!!!63!!!?9#7V"M#7(;0#7CM@%fcS0zzzzz + !!!$"zzzzz!!!!"!!!!"zzzzzz!!!N4"9Au5"9],>"98H4!"0#3!!*Q>!<1!%KR%>$O$nA!!!$$!XJc+!=f8?zz!!!$0!!`r6#7^bE!"/r9#R(P8#R:>0#Qb24%KHJ/zzzzz!!!$"zz + zzzz!<<*"!<<*#zzzzzz!!!?9!!s/H#lk/0#Qb/9!!N]0!!NZ;#R(\=#64`($O$M1!!!3'$3^D< + !t,)/"Ub;6$315:!"')6%grdH"TSo6!"0#3$O7.B#64`(z!!!B3%KQV;$31D@!"TG@%1E4:!!N]0z + !!!3'$3^S>!!3E+!!NZ;#R(\=#64`("UP//z!!!9+!!!63!!!?9$j-e9#7(;0#7CM7!=&T)zzzzz + !!!!"zzzzzz!<<*"!<<*"zzzzz!!NQ,"UtY!!!!#!rr<$!"K,A + !<<*'!#6PA=!t5VH!!N`1"UY52#QP2@$ig8-z!!3E+!!*Q0"ono1$O$M1z!!WE1 + "Tec+!!*Q0!WrE/$NLG>!!!!&#ljr*z!!iW+!!`l3!"'2E!snr4#QOi0$NL;1#64`(zzzzz!!*'"zzz + zz!!!$"!!!$"zzzzzz":kJ8!=f,5!Xo;A!!*3&$O6Y3!<`Q,!"'/D!!!'&z!!WE/!WWB)!WW3$!WW62 + !!*Q>!!<`B.#64`0!WWN9$ig8-zzzzz!!*'"zzzzz!!!!"!!!!" + !!!$"zzzzzz"U>#-"9S`/#7:J@$jQe=!!WW6%$4?k?!"/f0$31&+!!!!,!=/`-%16":>J9!!!6)!=Jl5!2#7^h:"TSN&zzzzz!<<*"zzzzz!!!$"!!!$"!!*'"zzzzzzzzzzzzzzzz!!!B,zzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzz!!!!"!!!$"zzzzzzzzzzzzzzzz!!``/zzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzz!<<*"!<<*"zzzzzzzzzzzzzzzz#6t5/zzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzz!!*'"!!*'"!<<*"zzzzzzzzzzzzzzz!!!!,! + Q + 255 G + 3690 5580 2070 1620 re + f* + 4410 5130 990 720 re + f* + 89.9961 5400 180 630 re + f* + 179.996 5470.8 990 668.398 re + f* + 1080 5576.4 990 561.602 re + f* + 1160.39 5540.4 195.602 78 re + f* + 2049.6 5744.4 230.398 258 re + f* + 5709.6 4694.4 21.5977 230.402 re + f* + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 8266 4060 V -240 4067 8513 7 v 1648 4402 + a Fj(Figure)59 b(3:)81 b Fm(CBU)54 b(graphs)i(of)g(link)-5 + b(ed)55 b(list)h(of)f(link)-5 b(ed)56 b(lists)g(in)g(espresso)-240 + 4953 y Fj(structures)k(etc.)-240 5226 y(G=8)-240 5500 + y(L=14)-240 5774 y(All)g(lo)5 b(cal)59 b(and)i(global)e(no)5 + b(des)60 b(w)-5 b(ere)61 b(iden)-5 b(ti\014ed)59 b(correctly)-240 + 6048 y(K=148)-240 6322 y(There)i(w)-5 b(ere)60 b(large)g(n)-5 + b(um)g(b)5 b(er)61 b(of)f(heap)g(no)5 b(des)60 b(in)g(this)g(case)-240 + 6596 y(I=67)-240 6870 y(Man)-5 b(y)61 b(disjoin)-5 b(t)60 + b("`H"')h(no)5 b(des)61 b(w)-5 b(ere)62 b(found,)f(whic)-5 + b(h)61 b(signi\014es)f(the)i(large)f(n)-5 b(um)g(b)5 + b(er)61 b(of)g(disjoin)-5 b(t)60 b(data)h(structures)g(iden-)-240 + 7144 y(ti\014ed)f(b)-5 b(y)60 b(DSA)h(algorithm.)-240 + 7418 y(O=0)-240 7692 y(None)g(of)f(the)g(no)5 b(des)60 + b(w)-5 b(ere)61 b(collapsed)e(in)h(this)f(case.)-240 + 7966 y(C=47)-240 8240 y(Large)78 b(n)-5 b(um)g(b)5 b(er)78 + b(of)g(no)5 b(des)78 b(are)h(reac)-5 b(hable)77 b(from)h(a)g + (collection.)132 b(This)78 b(pro)-5 b(vides)78 b(a)g(hin)-5 + b(t)78 b(on)g(the)h(large)e(n)-5 b(um)g(b)5 b(er)79 b(of)-240 + 8514 y(non-trivial)58 b(data)j(structures)e(found)h(b)-5 + b(y)61 b(DSA)g(in)f(espresso.)-240 9424 y Fk(6)269 b(Results)89 + b(for)i(300.t)-7 b(w)g(olf)-240 9886 y Fg(6.1)225 b(Summary:)-240 + 10277 y Fj(This)55 b(is)g(a)h(part)g(of)f(the)h(SPEC)f(INT)h(2000)g + (Benc)-5 b(hmark)55 b(kno)-5 b(wn)56 b(as)f(Tim)-5 b(b)5 + b(erW)-15 b(olfSC)54 b(placemen)-5 b(t)54 b(and)i(global)f(routing)-240 + 10551 y(pac)-5 b(k)-10 b(age.)146 b(This)82 b(b)5 b(enc)-5 + b(hmark)82 b(determines)f(the)h(placemen)-5 b(t)81 b(and)i(global)e + (connections)g(for)i(groups)f(of)h(transistors)-240 10825 + y(whic)-5 b(h)82 b(constitute)d(a)j(micro)5 b(c)-5 b(hip.)143 + b(The)82 b(placemen)-5 b(t)80 b(problem)h(is)g(a)h(p)5 + b(erm)-5 b(utation.)142 b(In)82 b(stead)f(of)g(a)h(simple)e(brute)-240 + 11099 y(force)61 b(exploration)f(of)h(the)g(state)f(space,)g(the)h(Tim) + -5 b(b)5 b(erW)-15 b(olfSC)60 b(program)h(uses)g(sim)-5 + b(ulated)59 b(annealing)h(as)h(a)h(heuristic)3809 11672 + y(11)p eop end + %%Page: 12 12 + TeXDict begin 12 11 bop -240 -99 8513 7 v -240 4209 7 + 4308 v -184 4159 a @beginspecial 53 @llx 458 @lly 576 + @urx 720 @ury 5040 @rwi @setspecial + %%BeginDocument: Figures/espresso_cbu2.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 53 458 576 720 + %%HiResBoundingBox: 53.999219 458.600000 575.400000 720.000000 + %................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/12/02 01:46:10 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{< + ]setcolorspace[0 255]false @X + IC + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!WrQ."U,&6#6tJ=#6tJ=#6tJ=#6tD9"UG5; + !X\o-zzzzzzzzzzzzzzzzzzzzz!!*-/"9],:"U52:#6tJ=#6tJ=#6tJ="U,&8":5,2zzzzzzzzzzzzz + zzzzzzzz!!!'%"9]/;"V(bB#6tJ=#6tJ=#6tJ<"U,;;"9JW)zzzzzzzzzzzzzzzzzzzz!!!!0!Xf,6 + "U,&@#6tJ=#6tJ=#6tJ=#6b87#QtG8$31&+zzzzzzzzzzzzzzzzzzzz!!!N2$NpS@"U,A@#6tJ= + #6tJ=#6tJ=#7^n@%0Qe8!Y582zzzzzzzzzzzzzzzzzzzz!!!!+!XSu8"U,A@#6tJ=#6tJ=#6tJ= + &-W4@"9])6%fcS0zzzzzzzzzzzzzzzzzzzz!!!$$!sA`1"U,GB#6tJ=#6tJ=#6tJ=&-W4@#QtG8 + $31&+zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"'):$k89"U"r1!Wi]/zzz!!33' + !sAl5"U>89%0Q_Czzzzzzzzzzzzzzzzzz!!*H1"U529"UtS@!WiE'zzz!9#Qk,.zzzzzzzzzzzzzzzzzzzzz + zzzzzz%fuk;&.f!J!s/H&zzzzzzz!!!!"!X&rB#7_1F!<<*"zzzzzzzzzzzzzzz!!!!#"9f>J"U"o/z + zzzzzzz!!*-(%1WUQ%0HV2zzzzzzzzzzzzzzzz$NpV<"q1V9$31&+zzzzzzz!J$jd7 at zzzzzzzzzzzzzzzz!XT8>#6bA>!Y582 + zzzzzzz!!!N2#m^\>"q1eFzzzzzzzzzzzzzzzz!!39,&.f!J$OQk6zzzzzzz!"T,;%1WUQ%0HV2zzzz + zzzzzzzzzzz!!!!0$O?n@"pG,;!WW3#zzzzzzz!!!?-":PbF%L<.;zzzzzzzzzz"q:q?zzzzzzzzzzz + zzz!"&i4#7_"I!<<*"zzzzzzzzzz!!393&-`RO%fcS0zzzzzzzzzzzzz!!!!+"9f#?#R^Y5zzzzzzzz + zz!!!!##n. at L%0I+ at zzzzzzzzzzzzzz!=8o7%LM?$31&+zzzzzzzzzzzzz + !!!B4"qV1L!WW3#zzzzzzzzz!!!!"!t>GG$j."?zzzzzzzzzzzzzz!=9/G"q:YAzzzzzzzzzzz$3L_A + &.AXAzzzzzzzzzzzzzz!"T/?&-`RG!<<*"zzzzzzzzz!!!!#":PM>#Qau+zzzzzzzzzzzzzz!XK8@ + "U#2Dzzzzzzzzzz!!!!0!X&Z3"pbS:zzzzzzzzz$4%+Q%1<.9zzzzzzzzzzzz!!!?3"pPME%fcS0zzz + zzzzzzzzz!"&i=#7L\Fzzzzzzzzzzzzz$4$hI%1<[Hzzzzzzzzzzzz!!!!+#n at 1K!tPA3zzzzzzzzzz + zz!!*B9&.J^Pzzzzzzzzzzzz!"TGH&-`C at zzzzzzzzzzzz!!!!,%1i^L!WW3#zzzzzzzzzzz!!!!" + #mCPB!tPA3zzzzzzzzzzzz!!*B9#7L\8zzzzzzzzzzzzz!=9/>%LE.9zzzzzzzzzzzz!!!N3"U>GB + !<<*"zzzzzzzzzzz!!!!##R1hL!WW3#zzzzzzzzzzzz!"05I"pbSIzzzzzzzzzzzzz!XK8I$j-J0zzz + zzzzz!!!!""9o&5!<<*"zzzzzzzzzz!!!!""9o&9$31&+zzzzzzzzzzzzzz!=95@%0?M0zzzzzzzzzz + z!"TA?&-rUCzzzzzzzzzzzzzz!!!N3"U>JJEzzzzzzzzzzzzzz!"05I + %Kc\2zzzzzzzzzzz%g3(@#RUP3zzzzzzzzzzzzz!!!N3%M0'Vzzzzzzzzzzz!!!N3%M0'Wzzzzzzzzz + zzzzz!!!!0!t5D?zzzzzzzzzzzzzz!!!!"#n at LU$31&+zzzzzzzz!!!'0#7U\6zzzzzzzzzz!"'/?$k!%8zz + zzzzzzzzzzzzz!!!!""9o&4zzzzzzzzzz!!!!"%0m:Lzzzzzzzzzzzzzzzz!!*3,"p5A9zzzzzzzzzz + !!.zzzzzzzz%g3FQ!<<*"zzzzzzzzzzzzzzzzz!!!!"$kNOAzz + zzzzzz!!!$'&-Dn4zzzzzzzzzzzzzzzzz!!*N?#ljr*zzzzzzzz!.zzzzzzzzzzzzzzzzzzz!tYVHzzzzzzz!!!!0#S7:Bzzzzzzzzzzzzzzzzzz!!!*4$kE=1zzzzzzzz!!!!+&.JU>zzzzzz!"'2E%fcS0zzzzzzzzzzzzzzzzzzz + z!!%M&O>zzzzzz%h&pTzzzzzzzzzzzzzz + zzzzzzz$3gq>zzzzzz!!!N>"V1S5zzzzzzzzzzzzzzzzzzz!!!Bzzzzzzzzzzzzzzzzzzzz!!!*+$NL/,zz + zzz!!!H<$31&+zzzzzzzzzzzzzzzzzzzz%1WmKzzzzz!!!!0%Ls!Lzzzzzzzzzzzzzzzzzzzzz!"TPK + zzzzzz!"TPKzzzzzzzzzzzzzzzzzzzz!!!!+&.&=:zzzzz!!!!+&-Dn4zzzzzzzzzzzzzzzzzzzzz + !"0>?zzzzzzzzz!"T8:zzzzz!!!!0"p=o+zzzzzzzzzzzzzzzzzzzzz!!!!+&-Dn4zzzzz!"TPKzzzz + zzzzzzzzzzzzzzzzzz!"'8>zzzzz!!!!0&-Dn4zzzzzzzzzzzzzzzzzzzz!!!!$&./C;zzzzz!!zzzzzzzzzzzzzzzzzzzzz!!!N>%0-A.zzzzz + !"KGzzzzz!!!?;!rr<$zzzzzzzzzzzzzzzzzzzzz!!!?;$NL/,zz + zzzzzz!!!?;!WW3#zzzz!!!!&%0-A.zzzzzzzzzzzzzzzzzzzzzz$3pnz(E!2Qzzz!!NK*zzzzz"U"f* + zzzz()[>uz!#-1Kzzzzzzz!!!Z;#8n?Yz!"oMKzzz!!!?2!<<*"zzzz!!*<3zzzz()[>uz!#-1Kzzzz + zzz!!!`M)%ciK!#PqG#6tJOz!"fGKzzz$4m48DQzzzzzzz!#l^S&el5azzzzz!!!!.%0-A.zzzz!"B&2zzzz'HRkl'*&"4*>8DQzzzzzzz + !!!uD#8$q9!#ugU!!!uZzzzzz!"BA;zzzz!!!!."98E%zzz!!!!6#87[S(]XO9'G^ZKzzzzzzz'bh8\ + !!!oVzzzzz!!!N@$31&+zzzz%hJaAzzz!!!!<#8e6q'`\4H'GUTJzzzzzzz!!!oB#8.":!#-IS(^D&] + zzzzz%hJdBzzzzzzzzz!t5/0zzzz!"08:zzzz&I0-c#87(;',(?G!!!!?zzzzzzz'*f-Mz!#>eVzzzz + z!!!*0zzzz!!!!,"onW'zzz!!!T9(_R&e!!!ZGz!$2+?zzzzzz!!!Z;&c_n3'c at _dzzzzzz!tG;2zzz + z!"&o1zzzz!!!f?!"fGQ!!!uSz'c[2Rzzzzz!!!!6)BAeX',hSczzzzz!!!0)zzzz!!!!.#ljr*zzz + !!!!3#87(T*WQ0U)uos=!!!ZLzzzzzzz!##S;zzzzz!!!!"&-)\1zzzz%gNUFzzz!!!!3#87(T*WQ0U + )uos=!!!ZLzzzzzz!!!!9#8$q9!#P\9!#6Chzzzzz!!*W2zzzz!!!N7!<<*"zzz!!!!2#8e'Y'*&"G + '*&"4!!"&?zzzzzz&eY0E!#QUhzzzzz!!!!)%0-A.zzzz#n-e6zzz!!!!8#65>@(]XOU('"=7!#6IRz + zzzzz!!!!4#8.":)[@,Y!$):Zzzzzz!!E`2zzzzzzzzz%gN(7zzzz!!i]-zzzz&I0-c#87(Q'EA+5 + !!!Z;zzzzzzz'*f-Mz!#lUPzzzzz!!!N7zzzz!!!!%#QOi)zzz!!!T9(_R&e!#?7Kz'*eL;zzzzzz + !!!Z;&c_n3'*ea[(DZuNzzzzz!!`K(zzzz!!EQ-zzzz!!!f?!"fGQ!#$@Qz*Zb:]zzzzz!!!!<#9*XC + (^Cu[zzzzz!!!<7zzzz!!!!1!<<*"zzz!!!!3#87(T*WQoh&c_n3!#PqXzzzzzzz!$*'[zzzzzz + %KZV1zzzz$O$M1zzz!!!!3#87(T*WQoh&c_n3!#PqXzzzzzz!!!!9#8$q9z!#lgVzzzzz!!!K1zzzz + !!!'(zzzz!!!!2#8e'Y'*&d^z!##S;zzzzzzz!$*$Zzzzzz!!!!+"onW'zzzz$j-J0zzz!!!!8#65>@ + (]Y3iz!$30]zzzzzz!!!!4#8.":'*f-M!#l.^zzzzz!"&o1zzzz!#6:T&c_n3zzz!"]/2zzzz!!NE(z + zzz&dK'^#8dFT&c_n3!##SB#8\$l)\`Mk&f_,]&HEI^',1Zh('"=7z'*f-Mz',hVdz!#?Olzzz!!!!' + $31&+zzz!!!!&$NL/,zzz!!!W:'+kHd!#-%G!!!!4#6tJM',hf(#8 at dj#6th@',_Gt#8n9Wz!!!Z; + &c_n3!!!ZK#9EjF!!!!7*#S_Vzzz!"K&1zzzz!"8r0zzzz!!!T9(`+)*&ek&dK'M!!!!7*#S_Vzzz!!!'(zzzz!!!!(zzzzz)'0Cq'*&gfz + (^C9N)%dPr(C(iq'*eaY!#QCd*X;o^zz(E*8Rz!#$4^zzzz$j-J0zzzz"9\])zzzz)'0Cq'*&gfz + (^C9N)%dPr(C(iq'*eaY!#QCd*X;o^z!!!!9#8$q9z!$!!Zz'c.)fzzz!!!92zzzz!!!--zzzz!!!!3 + #87[S(]Y6_z'*eaI(D@]+'F,Hf!#u4^(]Y?W!"fG@'GVPl'Gpff + )&iec'GVB%)#sX:z'*f-M!!!!8#6u._z!#,YUzzz!!!!&!WW3#zzz!!!!&!WW3#zzz!!!!2#6u%F + *>&8k#9"EZ(C'pP#6tqX)[@&o!#ZXn#6tqX()e%jz!!!Z;&c_n3z(C(ZT!!!!5#8mLAzzz!!NE(zzzz + !!NE(zzzz!!!!8#6th@'G;#m#8 at dN)'/bo#6u%F*=!Vu&dK3n#6u%F&I0*P!!!!4#8.":&dK'M!!!!5 + #8mLAzzz!!!'(zzzz!!!!(zzzzz()[>k'cRqh'*eaU!"fGQ&dJXZ((qN('*&gR('b'^()7Mg&c_n3 + !!!!:#6tqXz)[?T[zzzz"9\])zzzz"9\])zzzz()[>k'cRqh'*eaU!"fGQ&dJXZ((qN('*&gR('b'^ + ()7Mg&c_n3!!!!9#8$q9z'cInhz*#52zzzz!!i]-zzzzz'bhA_(C'pP#8S*\!!!T9(]XO@(B=FO#65SG&HDeC#9*XCz + '*f-Mz!!!]Sz!!"&Xzzz!!!N7zzzz!!!!%#QOi)zzzz!!!`J'`]$T!"fGO(C'p?&I0-Q!!a;?!#Gk? + (^CWQ!"fGTz!!!Z;&c_n3z&dK$Lz*Z4qXzzz%gN(7zzzz!!EQ-zzzzz!!!cS!!!lX!#HOR)'/bX + (C'p?(^CWQ!#ZgX'*f-M!#GkT!!!!<#9*XC)[@;^z*Z4qXzzz!!!<7zzzz!!!!'$31&+zzzzz*#8Md + #8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!W:*<6'>z!#5_Pz!#PqQzzzz"pt>1zzzz$P!.:zzzzz + *#8Md#8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!W:*<6'>!!!!9#8$q9z*$#"Zz!##SMzzz!!!K1zzzz + !!!'1zzzzz!!!!6'GUTa#65>@()I2U!"fGQ!!!6?!!!f?!##SM!!!f?'`\46z)B/YVz!##SMzzz + !!!!#%KHJ/zzzz$j-J0zzzz!!!!7)uosV*WQup!#ZgX!"fGQ!!!6?!!!f?!##SM!!!f?'`\46!!!!4 + #8.":z'cIkgz!$3!Xzzz!"&o1zzzz!!!Z;&c_n3zzz#n-e6zzzz!"/u2zzzzz*#ekX(C'pP#8S*\ + !!!T9(]XO@(B=FO#65SG&HDeE#8R:>z'*f-Mz!!!uZz!!"&Xzzz!!!<6zzzz!!!!+"onW'zzzz!!!uX + !!!f?!"fGO(C'p?&I0-Q!!a;?!#Gk?(^CWQ!##SQz!!!Z;&c_n3z)\`8Pz*Z4qXzzz!t5/0zzzz + !"&o1zzzzz!#61\!!!lX!#HOR)'/bX(C'p?(^CWQ!#ZgX'*f-M!#umW!!!!6)BAeX*?#Xmz*Z4qXzzz + !!!K2zzzz!!!!."98E%zzzz!!!!4*<6'O#8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!c>'*&"4z!!!oV + z!#PqQzzz!!!!+&-)\1zzzz%gN+8zzzz!!!!4*<6'O#8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!c> + '*&"4!!!!9#8$q9!!!!6)AiGSz!##SMzzz!!*W2zzzz!!!!1!<<*"zzzz!!!!=)ZTjS#65>@()I2U + !"fGQ!!!6?!!!f?!##SM!!!uWz!!!!9)AN5Pz!##SMzzz!!!!)#QOi)zzzz!sJZ)zzzz!!!`J&c_nL + *WQup!#ZgX!"fGQ!!!6?!!!f?!##SM!!!uWz!!!!4#8.":z*Z5[mz!$3!Xzzz!!ii1zzzz!!!f? + ('"=7zzz"p+c)zzzz!!!3*zzzz!!!!<*<6'>&I0-m)?:QY&f22d'*&aP)uosQ#8J'\*WQfj)uos=z + *=!>[z!"g+^z!!!lTzzz!!!3)zzzzz"p4i*zzzz!#lpY!!!T9(`XFo(C(Qh'*f0N'aG]Y!#,YQ(^D)^ + &fDYhz!!"#E('"=7*>/>h)&<2Pz)&`JTzzz"p4i*zzzz!!!3*zzzzz!$*!Y!!!fR&fDYh)&*o$*![5Z + )[@#V'aGEQ'*f0N(^C]Sz',hK!)A<)Nz)&`JTzzz!!3]3zzzz!!!!#&.\a at zzzz!!!WQ!!!!3#87aU + ((gcj*#8c!!!!]O!!"#E)ZU*\&c`sj'`\46z!#H=Lz!"fGLzzz!!!!."98E%zzzz!"BA;zzzz!!!WQ + !!!!3#87aU((gcj*#8c!!!!]O!!"#E)ZU*\&c`sj'`\46!!!!<#87(;!!!!<)#sX:z!#GkUzzz!"B&2 + zzzz!!!!.%0-A.zzzz!!!rY!!!!2#8eF!!#GkQ(D@#e!#5_Y!!!]<'b^fc!#PqSz!!!!>(B=F8z + !#GkUzzz!!!N@!<<*"zzzz%hJdBzzzz!!"#Y!!!!8)A3o-!#ZIf',(Ta!#5_Y!!!]<'b^fc!#PqSz + !!!!>#8R:>!!!TF)%loLz!#Z[Tzzz%hJaAzzzz&f1cX#8.":zz!!!!%"TSN&zzzz!!!B2%fcS0zzz + !!!WGz!#GkY(]YBX)%d)Y#87=I#9Fok#6u(N*X;ok'`\gN&HDeP#6tJG!#l.J#94?V!!!lS!#Z"H + )#sX:zz!!EH*zzzzz!Y>kBzzzz&ek!#GkQ(C(0M&c_n3zz!Y>kBzzzz!!!!"#7:G2zzzz!"otGz(C(iq!#PqY&I/OG'*eaI*ZbOk + #87=`#6u7L!"fGJ!!!!;)ZTjA4zzzzz!"B)3zzzzzzzzzz + z(^CWQzzzzzzzzzz!!!?;$31&+zzzz!!!!-%0-A.zzzzzzzzzzz'*f-Mzzzzzzzzz":bD3zzzzz + !>#;4zzzzzzzzzzz!!!6?zzzzzzzzz!"T8?zzzzz!!!<0%fcS0zzzzzzzzzz!!!6?zzzzzzzzzz + !!!!0&.8I=zzzzz!!!Kzzzzz!!!!0%LiCzzzzz!!!!0"pb2/zzzzzzzzzzz*=!>[zz + zzzzzz!!!!$&-2b2zzzzz!!zzzzzzzzzzz!#5_Yzzzzzzzzz%h9$Kzzzzz!!!!.%M&O>zzzzzzzz + zz!#5_Yzzzzzzzzzz!!!N>%0-A.zzzzz!"989zzzzzzzzzzz!$):[zzzzzzzzz$4mRFzzzzz!!!N@ + !rr<$zzzzzzzzzz!$):[zzzzzzzzzz!!!*4$31&+zzzzzzzz$4mICzzzzzz%h9$Kzzzzzzzzzz!"fG@ + #87(;zzzzzzzzz!!!'3!rr<$zzzzz!!!N>%1`F=zzzzzzzzz!!!!2#6tJIzzzzzzzzzz$4m:>zzzzzz + $4mICzzzzzzzzzz!!!!8#6tJNzzzzzzzz!!!*4$31&+zzzzz!!!*4$31&+zzzzzzzzzz&dJXH*WQ0?z + zzzzzz!!!!0%LrI=zzzzzz%1WmKzzzzzzzzzz&dJXH*WQ0?zzzzzzzzz!!*Q=zzzzzz!"TPK%fcS0zz + zzzzzzzz(C(0M(]XO9zzzzzzz!!!!+&-Dn4zzzzz!!!!+&-r79zzzzzzzzzz(C(0M(]XO9zzzzzzzzz + !!zzzzzzzzzzzzzzzzzzzz!!!!*#6Or+zzzzzz!"&o>%fcS0zzzzzzzzzzzzzzzzzzz!!j,Czzzz + zz!!!!$&.8IV;z + zzzzz!!!N>%KQP0zzzzzzzzzzzzzzzzzzz!!!*+!rr<$zzzzzz$4[ITzzzzzzzzzzzzzzzzzzzzz + #S7=Czzzzzzzz!!!99!rr<$zzzzzz!!!N=&.8IH!<<*"zzzzzzzzzzzzzzzzz!!!!,"pGM;zzzzzzz!!!!*&.AR>zzzzzzzzzzzzz + zzzzzz%g3+?zzzzzzzz!!!$.&.&=:zzzzzzzz!"T2;%06G/zzzzzzzzzzzzzzzzzz!sSo1zzzzzzzz + !!!!0":#A:zzzzzzzzzzzzzzzzzz!!!**%KZV1zzzzzzzz!!*6-!rr<$zzzzzzzzzzzzzzzzz!sT5:z + zzzzzzz!!!!$&-WC at zzzzzzzzzzzzzzzzz!"T2;#S-n8zzzzzzzz!!tzzzzzzzzzz!!!!+#R1hL$P*4;zzzzzzzzzzz!!!!##R1hL$NL/,zzz + zzzzzzzzz!"T/?#7^kDzzzzzzzzzzzzz!X&u<$j."?zzzzzzzzzzzz!!!!,%1j!T!WW3#zzzzzzzzzz + z!!!N3%1i^H!<<*"zzzzzzzzz!!!!O!rr<$z!"&u9&.AXAzzzzzzzzzzzz!!!!0$OmXO#RUP3zzzzzz + zz%Km+=z!!!!G)^ZgU0,4Hezzzzzzzzzz!!*01&-`OL!WW3#zzzzzzzzzz!=K/C#7^kDzz!%&X3 + ,U>#Xzzzzzzzzzz!!!!"!t5_P$jct8zzzzzzzzzz!!!$-#S%(L#Qau+z!!!!Q+s.OS,U>)hzzzzzzzz + zz%g*7P"q:kGzzzzzzzzzz!"&f;"qV1F!<<*"z1*Re?zzzzzzzzzzz!!!?4"U>MC$P*4;zzzzzzzzz + !!!!#":PM>#R^V4zzzzzzzzzzzzzz%grgN&-W1<%fcS0zzzzzzzzz!!!!0!X&Z3"pbS:zzzzzzzzzzz + zzz!!!B9"qV1L!WW3#zzzzzzzzz!!!$-#S%(C#lt#+zzzzzzzzzz!$Niu1DKlizz!=9/G"q:YAzzzzz + zzzzz!!!!"!sfAA"U#/4zzzzzzzzzzz!!!!U0E;(r.gRXZ'`\46zzzzzzzzzz!"'#A"pYVI"9Jo1zzz + zzzz!!!N2!sAc=&-W1<%fcS0zz!%T`'!$Niu2(o[Ezzzzzzzzzz!!!!+#n7 at L%LiOB$31&+zzzzzzz + %fuh9"V;4K":G_?zz!!!!B,6.]D!$a3B,VKl4zzzzzzzzzz$4.+F#6bA>!Y582zzzzzzz!Wr]3&.f6Q + !WW3#z!!!!D#W5?":GP:zzzzzzz!!*-(%1WUQ%0HV2zzzzzzzzzzzzzz + zz!$N^;.zzzzzzz!!!'.":PJ>"UG22zzzzzzzzzzzzzz!!"N'z!!*02%L3IQ"9JT(zzzzz + zz!!3N2"U528"9JQ'zzzzzzzzzz!!!`\,U>#X-7Aiozzz$4.+F#6bP>!W`9$zzzzzzz!"T,;#R(bN + "U"l,zzzzzzzzzzzz!!!!Q'`\46!$89$j6q=zzzz!&,,f!!!!@0ImDd0d$Grzzzzzzzzzzz!XT,9"pY>9$j6\8!WiE(zz + !!!'%!WiK-#R(A:#6bM=$NU5-zzzzzz+XdUQ0HU8pzzzzzzzzzz%fukC"U>89"U"r7!WiE(zz!"T,4 + !WrQ."U,,9%L`IJ!<<*"zz!!")u/hmV['`\46zzzzzzzzzzzz!!!?."9eu7"pGD<":G84!WW3#z + !!!!+!WiE+":YME#7q%E#m(),zzzzzzzzzzzzzzzzzz!"&f2"V(bK"U,#3#m(/0$31&+z!!!!+!WiE0 + "9\l3&-i[K"9Su2zzzzzzzzzzzzzzz!!"\uzz!!!',#R(bE%L!+@"9JW+$31&+z!!!N2!Wi`4":PGF + #7^n?$OQk6zzzzzzzzzzz+Y*gH+92BA+".*hzzzz%g!%C"V:nC"UtS;$N^A2%fcS0z!!!!#!WiE+ + ":YME#6tDA"9JT(zzzzzzzzzzzzzzzz!$Na9+tG>^zzzzzzzzzzzz$3C;4":PG;"V:nD#6tJ=#6tJ= + "U,&5#Qt83!WW3#zzzzzzz!!!!B0dIqn0GOQfzzzzzzzzzzz!!!?-!sA`8"U,&@#6tJ=#6tJ=#6tD9 + "U,/7"9JW8zzzzzzzz!!")p1^GKQzzzzzzzzzzz!!!N2!X&W8"U,&6#6tJ=#6tJ=#7q%B"UtS;$N^h= + zzzz!!!`^!!!`^#VdD$zzzzzzzzzzzzzz!8;#6tJ=#6tJD"U,&8":5,2zzzzzzzzzzz + zzzzzzzzzz!!!!"!Xf,6%0Zn="pYA<#6tJ=#6tJD"U,&="9])6!<<*"zzzzzzzzzzzzzzzz!!"Z. + 0E;(Qzzz!WiK-#R(A8"pYA<#6tJ=#6tJ;"U,;;"9S]+zzzzzzzzzzzz!#744,VL5>zzzzzzz!!!!+ + !WrQ.$j?e<&-iFF#6tJ=#6tJ;"U,&4":5,2zzzzzzzzzzzz!$O'Szzzzzz'e_'C2)-b8hzzzzzzzzzzzzzzzzzzzz!!")t2'W)$zzzzzzzzzzzzzzzz + zzz!&#Dozzzzzzzzzzzzzzzzzzzzzzz!$NOC'`\46zzzzzzzzzzzzzzzzzzzzz!$4zzzzzzzzzzzzzzzzzzzz!!"n_0)ttPzzzzzzzzzzzzzzzzzzzzz!!">O0cpAqzzzzzzzzz + zzzzzzzzzzzz+##Pr0bjZgzzzzzzzzzzzzzzzzzzzzzzzzz!!!!D-8Yuc0d-Mszzzzzzzzzzzzz + !!!!D0IS1P1bg-gzzzzzzzzzzzzzzzzzzzzzzzzzzz+=8rO1aX=Fzzz+5&g-o>,s1c,ID2)I$7+Wpabzzzzzz!!!!60-h_r,6.]Dzzzzzzzzzzzzzz + zzzzzzz!!!!@-6b8hzzzzzzzzzzzzzzzzzz!&Z)'zzzzzzzzzzzzzzzzzzz1aW2&zzzzzzzzzzzzzzz + zzzzz!!!!D1aF1Dzzzzzzzzzzzzzzzzzzzz!!")o,U=]Ozzzzzzzzzzzz!$`U/+-71&d-71&d-70lY+6+p\H31c-O+0-DA^zzzzzz!!!!@+Ybh[2)-d"zz + zzzzzzzzzzzzzz+O-6E3fzzzzzzzzzzzzzzzzzzzz+=ILG+TMKBzzzzzzzz!!"5d+<`'Y-7^o01a322#UD5`1c-p6 + -71&_+5&g1c.#p#RD\41c-O+-86Pb+;FkVzzzzzzzzzz+!;m\,R?4] + 0GOQfzzzzzzzzzzzzzzzzzzzzzzzzzzz,9\Ba2$bHa-86PBzzzzz!!!!D+)hzzzzzzzzzzzzzzzzzzzzz!!!!@0aK0Bzzzzzzzzzzzzzzzz!!!!6+s6jczzzz + zzzzzzzzzzzzz!#5bSzzzzzzzzzzzzzzzzzzzz!&,TI*rl9 at zzzzzzzzzzzzzzzzzzz'db1O0,4Hezz + z,9SWd.l8LW#W+ at m/jM'B/g_u'1c5OE#RE7D1c.$D-71&d-71&d+WqmM+zzzzzzzzzzzzzzzzz!&Q#&zzzzzzzzzzzzzzzzzzz!!!!61aF1Dzzzzzzzzzzzzzzzzzzz + !!"/m#Ugeqzz!$EF3-o<1T+uC\p5VGGN1c-H`#W+ at g-71Ag+61c-H`#RC\]1c.$G0d\4o-86Pb+O + 0cpAqzzzzzzzzzzzzzzzzzz!!!!6-6sii*rl9@!!"5d-7C\p#W4Fc0/#O:.l7M;2)I$70H_S?zzzzzz + zzzzzz,9SP1bgX+'`\46zzzz!!!!D+qzzzzzzzzzzzzzzzz!!"5s.jQ;h0-C5pzz!!")p2'OFlzzzzzzzzzzzzzzz + zzzzzz!#6mf-ku^^zzzzzzzzzzzzzzz!$l#$zzzzzzzzzzzzzzzzzzz!$Niu-m/Ki'd4nS2$bB_0d\#+0/5:-#W4Fc0H_)1zzzzzzzzzzzz + ,9SWd.l8FU,W%5&+X6sezzzzzzzzzzzz!$`U/+P1aXn!zzzzzzzzzzzzzzzz!!!`f-mT'K0-^Gszz!#6h+ + ,V^MDzzzzzzzzzzzzzzzzzzzz!!!!6-jV4Czzzzzzzzzzzzzzz!!"/d'`\46zzzzzzzzzzzzzzz + !!!!G1]RLUzzzzzzzzzzzzzzzzzz!!")q+tiorzzzzzzzzzzzzzzzzzz!!!`\,U>$'0/59h+uD#- + +a.jcA`zzzzzzzzzzz!!!!A+>>,s1c,ID,W$nr0-Cu0zzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzz!!"5d+>>,h0f1^D2$aHn#W4Fq1c-p6-71&d+WqmM+'`\46zzzzzzzzzzzzz + zzzzz!$NUE'`\46zzzzzzzzzzzzzzzzzz0ImDu2Dkac.jcAR'd4n\+sJij0I$Ptzzzzzzzzzz,9S*U + -8@>6,R=Z51b0n"+55j#W*kO'`\46zzzzzzzz+!;[L-71,t1aE>4,W%>4-70iX,6.]Dzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz,<.)42*M9O2%qf) + -pf7;1c.$7#RC\[1c.$D-71Dh+>,j1aE>N1c-O++zzzzzzzzzzzzzzz+!Mj.z + zzzzzzzzzzzzzzzzz'f70Yzzzzzzzzzzzzzzzzz!$a-I*??U459Bk*+>G_Z2)-6rzzzzz!!!!6+<`'Y + .l9*h#U2)^-mg8a+>,s1c5OE2)H^.0H_S?!!!!@+:zzzzz'e_'C2(o[Ez!!"/j+uM"qzzzzzzzzzzzzzzzzzzz!!!!6-mBu[zzzz + zzzzzzzzz!!")b+TMKBzzzzzzzzzzzzz!!!!D+r((Xzzzzzzzzzzzzzzzzz!$F-V,6.]Dzzzzzzzzzz + zzzzz!!",r2$b]Z8g6,H,;:Vl,UafXzzz!!!!6+>5&u1^F at E1bg=#+;FkVzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + 'd+YH0f1]m#W4Fe-86PWz+!;^R-o;281aj[o,6.]Dzzz!!!!@0IS,&0,4Hez+##2N.ki%Fzzzzzzzzz + zzzzzzzzzz!#6n+-ku^^zzzzzzzzzzzz!!!!B+r((Xzzzzzzzzzzzzz!!!!U-3+#Gzzzzzzzzzzzzzz + zz!!!!@0d87Nzzzzzzzzzzzzzzz!!")a-mBok+YY_s-jh[d#V.PCzzz!$EsB.l at SV1aj\)+5H++p^%S-6O$'zzz!!!!B-mBok,6.]D + !!!!@0/Xq%+TMKBzzzzzzzzzzzzzzzzzz!!!!6-jV49zzzzzzzzzzzzz0f/k1zzzzzzzzzzzzz!!"Yt + zzzzzzzzzzzzzzzzz!!",e1_fujzzzzzzzzzzzzzz!!!!@0ImDd0-_2d+ql\"+s\ldzz!!!!D+XT#k + #UD5R0H_G;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!$`U>-8[Ob#W4Fc0-Cu0!$<=:0f0.[1bg[/zzz + !!"/j+s\fVz!!!`\,U+rfzzzzzzzzzzzzzzzzzzz!#6mf-ku^^zzzzzzzzzzzz+#PAFzzzzzzzzzzzz + z!$t + zzzzzzzzzzzzzzzz!!!!B+tF`8zzzzzzzzzzzzzz!!",i+uM"g!$a3="A&kL0GOQfz!$EpC2$c&f + -6OB1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!@+>>,m2$bB_0eXXk+!;m\,R?4]+VatWzz + +Y*gT0HU8pz+XeNl0-:/ozzzzzzzzzzzzzzzzzz!#6mf-ku^^zzzzzzzzzzz!!"?'*rl9 at zzzzzzzzz + zzz+#b!$'bp]Kzzzzzzzzzz!!!`> + ,6.]Dzzzzzzzzzzzzzzz!%%suzzzzzzzzzzzzzz'dt7V+92Bd2C^1I0,4He,;1Pk,Ub>]zzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!D+XT#i+uCW2/i3hk0d.V=!!!!B.gRXKz!!!!D + 0dJ#!'`\46zzzzzzzzzzzzzzzzz!$]zzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzz'd5:g#UCoc-o;2e0d-Ms!$,V^#6z!!"/j+uM"gzzzzzzzzz + zzzzzzzzz0I.ntzzzzzzzzzz!$=!&#UBBMzzzzzzzzzz!&,Z?zzzzzzzzzzzzzzz!$

0)ttPzzzzz + zzzzzzzz+>b8h*ro)).Omh/!$O'S#V.PQzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzz!$a0G2$c&j/5$7*-6iKj+=JEj0E;(Qz!&,o/.ki%Fzzzzzzzzzzzzzzzzz!!"\u,VU;?zzzzzzzz + z'f?7&#RD.Fzzzzzzzzzz+!Mj.zzzzzzzzzzzzzzz+=&cYzzzzzzzzzzzzz!!!`j+snBR5B + #W4=Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!$<=11a5I[7St?[0GPZ` + 2'Oaiz!!!!@0Jj%c+TMKBzzzzzzzzzzzzzzzzz+>b8h*rl9 at zzzzzzzz,9dC!#RE'`zzzzzzzzzz + -n>8tzzzzzzzzzzzzzz!!")h+tiorzzzzzzzzzzzzz'dt7Q+&>:".Rtd>2$b]d'`\46zzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!"5s.jQ,K8I.1.+99aD"Zzzzzzzz!!"5f#RC\Xzzzzzzzzz!!!!E0)ttPzzzzzzzzzzzzz!!!!@.j?,:zzzzzzzzzz + zzz!$NUE,t(L''1X6(-6iKjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!`f-j0fP#Zzzzzzzzzzzzzz,:$"i.L6V?*rl9 at zzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!"6B4pVE"8P]?!"TA?"q:k?!!"5u,U>)hzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!L.f]PLzzzzzzzzzzzz!!"6$2'W)$zzzzzzzzzz!"'#A + "pP/0!$F]9:'`Etzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzz1*&.V:01g2zz!$`m9,VKl4zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!",c*rl9 at zzzzzzzzzzzz + +!r0Yzzzzzzzzzzzz!!?Y=,!uVc8J<0Gzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!!"YX at nng9"!IXEzz+XeNl0-:/ozzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !$&L'J$#TYKF+TMKBz!!")p.gRXZ*rl9 at z + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!&6;1zzzzzzzzzzzz!$

0)ttPzzzzzzzzzzz!$ + !!!`\,U>$'1a47g!!"\Y0E;(Q!!"/f*rl9@!!WN*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzz!!!01zzz!&+[4z!#7".-6F<`1a6[M'cA%m&KLiO!!"*8C^=N< + !$2 at M#87mY*X;oT#8.jY#87(P*!Z]_()$oX#8[@?!!!cP#88*X',hf(#8 at dj#6th at zz',hf(#8 at dj + #6th@(`@6zz!#GkS',Vbq#6tnY#9F*T#6tkY#6tnB'c[G` + 'G_>e#6u&"=DAoXz'*eL;!!!!('*&"E',(T_!!!TK&dK'M!#PqX!#$7h&c_n3+Y*gH+6Vz!!!]H!#Q[f#6tqX)[@&o!#ZXSz!!!!2#6tqX)[@&o!#ZXS*#&Ai#87(L + #8e'Y#9EjF*%)A`Ai#8K'@+92BAz + '*eaI#6tJ='*&"E',;E"!!"&R&dK'M!#PqG#6u%[!#746,VL5^1a47g!!!!@2)QHU!!!!G#Y767 + +92BA!!*<)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!6(zzz!!!!D+tt5e*rl9@!$F*D0E;(Q0Jjs_.0(5,('bKn)A<)N'epMD0d at J>!!!!4#8."L#87jX + )ZTj!!!31zzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzz,99,W0`V1R!!!!Q + ,W-\E!!#SP,#VZ=!#Zah)$^Be!!!mG0d:.8'`\4I#8."L#87[S('"=7!!!f?z!!!i@#9"0S&I0-Q + !!a;?!#Gk?zz&I0-Q!!a;?!#Gk?(`FA+#87(L#8dFR#87(;!##SM!$hgU#UCJlzz!$2 at M*YeYm*WQ0V + #64`('*f-M&dK'^#8R:>!!"6S=!I\Fzz'*eL;!!!!('*&"E'*&XM*Zbsp&dK'M!#PqX'f/rg0HU90 + -jV.A!!!!G#V@&Mz!!!!G#RC\A-ia5I!!!0(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzz,:s0,#Sd=>z!&,TR,8Lsn!-<6W0m+H9!#Qa^'*&mk!!$,( + +uM#F#8R:P#87jX'*&"4!!!f?zz',1Ze&I0-Q!!a;?!#Gk?zz&I0-Q!!a;?!#Gk?)A`Ad#87(L#8dFR + #87(;!##SM'aP'N#REHkzz!!!WJ#93^]*WQ0V#64`('*f9Q&dK'c#87(;!%%tj#64`(zz'*eL;!!!!( + '*&"E'*&"K#6ttD&dK'M!#Ss)+t.+C&g&h6-ku^^!!")b#RE",z!!!!G#RC\['`\46!!!6)zzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzz1^F?m#V,lTz + !!")f+q8\q!!$D7<*1^T'*&ac'*&ma(_[ko!&,o/>m)5j#6tnV)AiGS*<6l\&f1NJ!!!uU!#PqV + '*f0N'aG]Y!#,YQzz'*f0N'aG]Y!#,YQ#9EjY#87jb#9+Wu#87(;!#GkU0*hgh#\b1mzz(`iYW*ZP.t + 'GqK'#64`(&I/sL*X;o`'H.f52,5A4#8.gQzz(C(QQ!!!W:(B=FK(B=FN#8[@?('bj)0e-6-*rlpt + GUb*Vz!!"_Z#RC\mz!!!!G#RC\_z!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!!!6(zzzz!&4`b#RDOQzz/Hd7E+!q83#C/!Q.XG)9'`\mP*Z#%d#64`K + HWLJECE3Bf'F+j](]YBX)%mMd&HEgl#6u7]#6tJI#6tJT*X;oTz!!!!2#6tJI#6tJT*X;oT'*fEp + )B'G*)$^`Y#6tnB(C(0M/I2Uf":#/:(]XO9z(_[Sg'G^Z^#9FZd#6t5/'bgle)[@A`&en[YH5HW! + #8n-e#8[@?!!!!(#6tJI!##SB#6u+O#6t5/*YJGh?&czzz!$a3D,V^MDzzzzzzzzzzzzzzzz!!!!Q#RDgYz + zzzzzz!!!!I#UUWJ+tiorzzzzzzz!!!!@0Jt%/'`\4f#RC\L,VT2uzz+:&61,6.]Dz!!!!G#UBBMz + !!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz + zz!&4a)zz!!!!U#RC\A#RE*az!&-5R-ku^^zzz+=JEk0,4Hezzzzz!!!!?#6tJ=#6tJTzzzzzzz + !!!!I#UfZQ!!!!9#6tJ=#6tJ=(]XO9zzz!!"DQ#RF9a'`\46zzzzzzz!$EZq1b\n0!!",I#RC\l + '`\46zz1^GKOzz!!!!G#Ts*Iz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!!6(zzzzz!!"/d-3+#Gz!!!!60d6l/#RC\\z!!!!6-mCK%z!$;1 at z!!!!B + .gRsc*rl9 at zzzzzzzzzzzzzz!!!!C-ia5Izzzzzzz!%8*Y#REd>zzzzzzz!!")o,U>)Zz!$`Zn#RC\A + 2#mUVz!!!!Q+truszz!!!!G1]RLUz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!!!61`l\tzz!!"]0#RC\[,6.]Dz!$$2,:I96bWCBk(L#6tJ=#6tJ=,@@p`4@#6tJ=#6tK? + zz + !!")o+p\G[#Vc;Z!!!6(z!!!!D0dJ"k'efn!0`V1R!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#66.X + #RD\1+TMKBzzz!!`K(!!!!D2$aI^.gROGzz!!`K\#RDq(zzzz!!!6(zzzzz!!!6(zzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!`K(zzzzz!#8Z;zz + !!!!@+p\G[#RE:&!!!6(zz!!"/j+>a?0#W3=s!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#:Kj80-^Gsz + zzz!!`K(!!"\s#RC]"0-:/ozz!!ant-5?L\zzzz!!!6(zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!`K(zzzzz!!!6(zz!!!!D1a322 + #RC\[+TM`Izzz'aP'N#RDUt!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz%zzzzz!!!!(zzzzzz#64`(z + zzzz#64`(zzzzz!!b2%#RD\+-6OB1zzz!!`K(zzzzz!!!6(zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!`K(zzzzz!!!6(zzzzz!!!6( + zzz!!!!6+!WW3#zz!!!6(zzzzz%hJdBzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!%%KHJ/zzzz!!`K(zzzzz!!!6(zz!!*B0 + #7_%@z!!!6+"pP/0zzzz!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#64`(zzzzz!!`K(!!!!+!sf&8 + "q1V9%fcS0z!!`K(z%fukC"U>5?":G51z!!!6(zzzzz%0Z_3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"pk80zzzz!!`K(zzzzz!!!6(z!!!?3%M0$N%fcS0z + !!!Y582 + !!`K(zz!!!?."9f>J"UG2;!!!6(zzzz!!!!$&-2b2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzz$3pnMH#mUG1zzz!!!!" + !X&o9#6b>7$31&+zzz!!!*4$31&+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!zzzz!!`K(zzzzz!!!67!t5DE":>,/zz!!*67#lk23zzzzz!!!!(zzzzz + !!!!(zzzzzz#64`(zzzzz#64`(zzzzz!!`K(zzzz!!!',%0m+J#QkD6zzzz%futE"pY;;!s&B%zz + !!j,Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!*4 + !rr<$zzz!!`K(zzzzz%g*%A"UP20zz!!!!0":#2C!!!68%06G/zzzz!!!!(zzzzz!!!!(zzzzzz + #64`(zzzzz#64`(zzzzz!!`K(zzzzz!!a#9":PJG"U#2Dzzz!!!6(!"T,6$kNsR":G_?!!!!#%LrgGz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!,&.AR>zz + z!!`K(zzzz!"T/8#7LhJzzz!!!')"UY50!!!67%1iXQzzzz!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz + #64`(zzzzz!!`K(zzzzz!!`K(!!!!"$O?n@"q:kGzz!!!6(z!!!$-#R(G;%<-t3"98E%zzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%h/aP#m(G6zz!!`K(zzz + !!!N3$jR1C%fch7zzz%gW^Qz!!!6(!"&l@!rr<$zzz!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#64`(z + zzzz!!`K(zzzzz!!`K(zz$4..G#6b5<%fcS0!!!6(zz$3C<`)MX"P"U#2Dzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!?%06G/zzzzzzz!!!!$"pG&.zzzzzz + !tYP7zzzzzzz!"T2D%06G/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TGC%L3.D$31&+z + zzz$4.+G"pbSIzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0":u"C + zzzzzzzz!!3?/!WW3#zzzzz!!!!$&./C;zzzzzzz!!!!0%0m"Hzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzz!!*02"qV1F!<<*"zzzz!XK8@"UPM9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzz!"T2D"UY50zzzzzzz!!!!0$kN^Fzzzzzz!!!*4$31&+zzzzzzzz!!*67!rr<$ + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"'#@&-`CJ%fcS0zzz!!!!0!t>eG%1<[Hzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0":t_zzzzzzzzzz!!zzzzzzz!!!!."TSN&zzzzzzzzzzzzzz!"&l6!rr<$zzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"#n at LU!WW3#zzzz$Od7K!rr<$zzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzz!!!!""9o&4%fcS0zzzzzzzzz!!!!$&./C;zzzzzzz!!!B<%fcS0zzzzzzzzzz + zzzz!!!!,"pG&.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?3"pP>6zzzz!!!N9 + %M/mHzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"02?%0?M0zzzzzzzzzz!!!*4$31&+zzz + zzzz!"TVKzzzzzzzzzzzzzzzz!!EiB%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zz!!3T@%LEXGzzzz!"'/H"Tn`)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$&"pPAEzzzz + zzzzzzz!!zzzzzzzz!!NW.zzzzzzzzzzzzzzzz!!!$/&-Mt5zzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzz!t5DD!WW3#zzz!!!!0!tGkF!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzz!t5DD!WW3#zzzzzzzzzzz!tYe>zzzzzzzz#mLn?zzzzzzzzzzzzzzzzz!X/c9zzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$&"pPAEzzzz!!!'0#7V"?zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!"&uC%LEXGzzzzzzzzzzz!!!!+&-Dn4zzzzzzz!!!!"&-;h3zzzzzzzzzzzzzz + zzz!!!*4"T\T'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"02?%0?M0zzzz!<`r; + !WW3#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$+%M/mQzzzzzzzzzzzz!!!$2!rr<$zzzzzzz + !!!!&#QOi)zzzzzzzzzzzzzzzzz!!!!0":#2Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzz!!!!"":u%Fzzzz!!!N9"pP/0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0!t5DC$NL/,z + zzzzzzzzzzz!"TPKzzzzzzzz!!!<0%fcS0zzzzzzzzzzzzzzzzzz!!*K>!rr<$zzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!*2"p>G:zzzz!!zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$4$h?#RUP3zzzzz + zzzzzzzzz!!!N@!rr<$zzzzzzz!!!!"&-;h3zzzzzzzzzzzzzzzzzzzzz!Y,\Azzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$/&-NLDzzzz%gW^Lzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !"&u9"pbP9zzzzzzzzzzzzzzz!!!03zzzzzzzz!!!!&#QOi)zzzzzzzzzzzzzzzzzzzzz!!!<:%1`F= + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!zzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzz!"0>Ez!"05?&.K!Xzzzzzzzzzzzzzzzzzz!!!?;!<<*"zzzzzzz!!!!"&-;h3zzzzz + zzzzzzzzzzzzzzzzzzz!!!(VM$F7pzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + %gzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!B< + #6tKk"qV1F!<<*"zzzzzzzzzzzzzzzzzzz!!Ec3zzzzzzzz!!!<8%fcS0zzzzzzzzzzzzzzzzzzzzzz + zz!!!-,#6tJ=#7UY5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!$&-Dn4zzzz + %1WmKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzz%h&[J#6tJ=!WW3#zzzzzzzzzzzzzzzzzzzz!>#Szzzz!"BDKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!,&-iFF#6tJ=!WW3#zzzzzzzzzzzzzzzzzzzz + "UG).zzzzzzzz!"K,3zzzzzzzzzzzzzzzzzzzzzzzzzz!"&uA#6tJCzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzz!"'8>zzzz!!!03zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TJC#6tJ=%L!7D!<<*"zzzz + zzzzzzzzzzzzzzz!!!!,&.\a at zzzzzzzz":bD3zzzzzzzzzzzzzzzzzzzzzzzzzzz!=9/>%0-A.zzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?;!WW3#zzz!!!N@!rr<$zzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzz!!!?8"pYA<#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6t_J!WW3#zzzzzzzzz + zzzzzz!!!!'!rr<$zzzzzzz!!!!+#7:G2zzz!!!N9"U>8;#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6teK!tPA3zzz!!!!$&.\a at zzz!!!!#&.\a at zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#;4zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!H>!WW3#zzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?9"V1S5zzzzzzzzzzzzzz!!rf/zzzz + zzzz!"TVBzzz!!!?;%1`F=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzz!!!!)&./C;zzz!"/uAzzzz!!EH*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!j,Czzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0%Ls!Lzzz + zzzzzzzzzzz!!WK)zzzzzzzz!!iu5zzz!"'8?zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!tYe>zzz!!!0*zzzz!"T8Azzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzz!tYe>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + %h9$Kzzzzzzzzzzzzzz!tG;2zzzzzzzz!=&W*zzz%gEICzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!zzz!!!'3%fcS0zzz!!!**zzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzz!!!!"&.8I8DQzzzzzzzzzzzzzzzzzzzz*=!2Wzzzzzzz + zzzz!#cLNzzzzzzzzzzz!!!6/#6tnB'*eaI#8maO'*&"4!!!!4#6u+O#6tJ=#8A!Tzzzzzzz!"TVIzz + zzzzzzzzzzzz"p4i*zzzzzzzz"U"f*zzz$j?V2zzzzzzz&I/OSz&el&\zzzzzzzzzzzzzzzzzzzz + (_dbdzzzzzzzzzzz!#$7Nzzzzzzzzzzz!!!Z;#6tJ6!!``6#87=I)AN5P!!!!6)@$K\#6tJ=#6u7Lzz + zzzzz!!!97zzz!!!!&"98E%zzz!!!!'!rr<$zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!-%0-A.zz + zzzz!!!!>)AO,2!!!!<)uos=zzzzzzzzzzzzzzzzzzz!!!!4#6tkAzzzzzzzzzz!!!c>'-7f))uos=z + zzzzzzzzz!!!!8#8.":!"oMQ!!!Z;)AN5P!!!`P#9zzzzzzzzzz!!!!3#8[@?!!!f?&c`Xb#87(; + !!!!4#6ttD&dK'M'bglnzzzzzzz!!!!/"98E%zz!!!!#&-)\1zzz!!!!$"onW'zzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzz!!!?;%fcS0zzzzzz!!!!:*WQu]!!!`J'`\46z!!!!9'*&"4zzzz!!!!6)uos=zzzz + zzzzzzz'*f-Mzzz!!!!?zzzzz!!!!4(]XOL*#]\2('"=7zzzzzzzzzz!!!!4#64`(!!!6;!!!TK + #87(;!!!TK#87(;'*eL;!#u4Uzzzzzzz!!!!.%0-A.zzzzzzzzzzzz!!!!."98E%zzzzzzz!!!!' + !rr<$zz!!!!&"98E%zzzzzz!!!!2#8e'Y'*&"G'*&"4zz*WQ0?zzzzz',U]Lzzzzzzzzzzz!!a;?zzz + !!!!4(]XO9zzzz!!!!9'*&"J(DIc/'*&"4zzzzzzzzzzz#87(;!!!Z;!!!!:)&a4i!!!!:)$^-A + !!a/;!#>eWzzzzzzz!!!!+#6=f)zzz%Kc\2zzzz"p4i*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!H6zzzzzzz!!!!:*WQu]!!!uXzz!!!WL'*&"4zzzz!!!!?*WQ0?zzzzzzzzzzz'*f-Mzzz!!!Z;zz + zzz!!!i@(]XOL*Z>n4('"=7zzzzzzzzzz!!!!4#64`(!!!6;!!!TE)&WDS!!!lM#87(;'*eL;!#u4_z + zzzzzz!!!!"#6=f)zzzzzzzzzzzz!!!N7!<<*"zzzzzzz!!!**zzz!!!?;%fcS0zzzzzz!!!!2#8e'Y + '*&d^zz!!!!4#64`(zzzz!!!!9#8dF at zzzzzzzzzzz!!a;?zzz!!!i@(]XO9zzzz!!!WL'*&"J(E",4 + '*&"4zzzzzzzzzzz#87(;!!!Z;!!!!:&I/mJ!!!TK(C'p?!!a/;!#>eRzzzzzzzz%0uq6zzz#n-e6zz + zz!tG;2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!Q;zzzzzzz!!!!8)AO,2!"g4Oz'bglo*>04p + #6u"\#9F*k#8mLT#6u(G()-uY*Yf_$#6th@!!!!2#9"Np'c.)j)$_2q'F,Nlzz!#6IY#8 at pR!#GkF + )%ciK'*f-Mzz(C(Wf(_[,Z#8\$l*Xj*>f"d#8n9u)&*;\#8mLT#6u(G()-uY*YoUu#6tk])&"&) + #8R:>!!!!=#6tJI!"fnd)@%$!)&*;h'*eaI)up3K#87(N#6t5F#8.":z#87(;!!!Z;!!!!:'cIqi + !!!lK(C'p?!!a/;(_d2ozzzzzzzz$4m1;zzz!=',8zzzz!!WK)zzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zz!"&o1zzzzzzz!!!!6'F,Kk&ek<_)$_2_*?G1n'EAaN'*&gR#8dF@'H$lN'*f?h)A`Am#8$qR*WQ0? + !!!`=(]Y3_(C(0]!$):c&eYEczz!$2gh&fMPd*#',&'F,BR'*f-Mz!!!!<)AN5n(]Y?W!"fG@'*&"O + #8$qN)BJkl)AW;e)#t6R(]XO9!#cLNz!!!uQ!#PqS(C(0^!"fG@'*&"G#8Isl)up`m*<6'V)uos=z + !!!!4#6tJ=#6tJI!!!TE'cIbd!$2dd#87(;'*eaI)A<)Nzzzzzzzz$O-S2zzzzzzzzzzzz!!!K:zzzz + zzzz!!EH*zzz!!!01zzzzzzzz&I/OW!$)XO*![B!'aGQU',(?^#65>@#87(;)[?rT'cJ+n',hVd + 'H$l_#8dF@!!!!>*WQfe&dJXZ((qN('*&gR&c_n3z!#PqQ!$):W',hVd(C(TR!!a;?zz'GCH`)upQU + (]YEY)%loL'H$lN'*f?h)A`Am#8%RR'*&"4!#$7Nz!!!c>)ZUot&dJX_!!!lA)%loL)BAek#8S$g + 'EA+J'GUTJzz#6tJ=#6tJ=!!!!:!##SV!#QUS(C'p?!!``6#9FW\zzzzzzzz!"KA:zzz!"KA:zzzz + !!E]1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"/r1zzzzzzzzz*Yn_n*Ynto*?#Rk!!!W:'*&"K + #64`(*Z4qX&I0-d#8I4=!!!!:*WQ0?!!!`=*YJGQ!#Gk?!#PqQ!!!oYzz('bcY!!!!7#87(;&dKBV + '*f-Mz!!!!<#8[@?!!!f?!!!T9(]XOQ#8$q9)'/br*<6'>!!!T9(]XO9zzz',_#g!#Gk?!!!T9(]XO9 + !"fnM*WQ0R#8."Q(]XO9z!!!!4#64`(!!!6;!!!TE!##SS(`F,%#87(;'*eLN#8$q9zzzzzzzz!!a#7 + zzzzzzzzzzzz!"'8;zzzzzzzz%hJdBzzz!!!Q2zzzzzzzzz(`WMf#8eF!'aGcm!!!!8#64`9#8dF@ + (^CWQ!#ZgX)BAeX!!!!2#8dF@!!!!>)A<)N!"oMM!!"&X!!!Z;(]XO9z!#u[Qz)B8_W!#Z[T!!a;?zz + 'GMAa!!!T9(]XOR*WQ0?*Z4qX&I0-d#8I4=!!!W:'*&"4zzz(*!Pa!"oMM!!!!:*WQ0?!#6:T#8dFX + #8$qJ'*&"4zz#87(;!!!Z;!!!!:!#6Cn!$2dR(C'p?!!a/P)&WDSzzzzzzzz!!i]-zzz!!E`2zzzz + !"T;8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!EN,zzzzzzzz!!!!4'*&XM'*&mi&fCoZ*<6]W'*&"K + #64`(*Z4qX&I0-h)?9a;!!!!:*WQ0?!!!!4#6tqY!#Gk?!#PqQ!!!lXzz&I0'O!!!!2#8$q9!#ZgX + '*f-Mzz*X;ok'`]$T!!!T9(]XOQ#8$q9)'0Cq'*&"4!!!T9(]XO9zz!!!iS*"`Dh!#Gk?!!!T9(]XOK + 'GM2u*WQ0T)Aa,&zz!!!!4#64`(!!!6;!!!TE!"oMX*YSMd#87(;'*eL;'H.Sazzzzzzzz!!NE(zzzz + zzzzzzzz!!j#6zzzzzzzz"9ec*zzz!!!6(zzzzzzzz!!!!6'GUTa#65>@()$oX'G^Zb#64`9#8dF@ + (^CWQ!#Zgj#87(;!!!!2#8dF@!!!!3)$^Be!"oMM!!"&X!!!T9(]XO9z!#ZaV!!!!3#8[@?!#Gk? + !!a;?zz(^C9a&HECJ(]XOR*WQ0?*Z4qX&I0-h)?9a;!!!W:'*&"4zz!!!!?)''Lu!"oMM!!!!:*WQ0? + '*f"Y&I0-d#8R:>!!!!:*WQ0?z!$)sr!#Gk?!#PqQ!!!lXzz('bKQ!!!!7#8[@? + !#cXR'*f-Mzz!"p(Q)upc[!!!T9(]XOQ#87(;)'/br)uos=!!!T9(]XO9zz!!!oR!"oMM!#Gk?!!!T9 + (]XOU)#sXS*WQ0?*=!Aozz!!!!4#64`(!!!6;!!!TE!!!f?#8I4O#87(;'*eL;&fMGazzzzzzzz + !!`Q*zzzzzzzzzzzz!!Wf2zzzzzzz!!!!0&-2b2zzz!!!6(zzzzzzzz!!!!=)ZTjS#65>@('"=T + )B&Sl#64`9#8dF@(^C]S!#ZgX)B8_W!!!!2#8dF at z!#Qa^'+tN`!!"&X!!!T9(]XO9z!#umWz)ArMT + !#ujV!!a;?zz!!!ZH#8RmV(]XOR*WQ0?*Z>"Y&I0-d#8R:>!!!W:'*&"4zz!!!Z;&c`^Q!"oMM!!!!: + *WQ0U#8$qJ#8dF@)[@0!zzz#87(;!!!Z;!!!!:!!!W:#992.#64`((C(]g'F+jT)AEea'b^Qb'GqJ`!!!!5&c`R`!#u4Z!#l.V!#5_Qzz!#-=g!!"#> + *X<8W&I/pK*=!>[z!!!!9*WQ0])upc[&f22d(]XOK#93^W#6u:j#87(;'+tl^)]ShXzz!#5_[!##SN + (*!PZ!!!Z;(]XOM)AO)-*Yn_U&dK(B=FN#991gz + z!!"#E(_RMf&f(]c!!!!;*WQ0Z#87(Y#8e3V!#Z"Yzz!!!!3#8[@?!!!f?&c`Xb&c_nO#8.":*![2Y + &dKBV!!!]<'*&"4zzzzzzz!!!6(zzz!!!K1zzzz!!!!'$31&+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!6(zzzzzzzz!$)XO!!!!7)$_2_',)8h*YeYr#87mY#6t5/()dE!',_G`(`@i*<6]i + #8e<`#9EjF()dE!',_G`(`'Q#6tJI#6tJ=!!!c>#6u(Gzzzzzzz!!!6(zzz + !!!0)zzzz!!!!)#QOi)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzz!#ugUzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzzz%LW7:zzzzzz + z!!!H;zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#$"Gzzzzzzz + zzzzzzzzzzzz!!!6(zzz!!!-)zzzz!!!!+"onW'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz(*3GUzzzzzzzzzzzzzzzzzzz!!`K(zzz + zzzzzzzz!!!!0#7ge7zzzzzzz!!*<*zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz'bhA_zzzzzzzzzzzzzzzzzzz!!!6(zzz!!!-)zzzzz&./C;zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz*X;oT#6tJ=*WQ0?zzz!!!!(#6tJ=#6tJIzzzzzz + zzzzzzzzzzz!!!]<'G:BGzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!!,"TSN&zzzzzzz!"BA;z + zzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz(^C9N#6tJ=#8dF at zzz!!!!4#6tJ=#6tJ=zzzzzzzzzzzzz + zzzz!!"#E)&N>Rzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!*1zzzzz%1*"7zzzzzzzzzzzzzzzzzzzzzzz + zzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzz!!`K(zzzzzzzzzzz!!!!."98E%zzzzzzz!=&W*zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!'(zzzzz!sJZ)zzzzzzzzzzz + zzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!!'!WW3#zzzzzzz":Y>2zzzz!!!6(zzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!'(zzzzz + %gN(7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6/#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6t5/zzzzzzzzzzz!!!N7zzzzzzz!!!!0&-2b2zzzz!!!6/#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ6zzz!!!'(zzzzz!"K&1z + zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!B1zzzzzzz!!!!%$ig8-zzzz!!!6(zzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz + !!!*0zzzzz!"B57zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!9-zzzzzzz!!!N@ + !WW3#zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzz!!!6(zzz!!!-)zzzzz!!s)7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!01 + zzzzzzz!!!-*zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzz!!!6(zzz!!!-)zzzzz!!3W1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzz + zzz!!!67zzzzzzz!!!3)zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!E0zzzzz!"T;7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!`K(zzzzzzzzzzz!"&o1zzzzzzz!!<]2zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!0(zzzzz!!!Q2zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzz!!`K(zzzzzzzzzzz!!zzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!3]6zzz!!!<6zzzzzz + !!!0(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TPL%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0"V)%Czzzzzzzzzzz!!!!"&-)\1zzzzz!!!!* + $ig8-zzzzzzz!!!*4!rr<$zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz#mUP4zzz!!!32zzzzzz!!!31zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N=&-Dn4zz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!<:$kE=kBzzzzzz!!G<%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!%"98E%z + zzzz!!Wf2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!-,#ljr*zzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!!!!&"98E%zzzzzz%gN(7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*B9&.K!Izzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzz!!!!)"98E%zzzzz$O-S2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+ + "q2"Bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!'3%fcS0zzzzzz$O$M1zzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!=95I%0?M0zzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzzz%0QY2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz%h0'Ozzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!0*zzzzzzz%1*"7zzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+#R1J=$31&+ + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!!0#6=f)zzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!B<#QOi)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzz%gECAzzzzzz!!!!,"onW'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzz!"05@"To88zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!& + !WW3#zzzz!!!!'$NL/,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!EN5zzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzz"9ec*zzzzzz!!!!.#QOi)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0!sJo=$NL/,zzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!?;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzz!!!?1"V1S5zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+#6=f)zzzzzz!!!!1!<<*"zzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$+ + "qV4Nzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!H6zzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0%1imIzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&"98E%zz + zzzz!!!*2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!"&uC"pk;1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!Q2zzzzzzz + zzzzzzzzzzzzzzzzzz!!!?-!WiZ2"9\i1"9\i1!WiE1zzzzzzzzzzzzzzzzzzzzzz!"0>D%fcS0zzzz + zzzzzzzzzzzzzzzzzzzzzzzz!!!<0zzzzzzz!!!K2zzzzzzzzz%fue6$NpS8"9\i1"9\f.!Wi?%zzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$Om=E!tPA3zzzz + zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!<]2zzzzzzzzzzzzzzzzzzzzzzz!!*--":PG< + #6tG:"U,/7"9\i1"9\i5"U,&@#6tD9":5,0zzzzzzzzzzzzzzzzzzzz!!!$'%LN19zzzzzzzzzzzzzz + zzzzzzzzzzzzzz!!*W4zzzzzzz!!3]3zzzzzzz!Xf,:"U,,9#6b87$j6\9"9\i1"9],:"V(bB"pGG= + !W`9$zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N3 + "U>JEzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!NH)zzzzzzzzzzzzzzzzzzzzz + !!!!0!X&r9#6tD@"9S]4zzzzz!"T,=":PbF"q:kGzzzzzzzzzzzzzzzzzzzz":#55zzzzzzzzzzzzzz + zzzzzzzzzzzzzz!!NW.zzzzzzz!"B&2zzzzz!!!?."9eu7%Kut"V;4K":G_?zzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*3,"pb50zzzzz + zzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!=',8zzzzzzzzzzzzzzzzzzzz!!!!##n."C"Utb> + %fcS0zzzzzzzz!XT;?&.AXAzzzzzzzzzzzzzzzzzzz!"&o6%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzz + #mLn?zzzzzzz!=',8zzzz!!*0-"U>58":GP:zzzzzzzz!!!$-#R(GC#RUP3zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$4ROV#nI"9zzzzzzzzzzzzzzzzzzzzzz + zzzzzz!!!!&!WW3#zzzz#n6k7zzzzzzzzzzzzzzzzzzz!!!N;#R(GC%0Hq;zzzzzzzzzzz!=9/> + %LE.9zzzzzzzzzzzzzzzzzz!!!N=&-;h3zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+&-;h3zzzzzzz + %1N:;zzz!"'#@&.f!J!Y582zzzzzzzzzz!!!N;#R1hL!WW3#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!$$jR1Kzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!& + !WW3#zzzz"q(D2zzzzzzzzzzzzzzzzzz!!!N9Mh)+aN/`8i"U,&5$j6\>!X\o-zzzzzzzzz!!!!0 + !t5DC!rr<$zzzzzzzzzzzzzzzzzz$P3RDzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!/"98E%zzzzzz + !!!!"&-2b2zz!0/(#J;92$'EnXD"U,&8"9])6%fcS0zzzzzzzzz!!!?3"pP22zzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*B1&-rUCzzzzzzzzzzzzzzzzzzzz + zzzzzzz!!!!&!WW3#zzz!!!!+"onW'zzzzzzzzzzzzzzzzz!$31&+zzzzzzzzzzzzzzzzzzzzzz + zzz!!!97zzzzzzz!!!!&"98E%!!!!##mcNQ#Ek9nPQV*j!WiE)!WiE+"9\l3#7q%E$NU5-zzzzzzzzz + !!3T7$j$D/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + $4ROV#nI"9zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzz!!!!.#QOi)zzzzzzzzzzzzzzzz + !X&Z=zzzzzzz!!!'3%fcV4%1WW0R"/t+!WW3#zzzz!!*H1 + "U>5;$NL/,zzzzzzzz!!!!0"9o&4zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!!!$$jR1Kzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzz!!!!1$31&+zzzz + zzzzzzzzzzz!X&Z3%Y^!V&.K!Izzzzzz!!!!"!t5_N#nI"9zzzzzzzz!!!!"%0m=Czzzzzzzzzzzzzz + zzzz!X9&Dzzzzzzzzzzzzzzzzzzzzzzzzz!>#V=zzzzzzz!!&F$%1j(t%"8Eb#lt#+zzzzzz!!!'+ + "qV4Nzzzzzzzzz!!!**"q(D2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!!*B1&-rUCzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzz!!!B:zzzzzzzzzzzzzz + z%g*4O"pd\e"pP>?zzzzzzzz!!!!$$jR4Czzzzzzzzz!!*N6":kJ4zzzzzzzzzzzzzzzzz!"TJB + $31&+zzzzzzzzzzzzzzzzzzzzzzzz%L<%7zzzzzz!!!!##_<3h8L+]L$j."?zzzzzzzz!"&u9"p5A9z + zzzzzzzz!sSo1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zz$4ROV!tPA3zzzzzzzzzzzzzzzzzzzzzzzz!!!!-!rr<$zzz!!!E6zzzzzzzzzzzzzz!!*B9#7Lno + "9oDC$31&+zzzzzzzzz!!*36"TeZ(zzzzzzzz!!!!""U5>7zzzzzzzzzzzzzzzzz!!!!*&-Mt5zzzzz + zzzzzzzzzzzzzzzzzz!!!!.%KHJ/zzzzzz$OmXOCmuFR#7L\Fzzzzzzzzzz!sK5=%fcS0zzzzzzzz + !!!-5%1`F=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!!$$jR4Lzzzzzzzzzzzzzzzzzzzzzzzz!!!!%"98E%zzz!"T;8zzzzzzzzzzzzz!!!N3%L3CE + !?%g`H2Oe)OQzzzzzzzzzzzz!Y,D9zzzzzzzzz!"0>H%fcS0zzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!Y#\E!tPA3zzzz + zzzzzzzzzzzzzzzzzz!!!!%"98E%zzz!"K)2zzzzzzzzzzzz!!*?:%LEXV#mLS>!<<*"zzzzzzzzzzz + z!!!!"$kNdHzzzzzzzzz!Y>eOzzzzzzzzzzzzzzzzz!!!!$&-r79zzzzzzzzzzzzzzzzzzzzzz%hJgC + zzzz!!!!0!sK5F!WW92#7M1U!WW3#zzzzzzzzzzzz!!!<:%1`F=zzzzzzzz!!!N<&-;h3zzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N3"V;+Ezzzzzzzzzzz + zzzzzzzzzzz!!!!%"98E%zzz!=',8zzzzzzzzzzz!!!!$"V;+M!"'/?$k!%8zzzzzzzzzzzzzz!"0>I + %fcS0zzzzzzzz!"T5C$31&+zzzzzzzzzzzzzzzzz!=fS?zzzzzzzzzzzzzzzzzzzzz!!!!0%LiC1zzzzzzzz + !!!!%&.8I%fcS0zzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$Od7K!rr<$zzzzzzzzzzzzzzzzzzzz + !!!!#"TSN&zzz"q(D2zzzzzzzzzz!!!$/#7LY6%g3FR!rr<$zzzzzzzzzzzzzzzz":tY8zzzzzzzzz + $P3UEzzzzzzzzzzzzzzzzz!!!!,&-r79zzzzzzzzzzzzzzzzzzzz!!!H<%fcS0zzz%g*"?#nI"D + "V:q?z$P3==zzzzzzzzzzzzzz!!!?9$kE=zzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N9%M/mQzzzzzzzzzzzzzzzzzzzz!!!!# + "TSN&zz!!!!+&-)\1zzzzzzzzzz!X0,@!<<-0#7U_7zzzzzzzzzzzzzzzzz!"0>Ezzzzzzzzz!"'8Hz + zzzzzzzzzzzzzzzzz!=fS?zzzzzzzzzzzzzzzzzzzz!!zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"'/H%Kd4Azzzzzzzzzzzzzzzzzzz!"&cYT)o&ozz + %hAXG%0-A.zzzzzzzzz!!!'(&-NLD!X0,@!<<*"zzzzzzzzzzzzzzzzz!!!?;%0-A.zzzzzzzz!!!N> + %0-A.zzzzzzzzzzzzzzzzz!!!99!WW3#zzzzzzzzzzzzzzzzzzz!tYe>zzz!=05F!WW`6&-WFAz + !!!N>"98E%zzzzzzzzzzzzzzz!"BDFzzzzzzzzz!!Ei?zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!sJo=!WW3#zzzzzzzzzzzzzzzzzz!"9);#6tJ6zz + !XAq&PQD?qzzzzzzzzz!sJl2%fct@&-NLDzzzzzzzzzzzzzzzzzz!!!!"%LiC$31&+zzzzzzzz!!!*4$31&+zzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$&"pP22zzzzzzzzzzzzzzzzzz!"0#: + #6tD4zz!XAr8#6t>2zzzzzzzz!!!'1"p4i*!sSr3zzzzzzzzzzzzzzzzzzzz%h9$Kzzzzzzzzz%h9$K + zzzzzzzzzzzzzzzzzz$4[4Mzzzzzzzzzzzzzzzzz!!!!.!rrZ>!rr<$zz!=]8C!<<-0#7U\6z!!*W< + !"BDKzzzzzzzzzzzzzzzz!!!!.&./C;zzzzzzzz!!!!$&./C;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"05@$j-J0zzzzzzzzzzzzzzzzz!!!3.#6tD4z + z!XAr8#7^_6zzzzzzzz!X/c1!!!**"p4i*zzzzzzzzzzzzzzzzzzzz!"TPKzzzzzzzzz!"TPKzzzzzz + zzzzzzzzzzzz!"TMM$31&8$NL/,zzzzzzzzzzzzzzz!!!?2#:'i_zz!!!N8#7U\6!=]8C!<<*"z + !"9)D6O"&$zzzzzzzzzzzzzzzzz%0d=Czzzzzzzzz!tYe>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0#n at LP$31&+zzzzzzzzzzzzzzzz!!!-,#6t\< + zz!XAr8#6Fl*zzzzzz!!!?8!!!(4Ta:]!!sSr3zzzzzzzzzzzzzzzzzzzzz!!!?;!rr<$zzzzzzzz + !!!N>%0-A.zzzzzzzzzzzzzzzzz!!!!*#6PD?&-2b2zzzzzzzzzzzzzzz!!!0-#7"B3z!!io3&#,U( + !<<-0&-NLDzz!XAr8TI0^>zzzzzzzzzzzzzzzzz!"BDKzzzzzzzzz!!EiDzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?8&.SdQz!!j)8zzzzzzzzzzzz + zz!!!$)#6tA3zz!XAr8"TSN&zzzzzz!"'8B#\g%=*<60G"p4i*zzzzzzzzzzzzzzzzzzzzz!!!!+ + &-Dn4zzzzzzzz!!!!"&-Dn4zzzzzzzzzzzzzzzzzz$C:u^_6zzzzzzzzzzzzzzz!!3B1#6tJ9z + %0m*'TEh(h!=]SC%fcS0zz"U>8;#7q4Bzzzzzzzzzzzzzzzzz!!!H;$R=2#S-n8zzzzzzzzzzzzz!!!!,#6t;1zz!XAr>zzzzzz!!!!+&-iFF#6tJ=#B9_Dzzz + zzzzzzzzzzzzzzzzzzzz!!Fzzzzzzzzzzzzzzzzz!!!!%#6tJ=#6tJAzzzzzzzz + zzzzzzz!s]&9#6tY#6tJF + !<<*"zzzzzzzzzzzzz!!!!0&-iFF"TeZ(!"B/<#6tJ=#6tJ=!<<*"zz!!!-,#6tJ:%fcS0zzzzzzzzz + zzzzzzzzz$4m7=zzzzzzzzz!>#>5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzFU&-V#6tJ>%fcS0zzzzzzzzzzzzz":"r-zz!XAi.zzzzzz!"'8B#6tJ= + #6tJ=#6t80zzzzzzzzzzzzzzzzzzzzzzz!!!!/#QOi)zzzzzzzz!!!!-$ig8-zzzzzzzzzzzzzzzzz + !!!N9"pYA<%KHJ/zzzzzzzzzzzzz!!!!%#6tG8z%0m+C#6tJ=#6tJ=#QOi)zz!"TVG#7U\6zzzzzzzz + zzzzzzzzzzz!!A4$4?t:zz + zzzzzzzzzzzzzzz!!!!0#mLb;zzzzzzzzzzzzz!!!H6%fcS0!!!H<"@`q4%1*(9zzzz!2?#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#R(GC!rr<$zzzzzzzz!"989zzzzzzzzz!,R2t"pG5:#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJB"qV4Ezzzzzzzz!!!!#&-2b2zzzzzzzz!!!!"&./C;zzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"/u8!tPA3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzz!!!N3"pP,/zzzzzzzz!"TVBzzzzzzzz!!!!0%0qV5zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"'/?":kJ4zzzzzzzz#R(2.zzzzzzzzz":bD3zzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%1igGzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!s2>zzzzzzzz!!!**zzzzzzzz!!!'3$ipD@%fcS0zzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+%LrL>zzzzzzzz%gECAzzzzzz + zzz!"K;8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N>%KQP0 + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?1%0-A.zzzzzzz!!!!& + "98E%zzzzzzz!!!!!!"#6=f)zzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzz!!!H>$31&+zzzzzzz!!!0*zzzzzzzzz!!!0*zzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"BDKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzz!>#P;zzzzzzzz"U"f*zzzzzz!!!!+#7CM3z%1N:;zzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!.%M&O>zzzzzzz!!!'3%fcS0zzzzzzzz + !!!$2%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$P3==zzzz + z!!!!6'F,Kgz*>8DQzzzzzzzzzzzzzzzzzzzz*=!2Wzzzzzzzzzzzz!!"&F#6u:M(^C9N#8maO*WQ0? + !!!!9#6tJI#6tJ=#6u7Lzzzzzz!"&rkBzzzzzz!!!!'"98E%z!=&W*zzz!!!T9#87(; + !!!WG'`\46zzzzzzzzzzzzzzzzzzz!!!iM(B=F8zzzzzzzzzzzz(^C9N#8dF^#6tJT#6tJNz!!"&F + #8maO#6tJ=*"i5Ozzzzzz"UG).zzzzzzz!!!!&#ljr*zzzzzzzz!!!!."98E%zzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"p4i*zzzzz!!!!>)AO,2!!!!<)uos=zzzzzzz + zzzzzzzzzzzz!!!!4#6tkAzzzzzzzzzzzz!!!!2#8$q9!!!lS!!!i@#8dF@!!!!?#8 at .<&dK'M'bgln + zzzzzz!!!-*zzzzzzzz!!NZ/zzzzzz!!!-3zz!"B&2zzz!#5_P&I0-Q!!!]Kzzzzzzzzzzzzzzzzzzz + z!!!6/(B=F8zzzzzzzzzzzz!!!lSz&I/mJ!$2 at dz!#PqG)ZTjU*WQ0V#8 at .#;4zzzzzzz + !!!!#"onW'zzzzzzzz!!!!+&.\a at zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzz!!!!$%KHJ/zzzzz!!!!:*WQu]!!!`J'`\46z!!!!9'*&"4zzzz!!!!6)uos=zzzzzzzzzzz + '*f-Mzzz!!!!?zzzzz!!!!4(]XO9z!!!!9#8dF@!!"&]!!!WL#9EjF!!!WM)BJkY!!a/;!#>eWzzzzz + z!!!N6!rr<$zzzzzzz!"/u2zzzzzz!!!Q3zz!"'8;zzz!"fGQ&dK'M!#$"Gzz!!"&?zzzzz!!!ZLzzz + zzzzzzzz!!!!((B=F8zzz!#Q at Lzzzzz!#6IRzz!!"&]z(^ClX!#HLX(]XO9!#HLX(]XOW*WQ0?)@$lT + zzzzzz!!EH*zzzzzzzz"q(D2zzzzzzzzz"Tn`)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzz!!!!/!rr<$zzzzz!!!!:*WQu]!!!uXzz!!!WL'*&"4zzzz!!!!?*WQ0?zzzzz + zzzzzz'*f-Mzzz!!!Z;zzzzz!!!i@(]XO9z!!!!9#8dF@!!"&]!!!WQ(C(QQ!!!fO)'/bX!!a/; + !#>eRzzzzzz!!!!$"TSN&zzzzzzz!!!3)zzzzzz!!<]2zz!!!K2zzz!"fGQ&dK'M()-`Kzz!##S;zzz + zz!#PqXzzzzzzzzzzz!!!!((B=F8zzz&fD>_zzzzz!$30]zz!!"&]z(^ClX!#H4P(B=F8&dK'T(]XOW + *WQ0?)@$uWzzzzzz!"TVJzzzzzzzz#n-e6zzzzzzzzz!tG;2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$)%fcS0zzzzz!!!!8)AO,2!"g4Oz'bglo*>04p#6u"\#9F*T + #6tkY#6tnB'c[G`'G__p#6th@!!!!2#9"Np!#$7i'F,-#6tJO!##SB(]Y%)A`Ak*WQ0?!!!`=(]Y3_ + &I/OT'cRAl(]YEkzz!$2gh&fMPd*#',&'F,BR'*f-Mz!!!!6#8dFS'*&gR!"fG@'*&"O#8$qN)BJkl + )AW;e)#t6R(]XO9z!!!!9#6tJ=#6tJT!!!WQ!$2@[!#$=P)'/bX!!``6#9FW\zzzzzzz%1*"7zzzzzz + z!!!$2zzzzzz!!Wc1zz!!!N7%fcS0zz!!!T9#8[@\&HEdU)Aj1o(]Y3_!#Gk?&dJX_!!!rC&HEOa + *WR#^&HEgV&eP?cz!$**\&ekr`#8n9i)B'7h(C(QQz!!!!9#8$qV#8.dW&HECJ)uosD(B=F8z!!!]H + !#Q[U&dK'M)$_#l!!!]N!!!Z;(_mr*!#l.T!#ZgXzz!!"&F#6tJ=#6u(G!#HIh#9!!!T9(]XO9z!!!!9#8dF@!!"&]!!!WQ!#PqS'cInh + )'/bX!!a/P)&WDSzzzzzzz#n-e6zzzzzzz!!!!'!WW3#zzzzz!!`K(zz!!!!&!rr<$zzz!!!iU!"fGQ + *#]Os*YJGQ!#Gk?!"oMM!!!i@&HDeK*WR/oz!"fGQz!$)sk!!!!3#87(;*Z4qX'*f?Sz!!!!='EA+5 + !!!uW!!!!8#8R:E(B=F8z!!!]I(]XO9&dK'M!#ZgX!!"&X!!!T9(_[,hz!#ZgXzz!!"&]z(^ClX + !#HIP*Z>b,*WQcW(]XOW*WR/b&c_n3zzzzzz!!!!(!<<*"zzzzzzz!!!!!!:*WQ0?!!!!4#6tqY!"fGQ!!!6?!!!f?zz&I0'O + !!!!2#8$q9!#ZgX'*f-Mzz'*eaV('#-U!!!T9(]XOQ#8$q9)'0Cq'*&"4!!!T9(]XO9z!!!!9#8dF@ + !!"&]!!!WQ!!!lT*?G1\)'/bX!!a/;)[@A`zzzzzzz!X/Q(zzzzzzz!!!!)#QOi)zzzzz!!`K(zz + !!!!*%0-A.zzz!#61_!#Gk?&I0'b#6tqY!#Gk?!"oMM!!!i@&HDeK*WR&tz!"fGQz!"p.S#9k#87(;*Z4qX&I0-Qz!!!!=)?9a;!!!uD&c_nF#8."A(B=F8zz',1Ze + &dK'M!#ZgX!!"&Y!!!T9(_[,iz!#ZgXzz!!"&]z(^ClX!#HIP!#Z"U!!!T9(]XOW*WQ0Z#992.#64`(&I/sL*X;o`'H.eg + !$)%W'GqJ`!!!!5&c`R`!##SN!#5_Y!!!]<'`\46z!#-=g!!"#>*X<8W&I/pK*=!>[zz'G:BZ)?:QY + &f22d(]XOK#93^W#6u:j#87(;'+tl^)]ShXz!!!!2#8$q9!!!lS!!!iR!!!!;)#sX:)AE/O&dKBV + !!!]<'*&"4zzzzzz!!`K(zzzzzzz!!!!0#64`(zzzzz!!`K(zzz#6=f)zzz)]\nY!"fGQ*#\ek&c`R` + !#GkQ(D[5h!!!W:)upWW#9Ffh*WQ0U&J56e)uos=!#$"G'cI`$#93^D'H-rO*=!M`z!!!!<#9EjF + ((hAg'GV>s(B>0T)uos=z!!!uU!#PqV&dKEj()e4o!!!f?((q;d#8%jg&c`X[!#ZIf'*&"4z!!!lSz + &I/mJ!$2^P!##SL!!!Z;)ZTjU)?9a;*=!Q!zzzzzz!!!!(zzzzzzzz!!!H2zzzzzzzzz!!!-)zzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!(zzzzzzz!$)XO!!!!7 + )$_2_',)8h*YeYr#87mY#6t5/'bgle)[@A`&ekQU)AiGf#9EjW#8$qP*X#6u(Gzzzzzz!!`K(zzzzzzzz"p+c) + zzzzz!!`K(zzz"TeZ(zz!!!!3'EA+5!!!f?)AiGj*X2zzzzzzz!!!*2zzzzzz + !"B57zz!!!B2zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zz + zzzzz!!`K(zzzzzz!!!N7%fcS0zzzzzzz!!Wc1zzzzzzzzz!"KA:zzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!/$NL/,zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzz + zzz!!!6(zzzzzz!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzzz"q(D2zzzzzzz!!!0)zzzzzz!!<]2zz + !!!H2zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz + !!`K(zzzzzz!!!*2zzzzzzzz$O-S2zzzzzzzzz$4m1;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzz!!!!*"TSN&zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(z + zzzzz!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzz!!!!#"onW'zzzzzzz!!*<8zzzzzz!"TVJzz!"T;8 + zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zz + zzzz!!!3*zzzzzzzz$j6P1zzzzzzzzz%0uq6zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!!!0&-;h3zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzz + !!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzz!!!N6!rr<$zzzzzzz!"BA;zzzzzz!!!-1zz!!E]1zzz + !!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz + z!!ri0zzzzzzz!!!!"#7ge7zzzzzzzz!!!!0&-2b2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzz":bD3zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzz + !!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzz!!!H3zzzzzzzz%hJaAzzzzzz!!!N@$NL/,z%hJdBzzz + !!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz + z$3pn2zzzzzz!!!!,&-2b2z"9ec*zzz + !!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz + !!!!+&-Dn4zzzzzzz!!!$)!<<*"zzzzzzzz!!!N@!WW3#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzz!!*W5zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6. + !rr<$zzzzz!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzz!!!!0%0d.>zzzzzzz!!!!"&-2b2zzzzzzz + %1WmK!!!!0&-;h3zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzz!"T2:#64`(zzzzzz!!`K(zzzzzz + !!!!(zzzzzzz!!`K(zzzzz!!!Bzzzzzz + z!!!!.%0-A.zzzzzzz!"BDF!!!!)"TSN&zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzz!!!!"%1i[E + #64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz%gW^Kzzzzzzzz!!3]4zzzzzzzzz!!*<*zzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+%L!1>zzzz!!!!(zz + zzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(!!3Q?%06G/zzzz!!!!(%1iXQzzzzzz!!`K(zzzzzz!!!!( + zzzzz!=]SCzzzzzzzz!!!'3%fcS0zzzzzzz!!!99#lk;;!<<*"zzz!!!6(zzzzzzz#64`(zzzzzz + !=]86zzzzz!!3Q6%06G/#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzz!!!N3&-W(7zzzzzz + zz!"K,3zzzzzzzzz!!NW.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzz%g3FP$P*4;zzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(!!!!"%0m:Czzzz!!!!( + !!*67":kJ4zzzzz!!`K(zzzzzz!!!!(zzzz!"'#B&.JX?zzzzzzzz!"T8?zzzzzzzz!!!!#"pUogzzz + z!!!6(zzzzzzz#64`(zzzzz!!!$/#7Un8;#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6kS=%fcS0zzzzzzzz!!i`.zzzzzzzzz!,ibe#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ="U#/4zzzzzzzz!!!!"&-;h3zzzzzzzz!!!!0&.8IA4zzzzzzzzz$3pn?":kJ4zzzzzzzzzzz!!!!0&-Dn4zzzzzzzz!!!!0"pk80zzzzzzzzzzzzzz + zzz!!zzzzzz!"/u7!WW3#z + zzzzzzzzz!!!H<%fcS0zzzzzzzz!!!-3%fcS0zzzzzzzzzzzzzzzz!!3?/!rr<$zzzz!sSr3%fcS0zz + zzzzzzzzzzzzzzzzz!"&l6!rr<$zzzzz!!!!"%1iXBzzzzzzzzzzz$4mRFzzzzzzzzz!>#>5zzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzz%g3FI$NL/,zzzz%h/aL%fcS0zzzz%gWCC%fcS0zzzzz!!!!%&.JX?zzzzzzzzzz!!zzzzzzzzzzzzzzzz!!!!#"U5&/zzzz!"T2D"Tn`)zzzzzzzzzzzzzzzzzzzz!!!!, + "pG&.zzzzzz!!3<.!rr<$zzzzzzzzz!!!!0&.&=:zzzzzzzz!!!!0%L<%7zzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!N3"pP/0zzzz!!!$/&-NLDzzzz!!!$'&.&=:zzzzzz%h/aL%fcS0zzzzzzzzz!tYe>zzzzzzzzz + $3pV4zzzzzzzzzzzzzzzz!"&l@":kJ4zzz!!!!"%0m=Dzzzzzzzzzzzzzzzzzzzzzz!!EiA!<<*"zzz + zz!!!!$"qC\7zzzzzzzzz!!!N>%0-A.zzzzzzzz!!!N>%0-A.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!<]8":kJ4zz + zz!X0,;zzzzz!X/c1zzzzzz!!!$/&-NLDzzzzzzzz!!!!##6Fl*zzzzzzzz!!!!+&-Dn4zzzzzzzzzz + zzzzz!!!!"%1iXQzzzz!!3Q?%06G/zzzzzzzzzzzzzzzzzzzzzz!!!N8#7U\6zzzzzz!!s2?!WW3#zz + zzzzzz!"TPKzzzzzzzzz!!!H<%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!#"V:q?zzzz!!!'1"p4i*zzzz + !!!**"p4i*zzzzzz!X0,<%fcS0zzzzzzz!!!?;!rr<$zzzzzzzz!!!?;!rr<$zzzzzzzzzzzzzzz + !!*N6#S-n8zzz!!!!$%M/aRzzzzzzzzzzzzzzzzzzzzzzzz!=]8>%fcS0zzzzz!!!N4&-W+8zzzzzzz + z%h9'Lzzzzzzzzz!"BDKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*N6%06G/zzzz!sSo1zzzzz!sSr3zzzzzz + !!!'(&-NLDzzzzzzz!"'8>zzzzzzzzz!"'8>zzzzzzzzzzzzzzz!!!!0":#A:zzzz%g`FE!rr<$zzzz + zzzzzzzzzzzzzzzzzzzz!!!$/&-N"6zzzzzz%g3FI!WW3#zzzzzz!!!!0%Ls!Lzzzzzzzzz%1WmKzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!!!"#S7. at zzzz!!!<:"TeZ(zzzz!!!**"p4i*zzzzzz!X0,<%fcS0zzzzzz + !tYP7zzzzzzzzz$4m:>zzzzzzzzzzzzzzz!"T2D$ip>.zzz!!!$*&-W+8zzzzzzzzzzzzzzzzzzzzzz + zzzz!=]8C!<<*"zzzzz!!!N4&-W+8zzzzzz!!!N>%M&O>zzzzzzzz!!!!.%M&O>zzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzz!"T2D%Kc\2zzz!!!!0":u"Czzzzz!sSr9%fcS0zzzzz!!!'/&-r::zzzzz!!!!$#6Or+zzzzzz + zz!!!!+&-Dn4zzzzzzzzzzzzzzz#nR7Azzzz$4R4L$31&+zzzzzzzzzzzzzzzzzzzzzzzzzz!!!$/ + #7V"?zzzzzz%g3FI$NL/,zzzzz!"TPK%fcS0zzzzzzzz!!!H<%fcS0zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !sSr3%fcS0zzz!"TMD#S-n8zzzz!!!'(&-r::zzzzzz!=]8C!WW3#zzzz!!!-5!WW3#zzzzzzzz + !!!Bzzzzzzzzz%h9'[zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!B1 + &-NLDzzz!!!!"%1iXQzzzzz!=]SD$NL/,zzzzz!!!$&&.SdBzzzz%h&pTzzzzzzzzz!!s2=zzzzzzzz + zzzzzzz!sSr;zzzz".:()9*kn2#mgnE1&q:Szzzzzzzzzzzzzzzzzzzzzzzzzz!!!N3"pP22zzzzzz + !!6zzzzzz!!<]B#QXo*zz!!!!,&.B'Lzzzzzzzz!!!!0$jI%=zzzzzzzzz + zzzzz!!!'("p4i*zz!=>Y-R&Hth#7$$>LPLY?LPLY?WWrd0LMI&"1&q:Szzzzzzzzzzzzzzzzzzzzzz + zzz!!3T7$k!%8zzzzz!!!!+%0m%=zzz!"TJL!WW3#zzzzzzzz!!!B<"98E%zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzz!!!$/#7U_7zzz!!!!#%L*"8zzzzz!!3T@%LE.9zzzzz!!!!+%1i[F%fcS0z!!*67$NL/,zzzzzz + zz!!!')$kE=CE`cZz!!!N4&-WFAzzzzzzzzz!!!!*CBnW1zzzzzzzzz1'n6nVZd5-"`&mK + LPLY?LPLY?LPM6#"U,&9#mgS3zzzzzzzzz$3L_I#6k>;":G84!<<*"%fue?":YhG%L$31&+zzzzzzzzzzzzzz!!B1# + Z)acXzz!!!'(&.JX?zzzzzzzzzzz!!!!SCBk"Dzzz!!*D0"`&mo#7$$>CBXkJ#q#]Qzzzzzzz!!!!" + #pKP?Ws>\@Y9s;Mzzzzzzzzzzzzzzz!!3H9"U>8B"UG56":G84$NpS8$j at 1I"UGJHzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzz!"T2D"Tn`)zzz!X8i:zzzzzzzzzzzzzzzz!<"9])6zzzzzzz + zzzzzzzz!!!!TZEpp91&q:Szz!tGM<%fcS0zzzzzzzzzzzz!%3Q)+ohTC!!!$+Y6C;K#7$$>"U,2=zz + zzzzzzzzzz!!!>'R&[<)+ohTCzzzzzzzzzzzzzzz!!!N2!X&W/"9er4"U"r2!s/K'zzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!sSr3%fcS0zz!!!**"TeZ(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !O]ABQR;b5zz!"T2:"p4i*zzzzzzzzzzzzz!!!#&Z&sNOLT1T7Qj'Z"!<<*"zzzzzzzzzzzzzz!!"AM + X/]qAzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!*)&-NLDzz!!!!0 + ":ttBzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!<0#Ih)@zz!!!!"#S7. at zzzzzzzzzzzzz!!!$+ + "`&ku\@8uY#r2J\zzzzzzzzzzzzzzzzz!&=_\Y-.j+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!XoVL!<<*"zz!"T2;%06G/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!" + Vn0LQC_$LGzz!"'/?%06G/zzzzzzzzzzzz!%4rRLT1T7CSqI>!!'4&"TSN&zzzzzzzzzzzzzzzzzz + ,)<0%zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$/#7U_7zz!!!!" + %1iXQzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!%2Oe]a"uIzz!!!!,"V:e;zzzzzzzzzzzz$)_R> + #HjEt+u0,uz!!!!HX-`nfzzzzzzzzzzzzzzzzzz!!!=\Xs*iGzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzz%g3FI$NL/,zz!"&l@#ljr*zzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!!CLT6`6%06G/zz!!S2zz!!!N4&-W.9zzzzzzzzzz!!"CM + CT@]@CSqI=zzzzz!!$f7-NF,Hzzzzzzzzzzzzzzzzzz!!/Ii-NF,Hzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`%LBjuL"UP20zzzzzz!!!!&W[@cHzzzzzzzzzzzz + zzzzzz!!!"sWZhECzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!# + $kNjKzz!!!!*&-W(7zzzzzzzzzzzzzzzzzzzzzzzzzzz12@,1C'=eDzz!!!'/&.JX?zzzzzzzzz + !"#QjXp9^c+u0,uzzzzzzzzYGrrMzzzzzzzzzzzzzzzzzzzY6V62zzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*N6%0?M0zz%g3FQ!<<*"zzzzzzzzzzzzzzzzzzzzzzzzz + !!"ci#AXDF&.&=:zz!tGM<%fcS0zzzzzzzz!?q]&#Hhj?-NF,Hzzzzzzzzz!3`CMzzzzzzzzzzzzzzz + zzzz!3ZX2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0":t_=zz + !!!$/#6YP;!!!N0zzzzzzzzzzzzzzzzzzzzzz!!"bSz9:2^_)\!>]%fcS0z!"T2:"p4i*zzzzzzzz + 19YJo#D]B)!<<*"zzzzzzzzzz!!'4&-NF,Hzzzzzzzzzzzzzzzzzz!!'4&-NF,Hzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"T/9"p5A9zz!bj#Ght?!<<*"!!EK+ + !!3T7%06G/zzzzzzz-`8Q"V:e;zzzz!!"C%#ljr*z-`1zzzzzzzzzzzzzzzzzz!!!!"Ws8k7#6tJ=#6tJD":>,>"U>8;#6tJ<#QOi)zzz!3`C-#6tJ= + _/$50zzzzzzzzzzzzzzzzzz!!!#&WW<)"zzzzzzzzzzzzzzzzzz!!!!H#:BKOzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!E3#6tJ=#6tJD$31&+!!*B7#7q4Bzzzzzzzzzzz + zzzzzzz!!"dT#6tKhXCqhD$j-M1!!!'3#6tGA"9K)6zzz!!!!*Xp51:#6tJ=#6=f)zzzzzzzzzzzzzz + zzzzzCR>)%zzzzzzzzzzzzzzzzzzzVlg%#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$+ + %0ZtA#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6b5;zzzzzzzzz!Nr=#zzzzzzzzzzzzzzzzzzz!/IWUzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzz!tGkO#m(G6zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzz!Xf8<"p4i*zzzzzzzz!"#Y+zzzzzzzzzzzzzzzzzzz!&CP\zzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!!?0"p4i*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!sSr2zzzzzzzz!!$f%zzzzzzzzzzzzzzzzzzz!!&ptzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzz!"0>@zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzz!!!<1"98E%zzzzzzz!!!&"#ljr*zzzzzzzzzzzzzzzzzz!!!#"VZ6\szzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!s\o.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzz!!!!+"q:P4zzzzzzz!!!"sWrN,"zzzzzzzzzzzzzzzzzz!!!!*WW<)"zzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!!!!+#6Or+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz%h9$KzzzzzzzzY-.g*zzzzzzzzzzzzzzzzzzzLBRYXzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!!N6#ljr*zzzzzz!!!f?#8dF@!!!rXzzzzzzzzzzzzzzzzzz!!!ZM&HDe2zzzz + zzzzzzzzzzzzzzzzz!!!i@#6tJN!$2 at M#9F*T#8dF at z*X;of#6tJ=#6u4]zzzzzzz!"TPFzzzzzzzz + YH at j*zzzzzzzzzzzzzzzzzzz19(?Tzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!-*zzzzzzz + !#l.[(E+"g!"ot\zzzzzzzzzzzzzzzzzz!#PqG&HDe2zzzzzzzzzzzzzzzzzzzzzz)&WDS!!!T9 + &HDeP#9EjF!!!!9#6u1J!#ZgX!#GkSzzzzzzz!!!?;$NL/,zzzzzzz!3WL*zzzzzzzzzzzzzzzzzzz + !13oizzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TVBzzzzzzz!#Gk?&I0-Q!#uaSzz!#6IRzzzz + z!!"&?zzzzzzzzz!!!i@&HDe2zzzzzzzz!#$1Lzzz!!!!4(]XO9zzzz!!!!9'*&"4zz*Zb:]!!!i@ + (]XOP)$^uY!!!!8)$^uY!$30]!!!oB&c_n3zzzzzz!!!!,&.\a at zzzzzzz!3_.Xzzzzzzzzzzzzzzzz + zzz!"#Y*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!j*>f"d#8n9u)&*;\ + #8mLT#6u(G()-uY*YoUu#6tkR#8$q9z*Zb:]!!!i@(]XOP(`inp!!!fO&I0-Q!$30]&fq8uzzzzzzzz + !=',8zzzzzzz!!$f9zzzzzzzzzzzzzzzzzzz!!'3izzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !"]/2zzzzzzz!!!f?#8$qM&eYl`'G;E-!"otG!#ZgX(C(0^!!"#E&c`aR'*''f'bVE$!#Gk?z!#-(H + (`X+m#8 at ml#8A!T)&WDSz!!!!4*WQoh)?:TZ&HEX^&c`^Q'*eaV'cRAl(]YEk!#QC_!#GkU#6tqY + &dKBV&I0-Qzz'GCH`)upQU(]YEY)%loL'H$lN'*f?h)A`Am#8%RR'*&"4zz*X;oT#6tJ=(]XOP(`3Ju + !#6Cf&I0-Q!$2 at M#8 at aMzzzzzzzz!"9/6zzzzzzz!!"CLzzzzzzzzzzzzzzzzzzz!!!$)1&q:Szzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%gN(7zzzzzzzz!!!ZG!#HOd)&sY8'*&"4!#ZgX!#Gk?!!!Z; + &c`OL',Cflz!#Gk?z!#-+a!!!!2#8dF@#8[@?*!ZHDz!!!!;#6tJ=#8S-]&HEdU#6tJ='+kHd!!!6? + !!!uD!#u4K#6tJI&dK'M!#ZgX&I0-Qzz'GMAa!!!T9(]XOR*WQ0?*Z4qX&I0-d#8I4=!!!W:'*&"4zz + *Zb:]!!!i@(]XOP(]YTq'b_Vg&I0-Q!$30]*![)Vzzzzzzzz!!"Y&I0-d#8R:>!!!W:'*&"4zz*Zb:]!!!i@(]XOP(]XOR#8 at .<&I0-Q!$30]!#l.`zz + zzzzzz!!!6(zzzzzzz!!!!CWrN,"zzzzzzzzzzzzzzzzzz!!!!S#64`(zzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!!`K(zzzzzzzz*?+tY!#HOd)&s;'!#6Cc!#ZIf'-%5W!!!T9'*''Y#87di(]XOV + !#GkQ(B=F8!#ugU(^Cfi#87(P#93^D'F,?Qz!!!!>#991gzz)&WDS + !!!T9&HDeP&HDeE#8$q9'*fHV!#Z[T!!"#E*#/GRzzzzzzz!!!6(zzzzzzz!!!!"#64`(zzzzzzzzzz + zzzzzzzzzXpG(.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzz!!!!<(B=F8!#61Q + 'G;&m)@%;u!##SY(C(0M!!!`J#8A*^*<6]d#6u.a!#PqY&eP?\!$*'b#9=B]#6tnI#6u:k#6tJ6zz + (C(0Z((gcV#87(N)@%/m&I/OG'*eaI*ZbOk#65DU#9"0e#6tJI#6tJT&fCokzz*?>@i*<6]i#8e<` + #9EjF()dE!',_G`(`7zzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzz!!Wc1zzzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzz + zzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzz!!!#!1&q:Szzzzzzzzzzzzzzzzzz!!!#" + +ohTCzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"B26zzzzzzzzz#64`(zzzzzzzzz#64`(zzzzzz + zz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz!"08:zzzzzzz!!'4'zzzz + zzzzzzzzzzzzzzz!!"dSzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!3]3zzzzzzzzz#64`(zzzz + zzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz!"B26 + zzzzzzz!!&Cazzzzzzzzzzzzzzzzzzz!!'*9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!0*zz + zzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz + !!!6(zzzzzzzzz!=&W*zzzzzzz!&=c[zzzzzzzzzzzzzzzzzzz!!'#Hzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!!!'3!<<*"zzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzz + zzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz$k31:zzzzzzz!,H?Mzzzzzzzzzzzzzzzzzzz!3_.Xzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!)%M&O>zzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz + !!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzz!!!!$&.\a at zzzzzzz1']Q7zz + zzzzzzzzzzzzzzzzz!3WL*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%L`=;zzzzzzzz#64`(zz + zzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzz + !!!*+$31&+zzzzzzzCMNnMzzzzzzzzzzzzzzzzzzzYH at j*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzz%h8aRzzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zz + zzzzzzz!!!6(zzzzzzzz!!s2=zzzzzzz!!!!S#;Q8Zzzzzzzzzzzzzzzzzzz!!!!"WX/Y*zzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TJB!WW3#zzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zz + zzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzz!!!!""U5;6zzzzzzz!!!"SX8i5#zzzzz + zzzzzzzzzzzzz!!!!&LB%;Szzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!*&.JX?zzzzzzz + #64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzz + zz!!3T7#S-n8zzzzzzz!!"4C!<<*"zzzzzzzzzzzzzzzzzz!!"AO1&q:Szzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!=]SM":GP:zzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzz!=o/1zzz + !!!!(zzzzz!!!N1zzz%fch7zzzzzzzzz!"T;7zzzzzz!WiK6"pP>6zzzzzzzz!!0)Dzzzzzzzzzzzzz + zzzzzz!!'&'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N;"9f#8#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= + #6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6bA> + $31&+zzzzzzzz!19,Rzzzzzzzzzzzzzzzzzzz!!TD'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TGC%L3.?$P*4;zzzzzzzz$4.+F&-W1MC!s&B%zzzzzzzz%fuk;&-`OLE"E0Rzzzzzzzzz!"T2D"TeZ(zzzzzzzzzzzzz + !!!&#"TSN&zzzzzzzzzzzzzzzzzz!!!"SCB+>7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!''"V:kI#mpY4zzzzzzzz!"&f;%L31C_BAmZzzzzzzz + zz!sSo2zzzzzzzzzzzzz!!%eAzzzzzzzzzzzzzzzzzzz!!$f8!<<*"zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?4$jI7H"9K)6zzzzzzzz!"T,: + JZ=6I"9K)6zzzzzzzz!!!**"p4i*zzzzzzzzzzzz!,JV9zzzzzzzzzzzzzzzzzzz!3`CXzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$%#S%(L + %0Hq;zzzzzzzz!"'F5Irtu+%1*@Azzzzzzzz!sSr9%fcS0zzzzzzzzzzzXKDR(zzzzzzzzzzzzzzzzz + zzYGrrMzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzz!!!!#":PhQ"U"l;zzzzzzz!!!!#"V:eh#n."C"UG2;zzzzzzz!!!'(&-NLDzzzzzzzzzz + !!!#&W[@cHzzzzzzzzzzzzzzzzzz!!!#GA1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!sf&8"q1e>zzzzzzz!!3<8":kJC!X&oC + #6bA@!<<*"zzzzzz!Y#AD!<<*"zzzzzzzzz!!'4&-NF,Hzzzzzzzzzzzzzzzzzz!!!<1Y5eP&zzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + $4..O#7_1L!WW3#zzzzz!!!!#"V:eIz!=K#6&.f!J!t##.zzzzz!!!$*&-WFAzzzzzzzzz!3`CMzzzz + zzzzzzzzzzzzzzz!3ZX2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzz!!3H9%L3IQ#m(),zzzzz!!3T@%06G/z!!*H1"V:nB#QkD6zzzzz + %g`FE#nI"9zzzzzzzzH)`4lzzzzzzzzzzzzzzzzzzzY6V62zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!',%1WUQ$j6VBzzzz!!!!" + %0m:Czz!!!$$":PJ>%Li^G%fcS0zzz!!!!,"V;+Dzzzzzzz!!!OFOs^50zzzzzzzzzzzzzzzzzz + !!!!-WZ;'>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!!!##m^\>&-W1=!WW3#zzz!"T2D%Kd4Azz!!!!0!XT;>#6k>7$OQk6zzz + !!*N?"Tn`)zzzzzz!%s#)FoVLBzzzzzzzzzzzzzzzzzz!"X48-NF,Hzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!=K#="pYVH":GP:z + zz!sK5A!<<*"zzz!"&f2"U52A%0Q_5zz!!!!0!tGkJ!<<*"zzzz!!!!"'Vg9kzzzzzzzzzzzzzzzzzz + z"0dNOzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!!'&"9eu7%L`IB!WW3#z!!!?8&-W.Hzzzz!!!N2#m^\G#6bP>!W`9$z!!!?8 + &-W.Hzzzz!"/t$J/nUizzzzzzzzzzzzzzzzzz!!!(]Y\OaLzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!WrQ6%L3OK%0R%?z + %g*:Q%1<.9zzzzz!89%0Q_>z%g*:Q%0?M0zz!!!?3#+:(!!WW3#zzzzzzzzzzzzzzzzzz + !sP0e%0-A.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzz!!!$$":,/8#7q%I"9S^c"9o&9$31&+zzzzz!!!N2#m^\=#7^n?#m(,. + #R1J=!<<*"!!!$-%0dAX%1idUzzzzzzzzzzzzzzzzzz!!*3,Ll`/Uzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*-- + ":PGF#7qS]LPLrt!WW3#zzzzzz!!3N2$j?k@%L!58"UY50zzzzzzzzzzzzzzzzz + !!!$+%L3FL"pG#-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*-/"I*MKUB_$("U,;;"9\f.!WiE6zzz!!!!+!WiED + %=SM9#I+L=?B#5V%;#bFzzzzzzzzzzzzzzzzz!!!N;#R1hK"*P+b#ljr*zzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !=8o7CQ!0Q"9],:"U,&7#6tJ=#6tJ=#6tJ=#6tJD"U,&8":5,2!!!"j*LR-;]u1-["UkM:!WiB&zzzz + zzzzzzzzzz!"T,;%1WUH"9JQ6":u"Qzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!XK8@%LiLIzzzzzzz!"T/@ + &-b]<%1i_t#m1;9"U,GB#6b8>"9\f.!X\o-zzzzzzzzz!!!N2$Np_=&-i[S#m(),!"T2D"TeZ(zzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzz!X&o9#6bP>!Wi?%zzzz%g!%H"pY; + Q + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 8266 4209 V -240 4216 8513 7 v 2021 4551 + a Fj(Figure)60 b(4:)80 b Fm(CBU)55 b(graphs)h(of)f(sparse)i(matrix)e + (in)g(espresso)-240 5101 y Fj(to)72 b(\014nd)h(go)5 b(o)g(d)72 + b(solutions.)114 b(This)72 b(b)5 b(enc)-5 b(hmark)72 + b(has)g(20459)g(lines)f(of)h(co)5 b(de,)75 b(19686)d(memory)f + (instructions)g(in)h(LL)-20 b(VM)-240 5375 y(represen)-5 + b(tation)59 b(and)h(1)h(non-trivial)d(strongly)i(connected)f(comp)5 + b(onen)-5 b(t)60 b(in)g(the)g(call)f(graph.)-240 5911 + y Fg(6.2)225 b(Data)74 b(Structures:)-240 6303 y Fj(There)79 + b(are)f(a)g(few)g(imp)5 b(ortan)-5 b(t)77 b(data)h(structures)f(in)h + (this)g(implemen)-5 b(tation.)130 b(First,)81 b(there)d(are)g(disjoin) + -5 b(t)76 b(arra)-5 b(ys)79 b(of)-240 6577 y(blo)5 b(c)-5 + b(kb)5 b(o)-5 b(x)76 b(structure)h(created)f(in)h("con\014gure")f + (function.)129 b(The)77 b(part)g(of)g(CBU)g(graph)h(sho)-5 + b(wing)76 b(the)h(parts)f(corre-)-240 6850 y(sp)5 b(onding)69 + b(to)g(this)f(data)h(structure)g(is)f(sho)-5 b(wn)70 + b(in)f(Figure)f(5.)107 b(Tw)-5 b(o)70 b(p)5 b(oin)-5 + b(ter)69 b(v)-10 b(ariables)68 b("barra)-5 b(y")69 b(and)h("oldbarra)-5 + b(y")-240 7124 y(p)5 b(oin)-5 b(ts)50 b(to)i(disjoin)-5 + b(t)49 b(blo)5 b(c)-5 b(kb)5 b(o)-5 b(x)51 b(arra)-5 + b(ys)51 b(in)g(some)f(parts)i(of)f(co)5 b(de,)52 b(but)f(in)g(the)g + (cbu)h(graph)f(they)g(p)5 b(oin)-5 b(t)51 b(to)g(same)g(arra)-5 + b(y)51 b(as)-240 7398 y(oldbarra)-5 b(y)63 b(p)5 b(oin)-5 + b(ts)62 b(to)g(barra)-5 b(y)64 b(at)f(one)f(place)h(in)f(the)h(co)5 + b(de.)87 b(Flo)-5 b(w)63 b(sensitivit)-5 b(y)60 b(or)j(subset)g(based)f + (p)5 b(oin)-5 b(ter)62 b(analysis)g(is)-240 7672 y(required)55 + b(iden)-5 b(tify)54 b(to)i(disjoin)-5 b(t)54 b(no)5 b(des)55 + b(in)g(this)g(case.)78 b(This)56 b(data)f(structure)g(is)g(global)g + (and)h(DSA)g(correctly)f(iden)-5 b(ti\014es)-240 7946 + y(this)47 b(using)g(the)h(fact)f(that)h(the)g(arra)-5 + b(ys)48 b(are)g(reac)-5 b(hable)47 b(from)g(no)5 b(des)48 + b(mark)-5 b(ed)48 b(with)f("G")h(\015ag.)76 b(The)48 + b(no)5 b(des)48 b(also)f(con)-5 b(tain)-240 8220 y(accurate)60 + b(t)-5 b(yp)5 b(e)60 b(information)e(without)i(b)5 b(eing)60 + b(collapsed.)42 8494 y(Another)43 b(in)-5 b(teresting)41 + b(data)i(structure)g(in)-5 b(v)g(olv)g(es)41 b(link)-5 + b(ed)42 b(list)f(of)i(ib)5 b(o)-5 b(x)43 b(and)g(ipb)5 + b(o)-5 b(x)42 b(structures)g(created)h(in)f(buildimp,)-240 + 8768 y(build)p 176 8768 55 7 v 64 w(feed)p 559 8768 V + 65 w(imp)64 b(functions.)90 b(The)64 b(part)h(of)f(CBU)g(graph)h(sho)-5 + b(wing)64 b(the)g(parts)g(corresp)5 b(onding)63 b(to)h(these)g(data)g + (struc-)-240 9042 y(tures)k(is)g(sho)-5 b(wn)69 b(in)g(Figure)f(6.)105 + b(As)69 b(can)f(b)5 b(e)69 b(seen)f(from)h(the)f(\014gure,)i(this)e + (data)h(structure)f(is)g(actually)f(a)i(link)-5 b(ed)68 + b(list)-240 9316 y(of)e(link)-5 b(ed)66 b(list.)98 b(These)66 + b(are)h(global)f(data)g(structures)g(as)g(they)h(are)g(reac)-5 + b(hable)66 b(from)g(no)5 b(des)66 b(mark)-5 b(ed)66 b("G".)99 + b(The)67 b(are)-240 9590 y(t)-5 b(w)g(o)71 b(distinct)e(instances)g(of) + i(ipb)5 b(o)-5 b(x)70 b(structure)h(in)f(build)p 3729 + 9590 V 65 w(feed)p 4113 9590 V 64 w(imp)h(function.)110 + b(But)70 b(DSA)i(w)-5 b(as)71 b(unable)f(to)h(detect)f(it)-240 + 9864 y(due)81 b(to)g(uni\014cation.)140 b(Eac)-5 b(h)81 + b(elemen)-5 b(t)79 b(of)i(impF)-15 b(eeds)79 b(arra)-5 + b(y)81 b(p)5 b(oin)-5 b(ts)81 b(to)f(distinct)g(ib)5 + b(o)-5 b(x)80 b(link)-5 b(ed)80 b(list)g(and)h(eac)-5 + b(h)81 b(ib)5 b(o)-5 b(x)-240 10138 y(instance)51 b(p)5 + b(oin)-5 b(ts)51 b(to)h(distinct)f(ipb)5 b(o)-5 b(x)52 + b(link)-5 b(ed)51 b(list.)76 b(DSA)53 b(is)e(also)h(unable)f(to)i(iden) + -5 b(tify)50 b(this)h(feature)h(due)g(to)g(lac)-5 b(k)52 + b(of)g(\015o)-5 b(w)-240 10411 y(sensitivit)g(y)70 b(and)j(arra)-5 + b(y)73 b(data\015o)-5 b(w)73 b(analysis)e(as)h(men)-5 + b(tioned)71 b(earlier.)117 b(The)73 b(no)5 b(des)72 b(also)g(retain)g + (their)g(correct)h(t)-5 b(yp)5 b(es)-240 10685 y(without)60 + b(b)5 b(eing)60 b(collapsed.)42 10959 y(Third)g(in)-5 + b(teresting)57 b(data)h(structure)h(is)f(actually)f(a)j(part)f(of)f(a)h + (complex)f(data)h(structure)f(in)-5 b(v)g(olving)57 b(man)-5 + b(y)59 b(struc-)3809 11672 y(12)p eop end + %%Page: 13 13 + TeXDict begin 13 12 bop 844 -99 6113 7 v 844 2789 7 2889 + v 900 2739 a @beginspecial 89 @llx 530 @lly 500 @urx + 721 @ury 3600 @rwi @setspecial + %%BeginDocument: Figures/twolf_cbu1.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 89 530 500 721 + %%HiResBoundingBox: 89.999219 530.279688 499.600000 720.050000 + %................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/11/29 13:04:27 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{< + ]setcolorspace[0 255]false @X + IC + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!>9!#lkG;%LrRNzz!!N`;!!!?,#QP24!rr<$!!!*%#QP86 + #64f-$Od"8zzzz!!*'"zzzz!!*'"zzz!!!!-$O7"H!!!!."onW'z!"9>;zzzz!!!E;z%KQ_5!!!!- + !%fcS0z!!WN3#QOi6!<<*'!<`B&!!!3($Od"G + !#/$46b5z!!!!."98E%zzzz%0QY2!!!!."TSN& + !!!9*#QOi)zz!!!E.#64`(!!30,zzzz!!!!/!"TT#7%LrRJ!!E<&z!t,)/z!!!62!sJZ)!!NT."onW(#64u:%0-A.zzzz!!!$"zzz + z!<<*"zzz!!!!-$OR4K!!Wl4!!!!#!s&`6%KQS2#RLY8!2!!*<)!#QOr1z + "p#/5z!!!!%#6>/3!"9/@!rr<,!9":GM:%g`7;"TS],!=&T*!=/c2z"p#/5z!!!!+!rr`5 + !z!XfD@"TSl3!"Ar8$igV8"oo)7!!ET.$3:P@!!!WH,!"&`4#7CS;!s8N1!=&f8$ig8-!s\f+!!!!$#64`(z!!!6)$31&+z!!EQ2!rr<+$46k8 + !!iT+!=8u2zzzzz!!*'"zzz!!!$"zzz!!!!.$31D<"p"i,$3:D6$O?_@#lk53"onf6!"&`2!!!!0 + !=T;9#R^Y9!"&`7!WW`3$jm"@!!EH*!"&r2z!!!6)$31&+z!"&`-!=])1zzzz!!*'"zzz!!!!"zzzzz + !!!!#%0-V6!=/`-$31&+$3L8."U"f*#6>#/"9T&5%fcS0!!iT0z"p"u0!"08:!=B59$31&9!=o2>z + $4 at .F!!!!$$31&8#n@=C!"8l/3!!!?,!/3!!!?,!$O7"H!"K#1$31D8!!!0*!!!6)"onc."p"u0!!!!)!51!!:"p"u0 + !!!!WH0#6>#/!!E<($3L8."U"f*#6>#/"9T&5$31&+!!iT0z + "p"u0!"0,6!=B59"98E/$P*7>z$3LP7#64`+$31&8%1WCC!!!B6!"'&>#n-e6zzzzz%KQn:!!!!" + $31;4"onW(#6588$31&+zzzz!!!!"zzz!!!!"zzzzz!!!!&"onl/!!EB(!!il?!!NK* + !!*<)!!EB(!!#QOi4$31&0"9ec*#QY,2!=Af,z!!30(!W`Q,!=&T)$3L8.!W`E*!=/Z*#R_(Izz!!rZ3 + !!!!)!=/Z4!rr<-!t5/0zzzz!<<*"zzz!!*'"zzzz!!!!#"98E1$O7"H"pFu2$O@(I!XB#@!!!N1 + %g!+>"U,88!!j)@!=0#4!!!3("98c:$k*.H!!E<.!!ru@$OI4A$4ICP!"KA@!!/3%Kuh8#6588$31&+zzzz!!!!#$O[:A!"T)9!"BG=$k!4=!"KAF + !"T)3!"8r3#64`(zzzz!!*'"zzz!!!$"zzz!!!!%#QP><"p"i,$4 at 7B!"T)8!!!9*#RU_C#QP,@ + !!!!%!rrQ,#Rg_@!!!K:!!!-(!!`N1!!!!*!rr<$z!!!!#$O[:A!"T)9!"KA:!!30-!WW3#zzz!!!$" + zzz!!!!"zzzzz$jd=B!!!6)!=&f=!s&N)!W``6!!WrH($31D6$3155!"9#3!=Af2!:!s/H-$NUP8z!t5/0$j-S?"pk;2"TSN&!!iT+$3:G6!!"&`,zzzzzzzzzzzzzzzzzzzzz + zzzz!!*'"zzz!!*'"zzzzzzzzzzzzzzz!!!-&!s/H&!"TP>zz#6P53!!!!)#mU\;#QOi)zzzzzzzzzz + zzzzzzzzzzzz!!*'"zzz!!!$"zzzzzzzzz!!!!(!9$31&+zzzzzzzzzzzzzzzz + !!!!"zzz!!!!"zzzzzzzzzzzzzzzzz%0?qE!"9ec*!!NK/zzzzzzzzzzzzzzzzz!!!!"zzz!!!!"zzzzzzzzzzzzzzzz + !!!3,!!!-*!!"TT#?!!!E.$3182 + #7LnB!!!!0!=&T)zzzzzzzzzzzzzzzzz!!*'"zzz!!*'"zzzzzzzzzzzzzzzz%0ce4$3L\E$3UA8 + !!ru4%fm1L$OI4K!$igG3#m:89!5qDzzzzzzzzzzzzzzz!#P_;!!s&Z-!!!9,!/3!"K)@%Kd%<"9AK&!!!!$$NL/,z!!`i5"TSN& + "U>&4!!!$)!!`l at zzzzz!$j-t>!=&i9"oni. + "98c0#R:_="p4r-$3:A9#n-e6!!EE)zz"p"l-z!!!!($46e%fl_3!!rrA#ljr*!!!$+#n-e6"p"u0!"08C%0-A=!=o/5$OI4Azzz!!!3("TSN& + #QXr,":#8B!<`B*%gW1?!!!$)"9Ac.zzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**#zzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!=8r1"U"f*!=&T)"9SW(!sAi0z!"&f.z"9ec*#6>#7!=/o2"onW+!sAc-z!=8c.!!!3(#QOi, + "9Sc,!!WH/!!!$+zzzz!"0/C!!!!-!=f)7$312:"pk88!;zzzz!!!!%z%KQ_5!!!!-!#/$46b5z + !!!!."98E%zzzz$3L8.!!!!."TSN&!!!9*#QOi)zz!!!E.#64`(!!30,zzzz!!!!0!$3:/.$3:/."98W6 + !2!!*<)!!!WH,!"&`4#7CS;!s8N1!=&f8$ig8-"9\])z#n@@G"Te]*#6526#n-eD + #lkD8!!3N6!"9/6zz"T\W)!9$31&+z!!!0* + !!!!'!=&T)!rrf3"pPA6"U"f*"U#&2$31&+zzzzzz!<<*"zzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzzz!!Wl4#QY,5 + %0?h:#mLA5"98E@`,!rr<'":"r-z$3L8.!!!!%"TSN-!/3 + %Kuh8#6588$31&+z!!!!'!='#>"TT&6!WW3,%0-A1"98Q*!!!!0!=&T)zz#n6k7!!30.!!!B8!!iT4 + !!!$k3@?zzzz + zzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzz!!3T0!!!!% + !!WrH($31,.%0-P8!"9#3!=Af2!#/#QYD8!!WH0!!!*( + #QY,0#QY,0zzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$#!tn=*WQ0?zzzzzzzzzzzzzzz!!!TN!>G5zzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!4!5A4zzzzzzzzzzzzzzz!"o;5!)1!!i]2"98E* + "98K0!t5/0zzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz!!!!#$NUA1$4d+:!!!?0!!i]-$3L8;!=9/7 + $3:>2%0HS5#lk;5$jZk&0"Ub_=!=Af0#n.(?"98N6!"B57"U"l5#QOi,#n.(?$3gM9!!NB- + !W`E(#m(),z!!!!&!2!!NB(!<`f2zzzzz!#/"9Si/ + #QOi)!!iT0z#6=f)"p"r/!=B#3#64`/!=&W*z"UP2:!!!!$$31&/!sA]+!!!*(!!!01"onW'z!!!!& + "98E%"p"r/!!<3*!=B/=!!NK*!!NK*"UbM7zzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzz%M&OD!=/o2 + "oni2$NLM9!!!0*!!!6)"onc.$ip\8!!!!)!2!!&0"U+l7!=f)4!=/Z3$4I:K$igVC#n6k@#ljr-#n.(?#R1;5!"TGG#6Y#2$Om(9z!!!!* + %0-A.!W`W.!"028#QY84!!rf/!!s)7!"&`9$ig8-zzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzz!!!E6 + $ig8-#6=i1#7:J4#64f+%0Zb5"98i:! + Q + 255 G + 3960 6660 990 540 re + f* + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 6950 2789 V 844 2796 6113 7 v 2088 3131 + a Fj(Figure)60 b(5:)80 b Fm(CBU)55 b(graphs)h(of)f(blo)5 + b(c)-5 b(kb)5 b(o)-5 b(x)55 b(arra)-5 b(y)56 b(in)g(t)-5 + b(w)g(olf)-240 3674 y Fj(tures.)76 b(The)49 b(main)e(comp)5 + b(onen)-5 b(t)47 b(of)i(this)e(data)h(structure)g(consists)f(of)h(link) + -5 b(ed)47 b(lists)g(of)h(term)-5 b(b)5 b(o)-5 b(x)48 + b(and)g(netb)5 b(o)-5 b(x.)76 b("carra)-5 b(y")-240 3948 + y(and)64 b("tearra)-5 b(y")64 b(b)5 b(oth)64 b(p)5 b(oin)-5 + b(ts)63 b(to)h(the)f(link)-5 b(ed)63 b(list)g(of)h(netb)5 + b(o)-5 b(x.)90 b(The)65 b(CBU)f(graph)h(con)-5 b(taining)62 + b(the)i(relev)-10 b(an)-5 b(t)63 b(parts)h(is)-240 4222 + y(sho)-5 b(wn)69 b(in)f(Figure)g(7.)104 b(These)68 b(link)-5 + b(ed)68 b(lists)f(are)h(also)g(global)f(data)h(structures)g(as)g(they)h + (are)f(accessible)e(from)i(global)-240 4496 y(v)-10 b(ariables.)99 + b(As)67 b(b)5 b(efore)67 b(DSA)g(correctly)g(iden)-5 + b(ti\014es)65 b(this.)99 b(Also,)68 b(all)f(the)f(no)5 + b(des)67 b(ha)-5 b(v)g(e)67 b(b)5 b(een)67 b(assigned)f(correct)h(t)-5 + b(yp)5 b(es)-240 4770 y(without)60 b(an)-5 b(y)60 b(collapsed)f(no)5 + b(de.)42 5044 y(Another)59 b(signi\014can)-5 b(t)57 b(data)h(structure) + g(is)g(also)f(a)i(part)f(of)g(complex)g(data)g(structure.)79 + b(The)58 b(in)-5 b(teresting)57 b(asp)5 b(ect)58 b(of)-240 + 5318 y(this)h(data)g(structure)h(in)-5 b(v)g(olv)g(es)58 + b(doubly)h(link)-5 b(ed)59 b(lists)f(of)h(c)-5 b(hangridb)5 + b(o)-5 b(x)60 b(and)g(densit)-5 b(yb)5 b(o)-5 b(x)58 + b(data)i(structure.)79 b(They)60 b(also)-240 5592 y(con)-5 + b(tain)66 b(a)h(p)5 b(oin)-5 b(ter)67 b(to)g(eac)-5 b(h)66 + b(other.)101 b(Tgrid,)68 b(Sh)-5 b(u\017e,)68 b(aNetSeg)f(all)f(con)-5 + b(tain)66 b(p)5 b(oin)-5 b(ter)66 b(to)h(the)g(doubly)g(link)-5 + b(ed)66 b(list)g(of)-240 5866 y(c)-5 b(hangrdb)5 b(o)-5 + b(x.)80 b(The)61 b(corresp)5 b(onding)59 b(CBU)j(graph)e(is)g(sho)-5 + b(wn)61 b(in)f(Figure)f(8.)81 b(DSA)61 b(correctly)e(detects)g(these)h + (as)g(global)-240 6139 y(data)g(structures.)79 b(All)60 + b(the)g(no)5 b(des)61 b(also)e(ha)-5 b(v)g(e)60 b(correct)h(t)-5 + b(yp)5 b(e)60 b(information)e(except)i(one)g(no)5 b(de,)60 + b(whic)-5 b(h)60 b(is)g(collapsed.)-240 6674 y Fg(6.3)225 + b(Metrics:)-240 7066 y Fj(The)61 b(v)-10 b(alues)59 b(of)h(the)g + (describ)5 b(ed)60 b(metrics)f(for)h(this)g(b)5 b(enc)-5 + b(hmark)59 b(are)i(-)f(N=23)-240 7339 y(The)77 b(main)g(SDSIs)f + (include)g(arra)-5 b(ys)77 b(of)g(blo)5 b(c)-5 b(kb)5 + b(o)-5 b(x)76 b(structure,)k(link)-5 b(ed)76 b(list)g(of)h(ib)5 + b(o)-5 b(x)77 b(and)g(ipb)5 b(o)-5 b(x)76 b(structures,)k(link)-5 + b(ed)-240 7613 y(lists)54 b(of)g(term)-5 b(b)5 b(o)-5 + b(x)55 b(and)g(netb)5 b(o)-5 b(x,)55 b(doubly)g(link)-5 + b(ed)54 b(lists)g(of)h(c)-5 b(hangridb)5 b(o)-5 b(x)54 + b(and)h(densit)-5 b(yb)5 b(o)-5 b(x,)55 b(arra)-5 b(y)55 + b(of)g(dim)-5 b(b)5 b(o)-5 b(x,)55 b(cellb)5 b(o)-5 b(x,)-240 + 7887 y(segb)5 b(o)-5 b(x,)59 b(tgridb)5 b(o)-5 b(x,)60 + b(densit)-5 b(yb)5 b(o)-5 b(x,)58 b(bin)-5 b(b)5 b(o)-5 + b(x)60 b(and)h(ro)-5 b(wb)5 b(o)-5 b(x)61 b(structures,)e(a)h(hash)h + (table.)-240 8161 y(G=21)-240 8435 y(t)-5 b(w)g(en)g(t)g(y)60 + b(one)g(global)g(no)5 b(des)60 b(w)-5 b(ere)60 b(iden)-5 + b(ti\014ed.)-240 8709 y(L=2)-240 8983 y(Both)60 b(the)g(lo)5 + b(cal)59 b(no)5 b(des)61 b(w)-5 b(ere)60 b(iden)-5 b(ti\014ed)59 + b(correctly)-15 b(.)-240 9257 y(K=)61 b(97)-240 9531 + y(The)g(co)5 b(de)60 b(had)g(lots)g(of)g(heap)g(allo)5 + b(cated)59 b(ob)10 b(jects.)-240 9805 y(I=6)-240 10079 + y(F)-15 b(ew)60 b(disjoin)-5 b(t)59 b("`H"')h(no)5 b(des)60 + b(w)-5 b(ere)60 b(found)g(b)-5 b(y)61 b(DSA.)-240 10353 + y(O=7)-240 10627 y(F)-15 b(ew)60 b(no)5 b(des)60 b(got)h(collapsed)d + (in)i(this)g(case.)-240 10900 y(C=29)-240 11174 y(All)g(these)g(no)5 + b(des)60 b(form)g(a)g(part)h(of)f(the)g(non-trivial)e(data)i + (structures)g(found.)3809 11672 y(13)p eop end + %%Page: 14 14 + TeXDict begin 14 13 bop 244 -99 7313 7 v 244 4811 7 4910 + v 300 4761 a @beginspecial 53 @llx 401 @lly 532 @urx + 721 @ury 4320 @rwi @setspecial + %%BeginDocument: Figures/twolf_cbu2.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 53 401 532 721 + %%HiResBoundingBox: 53.949609 401.279688 531.050000 720.050000 + %................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/11/29 13:04:54 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{< + ]setcolorspace[0 255]false @X + IC + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!**$!0$ig8-!!!E.!z + zzzzzzz!!!H/!"8r=zzzzz!Wi?%!!!!$$ig8-zz#6Fo,$3gt?!W`<1z!"8l/"p"`*!55 + "9Su9zzzz!!**#zzzz!!!$#zzz!!!3*#7:Y8!"BD:z!!!6)!=]#/zzzz%Kd1N + !tG;7#m^_9%fcS0z!"/l4%0-A6!<<*(!!=Jl9!=8`+zzz!!!$#zzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!J;!WWQ/!!E<2!!>/2!=Sr."V(b>#lkA@#6527z!!!!,!=8`+z!!!E3"p#)3 + $OI7C$NL/-!#/!"K#7!s/H1!=Sr1"onW/"TSi8 + !!<6&!!!!!Wo5!!ru;!"T)> + !"T)5!!`T.$ig8-zzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzz!<<*"zzz!!*'"zzzz!!!!*!!!!!"%0-A.zz + z!!!B-!z"pt_<%KQt=$3UY9!t,M@"ptA4!!!<,!!!K/!"/r2!=Sr9"T\W4!!!9*!sJ`+!W`T;zzz + zzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!$"zzz!!!!"zzzzzzzzzzzzz!"8l/$igP at z%06h:"V(b>#lkA7$igS@#7U\C#7:n?#m1/-#lt,2zz + zzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzz!!!!#!."9B#B!=]G%06h:!"9/7#lkA7!!!B-$k34H"p"](z!!!N1$NL/, + zzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzz!!!E3!!WN1$3gq?$NLA3!!!<3!!!**$NU\:!!<9& + #m(),!!!H/%0-A.%06n."9AW7!=]56%0-A.z"9A`-zzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzz + !!!!,#ljr,#lk&/%06h:"p"](#mgS3!sT,6%fcS:"onr2z"9A],!!!-&"onW'#6>#/!!ro2!!!'$ + "98E%zzzzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzz!!!$"zzz!!!!"zzzzzzzzzzzzz!!!!'$ig8:!=K2>%06nB!=T2:#lkA7$igS?!"T)@#7:VB + !!WZ.!!!<,zzzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzz!!ir4!!WN1$3h"A%fd(?#64o2!!!?9 + $NU;/"p#)3!snr-!!!!*$4QtE%g`RP!"BGF$3UJ4!=/u3$OR=Czzzzzzzzzz!!!$"zzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzz + ":+u-!!!'$!sAi2!s],5"Te]5!"K#1#R:_,;3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!!$#!5A4zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!S9(B=F8zzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$#zz!!!!"!<<*"zz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!zzzzzzzzz!=]/8"onW'zzzz + !"8r0zz!!!!-"T\W1%h&jI!#-!"KM>zzzzz + zzzzzz!!!!'!<!!!61zz!"B>:zzzz!!!66zz"T\f-zzzz!"T)7#RLY7zz"p"c* + !"B#7!"Ar0$NL/,!!30*!!!0(!!`Z.%0-A.zzz!#-z!!!-& + $NL/,zzz!!!!(!t5/0zzz!!!!'!<<*+#lk/1zzzzz%KQS1zz!!io>z!XA]6!s&i2!!!H1!=Jl:!=Jl- + !s8N'zzzzz!!!$#zzz!!!!.!<`]7!"T86!!!!%!s&T7"T\W1"ptY;!J;"q(G?!!rZ6#6P&.!Xo&/!"8r0zz!!<6%z + !!!!,#n6nD!!!0-!=Sr.#lt&-!XA]*zzzz!<<*"zzzz!!!!"!JHz":>AA#lkD8 + $O-V="98Q*$igJ4$Od at M"9B#5!=Sr.!!!B-%gN1H#7:n?#m1/3!<<*+#lkA7$igS@#6G&6%06M1 + "p#,?"U>#-!!/;!%KHJ/!!!$.z%Kuh4!!!E.!."9B#6"onW5!=&T+$3^Y7zzz + !!!E."onW'"p"`*$k*=F!)1"Ub;2 + $ig_;$NL/.!rr<'!Xo)0z#m(),!!!!.!=Jl0"onW)!s/Q)!!!*&!!!3(%fcS0zzz!!iT7z"U+l6 + #lkA7%1*CB!=Sr.#m()5$4?h6zzzz!<<*"zzzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzz!!!$#zzzzzzzzzzzzzzzzzzz!!!!"zzzzz!!39'#m(P:":bG5"oo)5$NLA5!!!B-$ig\: + $NgS5z!=Sr.!!!',z"p"](!!!!'!<<*+#lkA7!!!B-$ipb:!"8l9!!!$'zzzz"9Af/!!!!0!=o/= + "on]3$O$M>!=Jl:!=K>;%KHJ/zzzzz!!!$"zzzz!!!B5!!!',!!<9&!"B);!!*K.%06h:!!36&!!<95 + !<`B&!!!<,z!"Ar:!!zzzz!!!$"zzzz!!!$#zzzz!!!-(!!!!**$NUY9!!30(%06h:"p4i*$NUY9$ip_>#QOi)!!!$.z%LN19!!!3(%0-A.!!WH(!!rr3 + $ip>."9AW+!WW3)$31&3%gi@J;%1<1C!"TDA + "9ec*"Tnu0zzz!!!'$#m:5."UP/3"TSN,!=]#6!!!<`B-!s8r3zzzzz!!!$"z + zzz!!WW-!!!6-!7#lt&4!"8l/!!<6&$ig8-z!snr-z$N^>0!"p"`*"p"`*$ige=!!#3!=Jl5!rr`:$NpJ@%06h:!!!!#!"U,/3zzz!!!!##lk/3!!!!"$ig8- + !!!',!!!**!!39'zz#m(),!"/f9!"0)5"Tn`5%KHM4"p4i*!!*K.!!!E6!=8`+"p5):zz!!!<,!!!!, + !=Sr9#lkA7%1*CB!=Sr.!=T2?"TSN&zzzzz!8"UkD?zzz#R(V<#lk/3!!!!"$ig85"UkG=!!!62!X8W)zz#m(),!"/f9!"0)5 + !"&f6!!!$.!!!$.!"T)7zzzzz!!!!"zzzzzzzzzzzzzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!!$"zzzzzzzzzzzzzz!"8l/$ig8-$OHe5z!!!H/zzzzzzzzzzzzzzzzz!!!$"z + zzz!<<*"zzzzz"9JQ'#7:kD$4 at .?$OR=I$3Ub@#QOi8!=o;?!=8r2$igM:%06nBz"U+l7!=Sr7#lk#- + %0-P9#6bJ8%KQ\4zz!"/f9#6bD6%LN19#6>#/$NUY@"UP//!"K#;zz!!!0.!!!!%!9!C!"9ef0$NLA5!"/f:!!!*&%06h:"p4i*zzzzzzzzzzzzz!!!$"zzzz!<<*"zzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzz + !!!!*#6tSE"ptD!Y#,>#lkG9 + #7CP6!!WH3%06nB%LN19zzzzzzzzzzzzz!!!$"zzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzz!!E?'!!`i>"pte?!WW31 + #7:VB!!WZ4!!**#!!!!"!!!!!"!#53!Q4Izzzzzzzzzzzz!"p7P!51zzzzz!!33%z!t5/0zz!!!31!0 + $ig8-!!!E.!55"9Su9zz!!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzz&/tW`zzzzzzzzzzzz*s!K-'+t9Fzzzzzzzzzzzzzzzz!<<*"zz!<<*"zzz!!!!!H0#m(),"p4i1#lt//zzzz!AA#lk/3!!iT/#64r/$NLG7!!3<("p"r< + !=Jl-!!!*%$kE@>"onr:#6Fu1$Ng\8!s/H,!=T28!rrB2!!!!,!=Jl-z!!!!#!=]#/z!!!*+$3C2- + !Y#G;!!!3(!!2!"/f:!!!?9!"927$O?_A!=K89!!"/f: + $ip_9!!30("p4i*#m(),$ip_9!WrZ."onW'!"Ar:z!!*K.$ipS5"9AW,#ljr0$4d.G!!!91!!EQ; + $3U>/zzz!"0,@#64`("p"](!rr<,$3L8.#m(),"p4i*"Tnu0zzzz!!!$"zzzzzzz!!!$"zzz!!!H3 + #R^YB!!!?1!!!30"U>#:!=K#2"onW'zzzzz!!!K0"onW'!!*9($jH\7!!!!N1%g34?#mgqA!"BGJ!=]55!!!6)%KHn<$igP8 + !!36*$NgS5!s8o=$4R+A!!!0)#64`(zzz$ipM?!!!K0!!!?2!"Ar5!!!0/!!!K9!!!-&"U"f*zzzz + !<<*"zzzzzzz!<<*"zz!!!'0!"K;C!4!!!E.!=T>G!s&H'"9Ac7!!#.! + !!`N7!!EW4"onW'z!!!!'!rr<$!!<9&!!<32!=K8=!!r],!!WN5!=8`+zzzz!!**#zzzzzz!!!!" + !<<*"!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzzz!!!$"zzzzzzzzzzzzzz + zzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz!!!!-"oni0#7:Y<"T\c7 + !!*K.%06h:!!36&!!<92!<<*"!!!<,z!"Ar:!!/z!!!!'!rr<$!!<9&!!<3$#RUY6!!r],!!WN*!!NH0zzzz!!!$"zzzz + zzz!<<*"!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzzz!!!$"zzzzzzzzzzz + zzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz!!!94!!!3*#7:Y: + %0-kE!!*96%fle5!"K>D$ipA5$3^Y7"pYG?"q(D2!"T)@!!9!!!!+#QOi3#6526"onW,#ljr8$31&/!#-!"KM>zz%06G/zzzzzzzzzzzzzzzzzzz!<<*"zzzzzzz!<<*"zzzzz#6b,3#64`(%M&O>z + !!!!.!<<*"zzzzzzzzzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!!!'"onW' + #6b,3#7^q=!sAT0!5!XAi1!#-zzzzzz!!E<1zzzzzzzzzzzzzzz!<<*"zzzzzzz!<<*"zzzzz!XSi/!WWH/#64`(zzzzzzzzzzz + zzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzz!!!$"zzzzzzz!!*'"!!*'"zzzzzzzzzzzzz!!!!'$3pnB!"KG!=f)6$4I7B%fd"=!JHz!!WH4$O$bD!54"9AN)!!rf/ + "V(b>#n$b7#lk53"on`2#7:n?#m1;;#7Ch/;!55%fm%K!=Jl;!rr<$!!3H,%06n<"p"](!XT89 + !!!!**$NUY9#S.7D!!!3*!"/f!=Jl3!rr<$ + zzzzzzzzzzzzz!!!$"zzzzzzz!!!$"zzzzzz!"TP>!!!WW3#zzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzz!!!$"zzz + zzz!!!$"zzzzzz!!!$"zzzzzz!!!!"zzzzzzz!<<*"zzzzzz!!!!"!!!!"zzzzzzzzzzzzzzzzzzz + !!!!,!=]#/!!!B-%0-A.zzzzzzzzzzzzzzzz!<<*"zzzzzzz!<<*"zzzzzzzz!sS`*zzzzzzzzzzzzz + zzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzzz!<<*"zzzzzz!<<*"zzzzzz!<<*"z + zzzzz!!*'"zzzzzz!!!$"zzzzzzz!!*'"!!*'"zzzzzzzzzzzzzzzzzzz!!E<5z"9B#5zzzzzzzzzzz + zzzzz!!!$"zzzzzzz!!!$"zzzzzzzz!!!?9zzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzz!!!$"zzzzzz!!!$"zzzzzz!!!$"zzzzzz!!!$"zzzzzz!!!!"zzzzzzz!<<*"zzzzzz + !!!!"!!!!"zzzzzzzzzzzzzzzzzzz!!!B-!S9!>tk;zzzzzz!!!!" + !S9*<6'>zzzzz)%uuM!>G5zzzzzzzzzz!!!!7!zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!3 + !SLzzzzz!!!r=!zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!"f54!b_9zzzz!!!!!?(q>G5zzzzzzzzz!!!!7)#sX:zzzz!#kq>*#fP(zzzzzzzzzzzzzzzz!!*'"zzzzzzzz + zzzzzzzzzzz!!!!4&HDe2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#c^h'*&"4zzzzzzzzz!#?XVzzzz!!!rP)%ZcJzzzzz + zzzzzzzzzzz!!!!"!<<*"zzzzzzzzzzzzzzzzzzz!#QLPzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$#!"pt>1!!ir4z + !!!!(%KHJ/zzzz!!3-#zzz!!NB-zzzzzz!!!K9z$4$V:$3:P8!!!!-!=8`+%Kc\2!W`K*zzzz!<<*"z + zzzzz!!!$"z!!!$"zzzzz%fl\2zzz!WW3#z!!NZ7"p#57zzzzzzzzz!!!!&#QOi)"9A],%06J;z + !W`K*!!NE(#6b,;zzzz!<#QOi)!!`Z."qD+D!:"onW'!!!3*z!s/H&!t52>!!!H0#m(),"p4i1#lt//zzzz!!**#zzzzzz + !!!$#z!!*'"zzzz$ipG?$Od%?!?!9!#lk)8%0-V:zz!!rZ,!;:zz!!!3*z + !s/H&!rrf3$O[+<#m(),"p556#ljr*zzzz!!!$"zzzzzz!!!!"z!!!*K.!!r]8!0!rrzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzz!!!33!!!H/$OI(I"oo/7!!ro8"9A],!"K>D + $ipA5#mpe8%1`XM":P81!!`N7!!3K1#6P#-!sJo=!=]#2!t,JD%0Qh7!!NH0zz%LN19!!!?3!!!?2 + !"Ar5!!!0/!!!K9!!!-&"U"f*zzzz!<<*"zzzzzz!!!$"!!!$"zzzz!!!<5!!NQ8!=Sr7#ljr*%KQq; + !!Wc5"ptMA!!WZ.zz$NUY@"UP/=$31&2!5!XAr6!#. + !#6557!=/o1!!!-.!!!!%!=/Z7 + !s&E,zz!!!!*!>G5zzzzzzzz!"p7P*"W)Mzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#>SL&c_n3zzzzzzz!!!!!"T)AA#lk#/":G;@!WW3#z!"Ar0 + !;%KHJ/zzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!30( + !XSi,"pt>1%13 at M!!!$.!!io:zz!!!!.!=Jl-!!36&!!3T0"p"f/!!WN*!"Ar:!"K#4zzz!!!!"zzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzz$OHe@$4R%=":G;9!!!!&!rr<$ + !#lt&-"p"`*$ige=! + Q + 255 G + 539.996 6660 1440 540 re + f* + 3870 5850 1440 630 re + f* + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 7550 4811 V 244 4818 7313 7 v 1668 5153 + a Fj(Figure)60 b(6:)80 b Fm(CBU)55 b(graphs)h(of)f(ib)5 + b(o)-5 b(x)55 b(and)h(ipb)5 b(o)-5 b(x)56 b(link)-5 b(ed)56 + b(lists)g(in)g(t)-5 b(w)g(olf)-240 6338 y Fk(7)269 b(Results)89 + b(for)i(181.mcf)-240 6792 y Ff(Summary:)42 7066 y Fj(The)73 + b(181.mcf)d(is)h(a)i(part)f(of)f(the)h(SPECIn)-5 b(t2000)71 + b(b)5 b(enc)-5 b(hmark.)115 b(It)71 b(is)h(a)g(b)5 b(enc)-5 + b(hmark)71 b(deriv)-5 b(ed)72 b(from)f(a)h(program)-240 + 7339 y(used)56 b(for)h(single)e(dep)5 b(ot)56 b(v)-5 + b(ehicle)56 b(sc)-5 b(heduling)55 b(problem)h(in)g(public)g(mass)f + (transp)5 b(ortation.)78 b(The)57 b(co)5 b(de)56 b(is)g(written)g(in)h + (C)-240 7613 y(and)50 b(uses)f(almost)f(exclusiv)-5 b(ely)47 + b(in)-5 b(teger)49 b(arithmetic.181.mcf)c(has)k(a)h(ra)-5 + b(w)50 b(LOC)g(of)f(2412)h(with)f(a)h(total)e(of)i(991)f(memory)-240 + 7887 y(instructions)58 b(in)j(LL)-20 b(VM)59 b(represen)-5 + b(tation.)42 8161 y Ff(Data)70 b(Structures:)42 8435 + y Fj(There)61 b(are)g(t)-5 b(w)g(o)60 b(ma)10 b(jor)60 + b(data)g(structures)f(created)h(in)g(the)h(b)5 b(enc)-5 + b(hmark:)-240 8709 y(i\).)80 b(Net)-5 b(w)g(ork)60 b(:)81 + b(Mo)5 b(dels)59 b(the)h(complete)f(\015o)-5 b(w)60 b(net)-5 + b(w)g(ork)-240 8983 y(ii\).)79 b(Bask)-5 b(et)59 b(:)81 + b(Con)-5 b(tains)59 b(the)i(arra)-5 b(y)60 b(of)g(sorted)g(edges)42 + 9531 y(Both)74 b(these)f(data)g(structures)g(are)h(global)f(and)h(ha)-5 + b(v)g(e)73 b(a)h(lifetime)d(throughout)i(the)h(co)5 b(de.)120 + b(The)74 b(net)-5 b(w)g(ork)73 b(data)-240 9805 y(structure)j(is)g + (initialized)e(in)i(the)g(function)f(readmin\(\))h(called)f(from)h + (main.)128 b(The)77 b(function)e(readmin\(\))g(reads)h(the)-240 + 10079 y(complete)59 b(net)-5 b(w)g(ork)60 b(graph)h(from)f(an)g(input)g + (\014le)g(and)g(mo)5 b(dels)60 b(this)f(as)h(a)h(data)f(structure.)42 + 10353 y(Figure)h(9)g(sho)-5 b(ws)61 b(the)f(cbu)h(\(complete)e(b)5 + b(ottom-up\))60 b(graph)h(for)g(the)g(main)f(function.)80 + b(The)62 b(net)-5 b(w)g(ork)61 b(and)g(bask)-5 b(et)-240 + 10627 y(data)69 b(structures)g(are)g(clearly)f(sho)-5 + b(wn)70 b(with)f(their)g(sub)g(structures)f(in)h(the)g(\014gure.)108 + b(It)68 b(also)h(sho)-5 b(ws)69 b(all)g(the)g(link)-10 + b(ages)-240 10900 y(that)60 b(DSA)h(iden)-5 b(ti\014es)58 + b(amongst)i(the)g(substructures)f(in)h(the)g(b)5 b(enc)-5 + b(hmark.)3809 11672 y(14)p eop end + %%Page: 15 15 + TeXDict begin 15 14 bop -56 -99 7913 7 v -56 5920 7 6020 + v 0 5870 a @beginspecial 62 @llx 336 @lly 568 @urx 720 + @ury 4680 @rwi @setspecial + %%BeginDocument: Figures/twolf_cbu3.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 62 336 568 720 + %%HiResBoundingBox: 62.949609 336.700000 567.050000 720.000000 + %................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/11/29 13:04:59 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{< + ]setcolorspace[0 255]false @X + IC + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzz!8zzzzz#lt20!!!6)!=Af,z!!!!(!snr-!!!!)!!!*' + "TSN&!!NH-!!!0*!!!B-$NL/,zzz!!!$#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!**#zzzz"UGM;!WWB/z"9AZ8%fl\3$O$h=!:!=Af,!!!?,!=8u2$3:/6 + #64o2!!!$,!!EH/!3$3L86!=8u2$3:>2#Qk&0#lk;5#7LV;z$P!@B!=oS@"pYV@!!NN+ + !!*E,"9S]0!sJZ-#mUk>"98]."q(P6!!!3("onW'!"/l/zz!!E<2zz!s];=!!!-1"U"f*"T\W)":"o, + zzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzz!!!'+!"/f.$j$G: + !!!!+!rr<)"98E0!5!!!0*!!Ni:zzzz!!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!*'"zzzz!!!!.%fce7$k!(?!!!-&!X]#0!!NK*!"/f3!!EB/!=Af,!!!E."onW'!!ro2!!!!)%L2t6 + !!!0+!!!$,!!EH*!"'2@!<`B&$4[%@#n$bAzzzzz!!!35%L2t6!"&`,!!<3$#S$q:!!NK*!!NK* + "qCn=zzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzz!!39'!!`uA + $4[7D!!WoA$4[+F#m^M2%fm1B%KQ_:%KZV=%h&II$31&+$3:M7#7:k?"TSN3!!rr3#6>86"9S]0 + !t##2!=Sr7$3pkA!"Ar1zzzzz!!!B-#n$_5%06G/%L2tB!=Af,#mC;/#m^M2$3:D;zzzz!!!$"zzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzz!!!!(#mUG1!"/f.$O.%B!<`B(!=/i0 + !<`B-#lt24"Teo8!>G5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$# + !#6=i6zzzz!!!H1%1NCKzz!!Ni>!!!?,$igV8!rr<$!!!*%$igM5$NL51%L2t6 + zzz!!!!"zzzz!!!$#zzz!!!!(%LWUR!!!!)"onW'z!!`r5zzzz!!!65zzzz!!rZ5#6=i6#ltA5zzzz + !"T);#R(M7zz$3:80!"8r:!"8l/"onW'!!E<0!!!<.!!`f2$ig8-zzz!!!$#zzzzzzzzzzzzzzzzzzz + zzzzzzzzzz!!!!6(B=F8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzz!!!!, + !<<6)!!!9+zz#6P>6zzzz!!`T6zzzz!"8l:!"&`,!W`]0zzzz!!!N1!=Sr.z!!!!+!=o/1!!!B; + !"/l0$ig8-$j-M7!!!$-!!!-&"onW'zzz!!!$#zzzz!!*'"zzz!!!3($k!(?!"'&5zz#Qt,-zzzz + !!i]-zzzz!!*E,$ipb:%LN19zzzz!!`N*$31&+z!!!'$%0-A.!!Wl4"p4l5!!!!(#ltD6!!NK*!"/f8 + zzzz!!!$"zzzzzz!!**$!G@!!!!!&$NUG3!!*H-$P!FBzzzz!!!$"zzzz + !<<*"zzz!!`u@$4[%?#QOi)!!36'$4@:D!0$NL/:"98K( + $O-VB#6PD8!=Jl-!!!!$%0-Y?#7_.B"Tn`5!=Sr8!<<<)"98c0$k!OH"p4r-!W`E(#m(),!!EE)zz + "p"l-z!!!!,$46e5 + !"K#4!!!9,!!!K3!!!!!$-!"8l4!!!*(!!WH3%1*"7!!!!"$NL/,!"T)8!!!!,!>8!!!3(!Hz + !!*H-!!!!0!!=&f0"98c=#7CP>!"B)3$NpG6%L<%7zzz!!`f2":"o3 + !=Af6%0-A3%L2tE!=Sr5!=Af,#QY84zzzz!!!$"zzz!!!$"zzzz!!!!+$NL/8!"TS]3 + $3C58!!!H<"q(G4$4[@I!"&r7#RUb9!!!04!WWW>"V(q@$kERD%0-n>%fc\<#7LVA"p"l-%h8gG + #ljr3!s\f+zzz!!E<+!WW3,"TST1!!!?,$igM5$31&4#QOi3!=/o1zzzz!!*'"zzz!!!!"!<<*"zzzz + #7_+K%KHJ/#R18/z!!!65zzzz!!!!(%0-A.zzz!!!<+$3pS4$jcqAzzzz!!!N1$4$eAzzzzzzzzzz + %fl_3!!!97!!!0'"98E%!!WH6#6588"oo#3"TSN&zzzz!!!$#zzzzzzzzzzzzzzzzzzzzz!!!$"zzzz + !!!?5!!!!(#lt>;%0Zb=#65#1$3:/."oo#3%LWaR!"/f.%L`=C!$igA1$4?k8!rr<$z$NUY9z!"'#5!:"onu;zz!!i]-zzzz + !!!9-zzzz!!!$,!"8l:!"K>9zzzz!!!6)!=Af,zzzzzzzzz!!!!-!1!2!=Af8!=Sr1#mUk>$3gM=!!NB-#6P&.":G20 + !"/l/z!"T)8$3:PF!<`B0!=f/2%flnB!=Sr2"TSN0$NL/,z!"8l/!86!Y,MDzzz!!!!'!=Sr/$NL/6!rr<$!!!3($igJ4!WWN,zz$ipP4!!!-( + !!!-1%fm%?zzzzzz!:!!NK*!!*H-!!EB(!!"U"f*!=Jl-"9SW(!sB,8!WW3# + !!NK*!!!!(!=Af,!!30.z!!*E,$ipb:!t##.#RCk?"onW5$31,5%1WF>zz!!!'$"9JT4!!*H-!"&f. + !!30(!W`]0!"9>C$ig8-z!!!E."onW'"9SW(":P8;!;!!!!.%fcS0zzzz!"/l;!"&`,zzzzzzzzzzzzzz + zzz!!!!"zzz!!!!"zzzzzzzzzzzzzz!!!'&!<`B&!!!0,!!3H6zzzz#7(J5#7(J5zzzzzzzzzzzzzzz + zz!!!$"zzz!!!!"zzzzzz$4?h6$ipP9#QtP9%0Z_8#RUV6$31&8%L*:A!=B;C#65)9"UGG>!!!!& + %KZV=%g!=o/4#mUk>$jH_9!"TPE!XSi,#m1D4zz!!EB($NUY@!=Af,%1W@<"9SW3 + !=Sr.!!r`-zz!"T)3!!!!)%KHJ7%fchE"TSN3%L2tE!!;$k31:!!!6)%fub=!!!t>Y@"pYV@!!NN+!!NN:!!!!0*zzzzzzzzzzzzzz!!*'" + zzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzz + zzzzz!!!$"zzzzzzzzzzzzzzz!!E?'"U#57!WWQ6!=B28z$ipb:!!!!-!=Sr8!<<<)$ig80"98H1 + !"8l4zzzzzzzzzzzzzz!!*'"zzz!!*'"zzzzzzzzzzzzzzz"U>8B$OR at D!t##."9Sc1z"U+l+!!!!& + "TSN+"TSo2!!!3($OQt9!!NK*zzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzz!!!!0%0-A1 + $3gM2 + !=B8H!;"TSN3!!rr3!!rr3$NUV8#Qk&6%K["E#QOi)zzzzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzzzzz + zzzz#Qau+!!36'"9nr/":5/3!WrH($318:!',giNzzzzzzzzzzzzzzz!!!!"!)ZTj9"bzzzzzzzzz!!!!?!?Ca'`\46zzz!#?4K!ps!lgg)?9a;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!**$!&/ + $ig8-zzzzz!!!6)$31&+$3:2.$ipA5z"9Ai0#6>24!Wro;zzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzz!!!$#zzzz"9ec-"98Z5#64`(z!!30*zzzz!!!6+$NL/,zzz!!!?, + !!!0+!!300zzzzzz!!!$-!!!!,!:!!!!,!/3 + !!E<&z!!*H-!!!B-"oni2":bY:!"')7$NL/-$NLPE#QOi)zzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!!61!=8u>%0-A.!!!K;!!NQ8!59#mUqK!!NH)$3:,,"U+l1!<`B0!=T>G!X8`/!"&`7"pkM7zz!!!!E."onu4!!!3($NLP8"q:k=z!=Jl-!!!N1#64`($NU8/!B!rr<&!$NLP8!=fM<#QXu8!=Sr0!s&E0!"8r1 + !=B28!zzzzzzzzzzzzzzzzzzzzzzzzzz!!!$#!#52zzzzzzzzzzzzzzzzzzzzzzzz!!!$#!!>5A4zzzzzzzzzzzzzzzzzz!#6+I!>PS7!!!!"!)?9a;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'" + zzzzzz!;!!!!.%fcS0zz!!!!"zzzzz!!!6)!=Sr.zz!!!?1zzzzzzzzzzz!!!N1 + !WW3##S$h7$ipM9!!W`5!!`u7$NL/,!"/f2!!!H1!!!-&$31&+zzz!!!!"!<<*"zzzz!%0I%>#mCSA!=o/1z!!!3* + #n-e6#QXo*$3:5/z!s&f1%flk7$NUD2zzzz!?=Nzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!="qCY7$477H!!!!?,!=8r\A$31A9#RUS@!!;$k31:!!!'1#6k>3$ipP4!!**#zzzz + !!!92!WW3)!=Sr.%LiC@#QP5>!"8l4"p"`*!Cz!!*H-z#m:55!=K#2!"98Q8$ipP4$ipP7%L2t6zzzz!!!$"zzzzz! + !"8l4!!!*(!!WH3%1W@!!!!&"98W,$ig8;$4-e7!!30&!!j)F + "98E%zzzzz#ltG7!!!E.$igYB!!30'$31J8"oo&4"oo)5!WW3#zzzz!!7%0HS1"9Ai0zzzz!<<*"zzzzzzzzzzzzzzzzzzz + !!!$"zzzz!!!!"zzzzzz#Qau+!!36'"9o;;!<`B-!s8N'!<<*"zzzzzzz!!!!##QOi)zzzzzzzzz + !!<3$zzzzzzzzzzzzzzzzz!<<*"zzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!$"zzzz!<<*"zzz!!!-*!!!!!?.!!`Z.!WW3#zzz!!!!" + zzzzzzzzzzzzzzzzzzzz!<<*"zzzz!!*'"zzzzzzzzzz!!!$"zzzzzzz!!!!/!=Af,zzzzzzzzz + #QY)/zzzzzzzzzzzzzzzzz!!!$"zzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !<<*"zzz!!*'"zzzz#71D;#7M%A!!!!#%L31A!"&f.#QY5:!!30/!"&`2$P!@B!=oS>"onW'!!!$- + !!<60!"8l:#7_.B"Tn`-!s/Z/"TSW-!"&`7#6P&.":G20z!!!!+!zz$3L8.!!!*(!!!-1!"&`/!WWQ0!!!?.!!!<-#64`(zzzz!<<*"zzzzzzzzzzzzz + zzzzzz!<<*"zzzz!!*'"zzzzzzzzzz!!!$"zzzzzzzzzzzzz!!!B-!=Jl-!!WT,zzzzzzz$ipP4zzzz + zzzzzzzz!!!$"zzzz!<<*"zzzzzzzzzzzzzzz"9AT+!!!!0%0-A.zzzzzzzzzzzzzzzzzzzzzzzz + !<<*"zzz!!*'"zzzz!!!6-!!!!&":P;4"TS`:$jmIG$OI(=!!`N6#71D3$3:M7#7:k?$jlt7!!!$, + %0lnC!"T)@#7_%E!"&r6!s/Z/$31/1"pPPG!XSi,#m1D4z!!!!.%KHJ/!"K87!!j)8#7^n;!"BDC + !"BD:"onu;zzz + !W`K*zzz!!EW0"onW'zzzzzzzzzzzz!<<*"zzz!!!$"zzzzzzzzzzzzzzz!"/f-"9SW(#Qau+!!30*z + zzzzzzzzzzzzzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'" + zzzzzzzzzzzzzzzzzzz!!*'"zzzz!!!$"zzzzzzzzzz!!!!"zzzzzzzzzzzzz!!!66$477C"pb2/z + !!!-&"UtYG!"TSr3"ptA@!WW3#z!!WT, + $ipP4zzzzzzzzzzzz!!!$"zzzz!<<*"zzzzzzzzzzzzzzz"9AT+#6b)-!!!!-! + $ipb:z$O$P7!"8l4!!!0*!!!!#"9AN'!!30*"U>#-zzzzzzzzzzzzzz!!!$"zzz!!!!"!#mC;>!!!PS7zzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzz!#>S9',:KIzzzz)Z]s?!zzzzzzzzzzzzzzzzz!!**#zzzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*W[,Yzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!!!>!>5A4zzzz)Z]s?!/3 + !!!?,!WWW0!:"onu;zz!!i]-zzzz!!!?.z!"&f.zzzzz!!!9.zzzzzz!!!E."onW'"9SW($NgD%0-A6!#64`2$NUV8!!*H-$P!FBzzzz + z!!!!"zzzz!!!$"zzzz!!!66$477C"pb2/!!!'&!=B2D!1!#ltPC%1*%<$k<:F!!EH/!"TSl3!!iT3#64f+$NLM7 + "q(nF!W`f?!!sJZ4%L2tB"98E%z!!!$#!!!!<1!=Jl-!"98]."q(P6zz$ipA0!2"pGD9"oo&4!"onZ3!!!$-#7_%?zzzzzz!!*'"zzz!!!!"zzzzz!!!!'#QP86"pG86#lt>:!!NK* + !!*H-!!EB(!!$ipP4$ipP@!=]#/zzzzz!!*'"zzzzzz!!!$#zz!"U"f*!=Jl-"9SW(!sB,8!WW3#!"&f. + z$3L80!=Af,!!!?.!!!!"$31J8$igY9!!EH*!"'2@!<`B&$4[%@#n$bAzz!"8l4!!!!%!rr!=T;8!!!6)$31G7!X\r8!!`i>!=T;C!=Jl2"TSZ+$igS@#71S7%06M1zz!"/f3!Y,P;%1W@< + #6>/3"p#):#mC;/!"Ar5zz!!`N3!!!!+!R!<<*"zzzzzzzzzzzzz + !!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!*!$'@!>c=Jzzzzzzzzzzzz!"fbTzz!!!!"!<<*"zzzz + !!!$#!?(\zzzzz + zzzzz!#67d!7%0HS1"9Ai0zzzzzz!!*'"zzzzzz!!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!!"!<<*"zzzzz!!!3($k!(?!"'&5zz#Qt,-zzzz!"&f.zzzz!"&f.!!i`.zzzzzz!"&f.!!!!$ + "98E)!tGP9!!!?.!rr<.!rr<*!<`B&zzzzzz! + !!!?.!!`Z.!WW3#zzzzzz!<<*"zzzzzz!!!$#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzz + zzz!"/f.$NLG:z$3^D<"98T.!"K#4!!!9,!!!K3!!ET.$3:A=!rr<$!!30%"98T3!!N]0$3:>:!zz$3L8.!!!*(!!!-1!"&`/!WWQ0!!!?.!!!<-#64`(zzzzzz!!*'"zzzzzz!!!!" + !<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzzz!!!!+$NL/8! + Q + 255 G + 629.996 5730 720 270 re + f* + 5220 4680 450 450 re + f* + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 7850 5920 V -56 5927 7913 7 v 1477 6262 + a Fj(Figure)59 b(7:)80 b Fm(CBU)55 b(graphs)h(of)f(term)-5 + b(b)5 b(o)-5 b(x)56 b(and)g(netb)5 b(o)-5 b(x)55 b(link)-5 + b(ed)55 b(lists)i(in)e(t)-5 b(w)g(olf)42 6812 y Fj(Both)62 + b(the)g(data)f(structures)h(iden)-5 b(ti\014ed)60 b(w)-5 + b(ere)62 b(global)f(in)h(nature)g(and)g(w)-5 b(ere)63 + b(recognised)d(as)i(global)f(b)-5 b(y)62 b(the)g(DSA,)-240 + 7086 y(as)80 b(sho)-5 b(wn)81 b(b)-5 b(y)80 b(the)h(presence)e(of)h(G)h + (\015ags)f(in)g(the)g(\014gure.)141 b(There)80 b(w)-5 + b(ere)81 b(no)g(lo)5 b(cal)79 b(data)h(structures)g(in)g(the)g + (\014gure)-240 7360 y(and)64 b(righ)-5 b(tly)63 b(DSA)h(did)g(not)f + (iden)-5 b(tify)63 b(an)-5 b(y)-15 b(.)90 b(This)64 b(sho)-5 + b(ws)63 b(DSA's)h(strength)f(in)g(p)5 b(erforming)63 + b(escap)5 b(e)63 b(analysis)g(for)g(the)-240 7634 y(di\013eren)-5 + b(t)47 b(data)g(structures.)74 b(None)48 b(of)f(the)g(no)5 + b(des)47 b(in)g(this)g(b)5 b(enc)-5 b(hmark)46 b(got)h(collapsed.)74 + b(This)47 b(again)g(sho)-5 b(w)g(cases)47 b(DSA's)-240 + 7908 y(strength)74 b(to)h(infer)g(t)-5 b(yp)5 b(e)74 + b(information,)j(i.e.)123 b(DSA)75 b(is)g(\014eld)f(sensitiv)-5 + b(e.)122 b(There)76 b(w)-5 b(ere)75 b(just)g(single)e(instances)h(of)g + (the)-240 8182 y(ab)5 b(o)-5 b(v)g(e)60 b(men)-5 b(tioned)59 + b(data)h(structures.)42 8456 y Ff(Metrics:)82 b Fj(N=2)-240 + 8730 y(N)55 b(as)f(men)-5 b(tioned)52 b(earlier)i(is)f(the)h(total)f + (no)h(of)g(SDSI)g(found.)78 b(In)54 b(the)g(mcf)f(co)5 + b(de)54 b(there)g(are)g(are)g(t)-5 b(w)g(o)55 b(global)e(static)f(data) + -240 9004 y(structure)j(instances)e(:)78 b(one)55 b(whic)-5 + b(h)55 b(corresp)5 b(onds)55 b(to)g(the)g(main)g(data)g(structure)f + (net)-5 b(w)g(ork)56 b(an)-5 b(t)55 b(the)g(other)g(whic)-5 + b(h)55 b(acts)-240 9278 y(lik)-5 b(e)71 b(a)h(bask)-5 + b(et)72 b(con)-5 b(taining)70 b(the)i(list)f(of)h(arcs.)115 + b(The)72 b(\014gure)h(also)e(sho)-5 b(ws)72 b(that)g(the)g("arc")g + (sub-structure)e(is)i(p)5 b(oin)-5 b(ted)-240 9552 y(to)67 + b(b)5 b(oth)68 b(b)-5 b(y)67 b(the)h(no)5 b(de)67 b(sub-structure)g + (and)g(the)h(net)-5 b(w)g(ork)67 b(data)g(structure.)101 + b(Though)68 b(this)f(example)f(sho)-5 b(ws)68 b(DSA's)-240 + 9826 y(strength)60 b(of)h(b)5 b(eing)61 b(\014eld-sensitiv)-5 + b(e)58 b(it)i(also)h(presen)-5 b(ts)60 b(one)h(of)g(its)f(w)-5 + b(eaknesses.)82 b(Due)61 b(to)g(the)g("uni\014cation")e(prop)5 + b(ert)-5 b(y)-240 10099 y(of)53 b(the)g(DSA)h(t)-5 b(w)g(o)53 + b(distinct)f(instances)g(of)h(the)g("arc")g(structure)g(\(net)g + Fi(!)g Fj(arcs)g(and)h(net)f Fi(!)g Fj(dumm)-5 b(y-arcs\))52 + b(are)h(sho)-5 b(w)g(ed)-240 10373 y(as)60 b(one)h(no)5 + b(de)60 b(in)g(the)g(\014gure.)-240 10647 y(G=2)-240 + 10921 y(Both)g(the)g(SDSIs)g(are)h(correctly)e(depicted)g(as)i(b)5 + b(eing)60 b(global.)3809 11672 y(15)p eop end + %%Page: 16 16 + TeXDict begin 16 15 bop -56 -99 7913 7 v -56 5527 7 5626 + v 0 5477 a @beginspecial 17 @llx 336 @lly 559 @urx 720 + @ury 4680 @rwi @setspecial + %%BeginDocument: Figures/twolf_cbu4.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 17 336 559 720 + %%HiResBoundingBox: 17.999219 336.700000 558.719141 720.000000 + %................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/11/29 13:05:04 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{< + ]setcolorspace[0 255]false @X + IC + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**$!/2zz!!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzz!s&N)zz!!!!)#ljr*zzzzzzzzzzz$3^P4!!E<.zzz + !!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!**#zzzz!!!0*zz!!!!,$jcn6zzzzzzzzzzz"9Ar3!!!!*%0-A.zz!!!!"zzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzz!"/l0":bD?"p4l. + $NU8/#7(>2!s&E0!"T)2"onW'!!!3(!=T2<$3L\;"9f,5%L)q7$jR+?!=8`,!=/l1z!"9#2zzzzz + !1":5&.z!!`N3zzzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!!!!"!<<*"zz!!!!%$jcn6!"8u1!"T/3#mC;6%fcS1#lkA7!2!=8`,"98E%z!!!-(!<`B0"onW/!=&T)!!EB)"98E4"pb\=zz"U,86!!!B-%KHJ/z + zz!,7 + "onu7!!NB-zz!!!!'$31&+zzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzzz!!!!0!Xf)2$31&+!!E]:!!!!+"onW(#ljr*zz + "pt>1zzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!<<*"zzzzzzzz!!!!*"98Q5$O$Y5!!!B6!=T56$3gJ1!=8`+zz!!Wc1zzzzzzzz + !!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!*'"zzzzzzzz!!!!($31&1$31J=z!!`i7!"&o1!!*B+zz!!!31zzzzzzzz!!!$"zzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzzzzz%gN(7 + ":PYA"98E%#m:5;!</!!!62"q(qKzzzzz#6>&0!!!!*$ig8-zz!!r`. + !=B8B#lt&2z!!`N*$3:/.!;":khAzz!!E<,!!!95"98].!=&T)!!!3("98E("oo#5!=/Z*zzzz!):!=&T-"98E%z!!!N6z + zzz!!!!%$ig8-!!!'$#64`(zzzz!!4zzzz!!!$"zzzzzzzzzzzzz!<<*"zzzz"pt>="oo#5$NL/,z!!E]1zzzz!!!'$ + #64`(zzzzz$Od=Az!!!9*#64`(!"TD:zzzz!!!!$!=Af,z!!!!,$j-J0!!!!0!!!33"Ub;1!!E]= + !!!-1!!!6)"onW'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzz!!!$#zzzz!"/r5"9ec1%fcS0!"/l0":bnB!#ljr9!=T&7!!Wc;!=T#0#6Ou-"98i2!=&W+#n$b:$j6S2%06SB + $46b>!=/Z*!!!3(!WW3#z#7:Y=$NL/0#lt>4!"&o1!Wri=zzzz!!!!"!<<*"zzzzzzzzzzzz!!=9)8$ipA0#m^P4#64l-!!=T26!=Af8 + !=/l$3:P:!!!N1!=Af2!&0 + !!!!*$ig8-z!!!!-!<<*"z!!`i:!=8`+!t,,9!!!?,!9!"&i/$NU\: + #n71A$ig8.#lk88#6Fo8#QY,0$3L84$j$YB$3184$O?b;!"T)8#mLA0!!`N0zz!!WH0zz"pbPE!!!<. + ":P81"9AN(%fu_2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!<<*"zzzzz"9\]/!=T29$jcn6!"&o1!!*B+!!Wi3!"9&>!=]#/!!!-1z!!iT1 + !"TD:!!*3&$3gJ1!!*B+"U"f*!sS`0$31&/!=]&2!!!*'!!3<+"98E%zzzzz$ip>.!!!$#!=T2? + !!,2#lt85%KHJ/!!iT1z":PS:!!!-(!!`N7!"TG;":P81!=8`.%KHJ/!!iT1!!Wi3"pt>1 + "9Al2"98E3!=K8;!tPA3zzz!!!3(#QOi)$3:/.#6kGC!=8`7$Npk)1!!!!%$ig8-!!!9*#652:!WiB.!"&o1!!!$+#6>,2 + !"&o1"pt>1#lt>5#64`.$ig81!=]#/zzzzz!"T)9z!s8N.$31A5#RUe:!=8`+$3gJ;"U>#-zzzz + !!!!"zzzzzzzzzzzz!!!!"zzzzzz"p+c3"pb52%KQS5!!E]1!"&o1!!`N2!!rZ2$j6P1!!!9*#64`( + !"0,7$jZh7!=K#@"TSl0!!E]1!!*B+$j6P1!!!9*#64l8!!Wc1!!rZ2!=8`+#lt82#QYD8zzz!!!!% + !<`B&!!!K0$NLA:!"92?"onc7!!!-1!!E<3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzz!"&r2#lt#1$ig84$3^D:"onW(#ljr0 + $ig89"q(G7z":P81!!!!)!=&T)$3:/1!!!?1!!!!"#n$b:!!!?:!!Wc1!!EH7!=8`+%hAXA%h8aEzzz + zz!!!H/$31&+!"'&5#7:G2"UknA!!*B+!"&o1#6bV#6>,@!!!-1!!!$+!!<`3 + !!!!)!=&T-$igJ=!!!-*$NUG3!!EH*$Ng\9#ljr*zzz#6b8=!!!!%!<<*(#QOu.$j$D3$ig81$ig80 + $k!%8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzz!!!!"zzzzz!!ET.!!iT1$4dFG!"Ar/$4d7@!<`B&%L!(D!!9#QY26!!!!*"98l3!!!K;%KHS7!WW31!=Jl.":bP8#lk>9%06M1 + "pFu2$j$YB"98W,#QOr0$NgV6%KQV2zzz!!!<+!snr-%KQP0%h/LH"UY50%L!4?%Kuh4!W`B)zzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*" + zzzz!!3Z2!!!!'!=T#9"9AN0!!E<*!="oo#5$NL/3!WW3$"98E2zzzz!!!!.!=&T)zzzzzzzzzzz + zzzzz!!!$"zzzzzzzzzzzz!!!$"zzzzzzzzzzzzzzzz!!Wc1$jH\>!t,)/z!!!!)!s&o4!!!E-z + !!!!0"ono0!WW3."98E%zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzz!!EH5"U"f8#QOi)z!<`B& + !!!K0!>5!!iu6%fln8zzzzzzzzzzzzzzzz!!!!"zzzzzzzzzzzz!!!!"zzzzzzzzzzz + zzzzz!!!-*$O$Y5%L<%7!!!3(!=T25#R1D4"98E1!!!95!=T#>!,7!=929#R:MCzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzz + zzzzzzzzzz!!!!,!t,/6!<`B&!!!$&!!!!%!<<*,$312;!!!!+"onc0!!!H/#64`(zzzzzzzzzzzzzz + zz!!*'"zzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzz$Ngb<"T\`+!!!!-"98]3!"02D$Od"A!!#eSzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!!1&-3=Rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!3!PS7zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!b_9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !!!Q2! + !<`o?!rr<$z!!!-&"onW/$j6P<"T\o0!!!!*!=Af,!sS`5!s&Z-zzzz!!!!"!<<*"zzzzzzzzzzzzzz + zzzzzzzzzzzzzzzz!!!!8)uos=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzz&/"sCzzzzzzzzzzzzzzzzzzz!!!-&%0-A.!!s)7#7LV9!!!!,!s&].!!*B+!!WH/zzzzz!!*'" + zzzz!!**#zzzz!!!!(!=/u4#64l0zz$Od=Azzzz!!!N6zz!!!!%$ig8-zzzzzzz!!!K;!"TD:zzzz + !!!!$!=Af,!"/f."98E%z!!!'$%KHJ/!!`u6!"98Cz$4I+=!"&o1!!rZ4zzzzz!!**#zzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzz(`EASzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzz!#ZdWzzzzzzzzzzzzzzzzzz#lt;3!!!!-"TSN&z!!`i8"Ub;1":5)8!!!$+!!rf>zzzzz!!!$#zz + zz!!!$"zzzzz$O$Y9"TSc#6!.z!!!!-$O$_7!!W]9"onW1!/3!!!9*!?$ig80"onf0!!iT2!!*B+!"TS?!"KD;"pt>1"9Ar4!WW3&!rrB+ + !sAT(zzzzz!"8l.!!!!"!2$3gJ1$3ge;"98E%zzzzz!!**#zzzzz!)1!!!!%$ig87 + "onW0$3:J6":P81$3gJ?!t,58$NL26!!!E3!!!-1!!Wc1!!rZ4!=&T)"q1J3"9Ar3zzzzz!!!N1 + #QOi)!!<<'!"8i4!<`N3!"&o1!"&o1$3^Y7zzzzz!!!!"zzzzz!%LN1:":be? + "98E3"U>>7!<`Q.$NL;;$4d7E!!!!+"TeZ0%1WOA!"9AC!=9,9$31P>!!!E/zz!!Wi3!!!!#!sAT(zzzzzzzzzzzzz!!!9*!/3"p"i-!=T;9!<`o6!2!!!!(!):!=&T-"98E%z!!!N6zzzz!!!!%$ig8-zzzzz!!E]1z!!!!%$ig8-!!!0*zzz + zzzzzzzzzzz!!!$+!!!!*!=&T2$ipV6!!!95zzzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzzzz + zzzzzzz!!!!*$jZh5#R18/zzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!!$"zzzzz!!!9*!X]G< + %0QY2!!!<+$k#4 + !s&o5#lkA6!=T57!=')C%LrmMz!Xo)1"98]0$3:55"Tnc7!s&E0!!**$#7(>2 + #6=r-z":P81!!!E3!!!30!<`B&$NgM?!!!-1!"0,7!WW3#zzzzz!!**#zzzz!<<*"zzzzz!"/r5 + "9ec1%fcS0!"/l0":bnB!#9"p4l.$NLG@!!=0&8"98E/ + #64`(z!!E<'!!=8`/ + $ig83!rrH)$NpJ:$O%"?$j-kC!<`W.#lk;5#7CqK!!W`0!!!!,!=])2":kM8$N^>0#lk>6%0?P5 + !!rf:!!ic/zz!)1#mC;6%fcS0z!!!-1z$jH\3"pbY=#lkAA":P81 + ":PM9$31&+zzzzzz!!=]#/ + !!!-1z!"T/5!!!!0%KHe9%0-_8!!*B+":P82z!!!!%$ig8- + !"9&3!!W]/$jm7E!!E]1!!E]1"9Ar3zzzzzz!!!$"zzz!!!$"zzzzzzz#7ge?!=&rB$OQnC#QP29 + !!!$+!!!33!!!E3#6>)1!!!!%$ig8-!!!'&!)1!!!!%$ig87 + "oo&7!!!33"q1J3!"9&3!!E<3z!!!!%!s&N)$3gJ1#QY/1!!!-(!<`B&":PYFzz!!!$+!!!!*!=&T2 + "98W0#6Or3zzzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzz!<<*"zzz!!*'"zzzzzz!!`i2!!Wc1$jH\3"9eo.!=8`3!=&T)$jH\:!=95>z!"&o1z + $3gJ1#6Ou1#QOi*#ljr2!='&7!WW3$"98i5!!!N?%KQe7!!NK*"9\f/$NL/,zz":PD>!<<*##ljr. + $ig8/! + #7:b;!!!!,!<`B&%06nG"To,8!#mLA7"V1S5zz!"9&3"p"]3!<`B&%Kuh4 + "q1J$31&9"Ub;?"TSN(!8!!rZ,"UG)2 + !<`B'"98Q*"98r5!<#QP86":5)0 + $ig8-#7LV;!t5M;!="oo#5$NL/,$4d+:!"Ju/!=8`+zz + !!!31!!!6)#QOi*"98E%zzzzzzzzzzzzzzzzzzz!!!!"zzzz!<<*"zzzzzzzzzzzzzzzzz!!!!+ + $NL/,$31&+zzzzzzzzzzzzzzzz!!!!-zzzzzzzzzzzzzzzz!!!$"zzz!!!$"zzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzz!!EE)zzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzzzzzzzz + !!EH5"U"f8#QOi)!!WH6z!!*3)!=fA9!=&`.$ig\:!1#6>)1!!*3&$3U>3!=&T)zzzzzzzzzzzzzzzzzz!!*'"zzz!!!$"zzzzzzzzzzzzzzzzzz + $P*7=!=f)0zzzzzzzzzzzzzzzz!!!N1$31&+zzzzzzzzzzzzzzzz!<<*"zzz!<<*"zzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzz!W`H1zzzzzzzzzzzzzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzzzzzz + zzzz!!!!,!t,/6!<`B&!!E]2$31&,#lk84#71D9!!Wi3!!Wc1!!`N1!!!$=i+!"T\r1%g)e3!W``1 + $NU_;$3^\8#Rpb6zzzzzzzzzzzzzzzzzz!!*'"zzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzz!<<*"zzz!<<*"zzzzzz!<<*"zzzzzz!<<*"zzzzz!!!!"zzzzzzz!<<*"z + zzzz!!!!"zzzzzz!!!!"zzzzzzzzzzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzzzzzzzzzz!"T,2 + !!!'/!cINz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!lL!>6"V!!!!6'c-lNz + !#lXl!!*'"z!!!$#zzzzzzzzzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzz!!!!"!,;3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**$!?2"=!"o;5 + !?;(>!!!!=!bb;zzzzzzzzzzz!!**$'*0*Rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzz!GM6 + !!!W4!!'G1b_9zzzzzzzzzz!!!!9'*/+7!?<$Yzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#lUQ!?%Fzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzz!!!!>!>>G5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + !$2.\z!"o;Nz!$)(@)?9a;&JG0G!>64Lzzzzzzzzzzz!!!!9)A<,P!?D.?zzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#lpu!SIzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!" + '`\46!!!W4&HDe2!!!u>'`\46!#bk=*$,([zzzzzzzzzzzz!!!rS'EJ4Ozzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!$3$Z!>PS7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzz!!!rX)#sX:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'H$lN + !!!!3&-)\1!!"&@(B=F8!#P_M(B=F8zzzzzzzzzzzzz!!!iS'H7#Pzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzz)]]n9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + z(_?ZIzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#5J6z()m5R!!!!6 + )#sX:!!!cG)ZTj#-zzzzzzz!!!33$P*REzzzz!!!!( + !=&T)zzzzzzzzz!!!9*!6":PM8 + "9AK&%KQP0!!`].#6>,2!!E<+#64`(z!"/f1!!!!%!"TSN&%gN(7z!!!B:zzzz!!!!,%KHJ/!!!!'zzzzz%flk:!<`B&zzzzzz + %Kuh4!!!05!"/r2#ljr*!!rZ5!!!K;!!!3("98E%zzzz!=!!rZ,!=/Z0$j6S7#65,=!4!!*B+#mCh>zzzzzz!!!!"zzzz + !!*'"zzzz!!NN+z!!!0)z!!<60#QY22z!"'&5z!!!!$$OR:B!!!!+$31&9!=/l1%KHJ/!!!-&!!!!' + !!!!"#ljr*!!<60"p"](z!=8`+!!rZ2!!rc:$31&+$4-_zzzz!!!!"!<<*"zzz!!!$#z + zzz!!!B1"9\l.#7ge7!!!'/!<`]=!!snr-%fm(@"oo&9!s&K3!!`T,!<`B2!"p55=!2"onW*%LW[P!!rf:!!ic/zz!9z!!!?5z!!!!#%fc_5!WW3#$4I.F"U,8A!s&f5!!!!% + !2!!!-/!!ic/$3gJ6!$igJ=!!!-&$NUA1!"K#;$NgJAzzzz$j6P;"onW'!=8`+!!!!'$31&7"98W-zz!!*B+!!!<+ + #64u9!!!rrZ4!!!-1#6>/3zzzzz!!!$"zzzzzzzzzzzz!!*'" + zzzzz!Y58;!!=]#/!!!-1z!"T/5!!!3(!,0#QY/1!!*B6"Tn`)zzzz!!!!"zzzz!!*'"zzzzz + !!a#7#QY/;%fuh6!s\f5"onW(#ljr0$ig89"pk;1z$3gJ1!!!!%$ig8;!t,58$NLM)1!!!!% + $ig8-!!!'&!)1!"9&?"onW.!=8`+!5$ig87"onW1!1 + "9f/6"onW+"TSo4#lt>4zz!!!B8%g!.B!"&o1!!!$+!!!N3#mL_:!"/r7"98E%z!!!!"#ljr*#lt82 + #7:G2"UknA!!*B+!!*B+%06S3zzzzzzz!<<*"zzz!<<*"zzzz!!WH0z%1!.=#QOi)#6>#/#QY22 + !!!B2!"'&5!!!!%!XK89!!!-&!WW3-$31&+!!!K:!!!!-"onc,z!!!!"#ljr*%06Y5zz!=8`+!!rZ2 + !!rc.!W`]4!!iT1!!!$+!"Ar3zzzzz!<<*"zzz!!!$"zzzzz!!!?2!!rZ+"q1J3#QkS;$3gJ1!=8`+ + "q1J3$jI.A!WW3#!"&o1z":P81#6Ou1#QOi3"onW'!=9,7"98E/%fd"@!!!N?%06b8!"TS?!Y5bE + !WW3#z!!!-1z$jH\3$ig8<"UkA2$3gJ1":P81!t5P;zzzzz!):!=&T0$3^D:"onW(#ljr3!=&T/$k!(=z":P81z!!iZ;%g<=@!!!!)"T\]1!!`N1!!!0*!t5/0 + !W`?&%h/[Hzz!!!$+!!!!*!=&T0$31&0$kE=&7$Ng_9 + %Kuh4$kE=@"onW'!!!*3!!!-&#n%.B!sT/8#7L_8"p"u0!sAu6#6557!WW3#z!!!!*!=&Z0"98N7 + !!!B-"98Z-#n$hB!!!!/!=&T)z!!!!,!<`B&!!E<(!!36&!!E<.!"/f1!"/f1!!!N1"98E%zzzzzz + !!*'"zzz!!*'"zzzz!!!B8"U"f*":kJ?!t552!WrN4!"ArA!"'5>!W`E(!"K/;#lt&0"To,4":GPI + ":"o,!!EH,#mpt=z!tPA3$NU_;$3^J4!"T\r;"TeZ0%0Qh9#ljr*"pb2=$4$Y>!!!K:"U>#-!!!6)"onc0$OHh: + !"K>9"pk8=!<`B&z!!!B-"98E%"9AQ(!WrE&"9Ac.$NUA1$NUA1!"T)5$31&1!!s/i;!3!WW31!GPK)ZTjGM6zzzzzz!!!!>+X-mdz!?IRzzzzzzzzzzzzzzz!#lXd!>J7!*F!!zzzzzzzzzzzz + zzzzzzz!&"?R!/u6,9m3izzz!!!$"zzzzzzzzzzzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzz!4!!*B+#mCh>zzzzzzzzzzzzzz + zzzzz!!*'"zzzzz$NgD3$O at 4B!!!!#"UbPB!!E]1%flb?!!30-!!E<-#mCP8!=];8#64`(!!`N6 + $OdLF!!"T)1"T\]5"9Al>!=/o6%Kle9!WWT3"98c0#6t86!!E<.#mCA8$k*+=!=8u5 + $NL/,z!!!$#!8z"UG)8 + #7(>8"9AZ-!!!0,!!30-#6>8A$k<7<#ljr*!!!?5!!E,2!!WH*":P81$3gJ1 + #6>,2#lt85%fcS0!!iT1z%Kuh4!!!!"#lk53#6YG<#lt#+!=8`3!=&T-"T\r1!!E]1!"K/4!!iT, + #6>)1!!NK-$ig8/!,@"TSN&!!!$+z%06M1!!*35"Ub;1!!!$+!!iT1 + !!!62"TSZ6!!!$+!!!!+"pt>1#lt#+!W`?'"onW+"TSo4#lt>4zz!!!B8%g!.B!!E]1!!!$+!!!N3 + #mL_:!"/r7"98E%z!!!!"#ljr*#lt82#7:G2"UknA!!*B+!!*B+%06S3zzzzzzzzzzzzzzzzzzz + !!*'"zzzzz!!!B6!!!!+"pb52$31;7#Qt;4#m1\ke:z! + '*/^G!!!$#!?IRzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!%@pL!YY8 + !5tEzzzzzzzzzzzzzzzzzzzzz + zzzzzzz!%@pL+Z18?zzzzz!#QCN!#eX&ek?[*<6'>zzz + zzzzzzzzzzzzzzzzzzzzzzzz&N1jm-ia5Izzzzz!#H:L'K.oO!!t,)/z!!!'$#64`(zzz!!!!,$jcn6z + !!!B-#ljr*zzzz!!!!,$jcn6z!!!N:zzzzzz!!!9*#64`("q1J3#n-h?!!!!)$ipS5#QY/1!"989zzz + zz!2$jlt7!!!!)!=&T) + !!Wi3!!rc:$31&+$4-_,7"pk;=!!!$+!!3<0!"/l/"q1P<$jlt= + !t,A8"oo/7#71S7zz#QXr,!:#lkD8#6YGA!!!!%$ig8. + #ljr0%fcn=!!Wc1!!E<1!<`B&%KQqF!s9&6zz!!iT1!!!!'$ig86":G57!!Wlz!=8`3 + !=&u>!=T56":P81!=8`+!W`N5$NLA,2!!rZ2!!iT8zz!!!9*#64`("q1J3#m:54"U>,0 + #QY/1#QY/9!=f)0zzzzz!!!$"zzzzzz!!!!"zzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzz!!*'"z!!!!"!<<*"zz!"BD8!!!-*!"/l8!=8`+z + !!!!)!=&T)!!Wi3!!rc.!W`]4!!iT1!!iT1!"K#2zzzzz!!!!"zzzzzzz!<<*"zzzzzzzzzzzzzzzz + !!!$#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zz!!**#zz!"0,6!!!?1#QXu6#64i/#QY26%Kuh4 + $NU_F!s&E.! + Q + cleartomark end end pagesave restore showpage + %%PageTrailer + %%Trailer + %%Pages: 1 + %%EOF + + %%EndDocument + @endspecial 7850 5527 V -56 5534 7913 7 v 821 5869 a + Fj(Figure)60 b(8:)80 b Fm(CBU)54 b(graphs)j(of)e(doubly)h(link)-5 + b(ed)56 b(lists)g(of)f(c)-5 b(hangridb)5 b(o)-5 b(x)56 + b(and)g(densit)-5 b(yb)5 b(o)-5 b(x)56 b(in)g(t)-5 b(w)g(olf)-240 + 6419 y Fj(L=0)-240 6693 y(No)61 b(lo)5 b(cal)59 b(SDSis)h(found.)-240 + 6967 y(K=)h(5)-240 7241 y(The)g(net)-5 b(w)g(ork)60 b(SDSI)g(has)h(2)f + (no)5 b(des)60 b(whereas)h(the)f(bask)-5 b(et)59 b(SDSI)i(has)f(3)g(no) + 5 b(des)60 b(in)h(it.)-240 7515 y(I=0)-240 7789 y(No)g(SDSIs)f(had)g + (greater)g(than)h(1)f(disjoin)-5 b(t)59 b(instances)g(in)h(the)g(same)f + (function.)-240 8062 y(O=0)-240 8336 y(No)i(Collapsed)e(no)5 + b(des.)-240 8610 y(C=)61 b(2)-240 8884 y(There)68 b(are)g(t)-5 + b(w)g(o)68 b(no)5 b(des)67 b(whic)-5 b(h)68 b(form)f(a)h(self)e(cycle)h + (and)h(hence)g(are)g(a)f(part)h(of)g(t)-5 b(w)g(o)68 + b(distinct)d(collections.)100 b(Both)67 b(the)-240 9158 + y(no)5 b(de)60 b(and)h(arc)f(structure)g(are)h(link)-5 + b(ed)59 b(lists)g(and)h(hence)h(are)f(sho)-5 b(wn)61 + b(as)f(self)f(lo)5 b(ops)60 b(b)-5 b(y)60 b(the)g(DSA.)-240 + 10069 y Fk(8)269 b(Results)89 b(for)i(197.parser-b)-240 + 10523 y Ff(Summary:)42 10796 y Fj(197.parser)68 b(is)g(a)h(part)g(of)f + (SPEC)h(CPU2000)f(b)5 b(enc)-5 b(hmark.)105 b(This)68 + b(link)g(grammar)g(parser)g(is)g(a)h(syn)-5 b(tactic)67 + b(parser)-240 11070 y(of)i(English,)g(based)g(on)h(link)e(grammar,)i + (an)f(original)f(theory)h(of)g(English)f(syn)-5 b(tax.)106 + b(The)69 b(co)5 b(de)69 b(is)g(written)g(in)g(ANSI)3809 + 11672 y(16)p eop end + %%Page: 17 17 + TeXDict begin 17 16 bop 10 -99 7780 7 v 10 4967 7 5067 + v 67 4917 a @beginspecial 89 @llx 422 @lly 549 @urx 720 + @ury 4600 @rwi @setspecial + %%BeginDocument: Figures/mcf_fig2.ps + %!PS-Adobe-3.0 + %%Pages: (atend) + %%BoundingBox: 89 422 549 720 + %%HiResBoundingBox: 89.999219 422.999609 548.639453 719.999609 + %................................... + %%Creator: AFPL Ghostscript 850 (pswrite) + %%CreationDate: 2005/11/29 14:54:20 + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%EndComments + %%BeginProlog + % This copyright applies to everything between here and the %%EndProlog: + % Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. + %%BeginResource: procset GS_pswrite_2_0_1001 + /GS_pswrite_2_0_1001 80 dict dup begin + /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch + 4 index eq and{ pop pop pop}{ PageSize dup 1 + 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} + { pop/setpagedevice where + { pop 1 dict dup /PageSize PageSize put setpagedevice} + { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat + setpage}if}ifelse}ifelse}ifelse} bind def + /!{bind def}bind def/#{load def}!/N/counttomark # + /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! + /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! + /w/setlinewidth #/J/setlinecap # + /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # + /m/moveto #/l/lineto #/c/rcurveto # + /p{N 2 idiv{N -2 roll rlineto}repeat}! + /P{N 0 gt{N -2 roll moveto p}if}! + /h{p closepath}!/H{P closepath}! + /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! + /re{4 -2 roll m exch dup lx exch ly neg lx h}! + /^{3 index neg 3 index neg}! + /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! + /q/gsave #/Q/grestore #/rf{re fill}! + /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! + /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! + /|{exch string readstring |=}! + /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! + /@/currentfile #/${+ @ |}! + /B{{2 copy string{readstring pop}aload pop 4 array astore cvx + 3 1 roll}repeat pop pop true}! + /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! + /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! + /Ic{exch Ix false 3 colorimage}! + /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> + /CCITTFaxDecode filter}!/FX{<